br_multicast.c (0ba8c9ec25465cd0680b80c0f5836f558e3b972d) br_multicast.c (8440853bb70010f2f8edc26cb0f7af60da8b2c5a)
1/*
2 * Bridge multicast support.
3 *
4 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; either version 2 of the License, or (at your option)

--- 977 unchanged lines hidden (view full) ---

986
987 if (skb->len > len) {
988 skb2 = skb_clone(skb, GFP_ATOMIC);
989 if (!skb2)
990 return -ENOMEM;
991
992 err = pskb_trim_rcsum(skb2, len);
993 if (err)
1/*
2 * Bridge multicast support.
3 *
4 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; either version 2 of the License, or (at your option)

--- 977 unchanged lines hidden (view full) ---

986
987 if (skb->len > len) {
988 skb2 = skb_clone(skb, GFP_ATOMIC);
989 if (!skb2)
990 return -ENOMEM;
991
992 err = pskb_trim_rcsum(skb2, len);
993 if (err)
994 return err;
994 goto err_out;
995 }
996
997 len -= ip_hdrlen(skb2);
998 offset = skb_network_offset(skb2) + ip_hdrlen(skb2);
999 __skb_pull(skb2, offset);
1000 skb_reset_transport_header(skb2);
1001
1002 err = -EINVAL;

--- 5 unchanged lines hidden (view full) ---

1008 switch (skb2->ip_summed) {
1009 case CHECKSUM_COMPLETE:
1010 if (!csum_fold(skb2->csum))
1011 break;
1012 /* fall through */
1013 case CHECKSUM_NONE:
1014 skb2->csum = 0;
1015 if (skb_checksum_complete(skb2))
995 }
996
997 len -= ip_hdrlen(skb2);
998 offset = skb_network_offset(skb2) + ip_hdrlen(skb2);
999 __skb_pull(skb2, offset);
1000 skb_reset_transport_header(skb2);
1001
1002 err = -EINVAL;

--- 5 unchanged lines hidden (view full) ---

1008 switch (skb2->ip_summed) {
1009 case CHECKSUM_COMPLETE:
1010 if (!csum_fold(skb2->csum))
1011 break;
1012 /* fall through */
1013 case CHECKSUM_NONE:
1014 skb2->csum = 0;
1015 if (skb_checksum_complete(skb2))
1016 return -EINVAL;
1016 goto out;
1017 }
1018
1019 err = 0;
1020
1021 BR_INPUT_SKB_CB(skb)->igmp = 1;
1022 ih = igmp_hdr(skb2);
1023
1024 switch (ih->type) {

--- 10 unchanged lines hidden (view full) ---

1035 break;
1036 case IGMP_HOST_LEAVE_MESSAGE:
1037 br_multicast_leave_group(br, port, ih->group);
1038 break;
1039 }
1040
1041out:
1042 __skb_push(skb2, offset);
1017 }
1018
1019 err = 0;
1020
1021 BR_INPUT_SKB_CB(skb)->igmp = 1;
1022 ih = igmp_hdr(skb2);
1023
1024 switch (ih->type) {

--- 10 unchanged lines hidden (view full) ---

1035 break;
1036 case IGMP_HOST_LEAVE_MESSAGE:
1037 br_multicast_leave_group(br, port, ih->group);
1038 break;
1039 }
1040
1041out:
1042 __skb_push(skb2, offset);
1043err_out:
1043 if (skb2 != skb)
1044 kfree_skb(skb2);
1045 return err;
1046}
1047
1048int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port,
1049 struct sk_buff *skb)
1050{

--- 258 unchanged lines hidden ---
1044 if (skb2 != skb)
1045 kfree_skb(skb2);
1046 return err;
1047}
1048
1049int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port,
1050 struct sk_buff *skb)
1051{

--- 258 unchanged lines hidden ---