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 --- |