diff options
Diffstat (limited to 'net/bridge/br_multicast.c')
-rw-r--r-- | net/bridge/br_multicast.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index fd96a8dc97f4..6980625537ca 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c | |||
@@ -49,22 +49,23 @@ static struct net_bridge_mdb_entry *__br_mdb_ip_get( | |||
49 | static struct net_bridge_mdb_entry *br_mdb_ip_get( | 49 | static struct net_bridge_mdb_entry *br_mdb_ip_get( |
50 | struct net_bridge_mdb_htable *mdb, __be32 dst) | 50 | struct net_bridge_mdb_htable *mdb, __be32 dst) |
51 | { | 51 | { |
52 | if (!mdb) | ||
53 | return NULL; | ||
54 | |||
52 | return __br_mdb_ip_get(mdb, dst, br_ip_hash(mdb, dst)); | 55 | return __br_mdb_ip_get(mdb, dst, br_ip_hash(mdb, dst)); |
53 | } | 56 | } |
54 | 57 | ||
55 | struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br, | 58 | struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br, |
56 | struct sk_buff *skb) | 59 | struct sk_buff *skb) |
57 | { | 60 | { |
58 | struct net_bridge_mdb_htable *mdb = br->mdb; | 61 | if (br->multicast_disabled) |
59 | |||
60 | if (!mdb || br->multicast_disabled) | ||
61 | return NULL; | 62 | return NULL; |
62 | 63 | ||
63 | switch (skb->protocol) { | 64 | switch (skb->protocol) { |
64 | case htons(ETH_P_IP): | 65 | case htons(ETH_P_IP): |
65 | if (BR_INPUT_SKB_CB(skb)->igmp) | 66 | if (BR_INPUT_SKB_CB(skb)->igmp) |
66 | break; | 67 | break; |
67 | return br_mdb_ip_get(mdb, ip_hdr(skb)->daddr); | 68 | return br_mdb_ip_get(br->mdb, ip_hdr(skb)->daddr); |
68 | } | 69 | } |
69 | 70 | ||
70 | return NULL; | 71 | return NULL; |
@@ -851,8 +852,8 @@ static int br_multicast_query(struct net_bridge *br, | |||
851 | if (ih3->nsrcs) | 852 | if (ih3->nsrcs) |
852 | goto out; | 853 | goto out; |
853 | 854 | ||
854 | max_delay = ih3->code ? 1 : | 855 | max_delay = ih3->code ? |
855 | IGMPV3_MRC(ih3->code) * (HZ / IGMP_TIMER_SCALE); | 856 | IGMPV3_MRC(ih3->code) * (HZ / IGMP_TIMER_SCALE) : 1; |
856 | } | 857 | } |
857 | 858 | ||
858 | if (!group) | 859 | if (!group) |
@@ -990,7 +991,7 @@ static int br_multicast_ipv4_rcv(struct net_bridge *br, | |||
990 | 991 | ||
991 | err = pskb_trim_rcsum(skb2, len); | 992 | err = pskb_trim_rcsum(skb2, len); |
992 | if (err) | 993 | if (err) |
993 | return err; | 994 | goto err_out; |
994 | } | 995 | } |
995 | 996 | ||
996 | len -= ip_hdrlen(skb2); | 997 | len -= ip_hdrlen(skb2); |
@@ -1012,7 +1013,7 @@ static int br_multicast_ipv4_rcv(struct net_bridge *br, | |||
1012 | case CHECKSUM_NONE: | 1013 | case CHECKSUM_NONE: |
1013 | skb2->csum = 0; | 1014 | skb2->csum = 0; |
1014 | if (skb_checksum_complete(skb2)) | 1015 | if (skb_checksum_complete(skb2)) |
1015 | return -EINVAL; | 1016 | goto out; |
1016 | } | 1017 | } |
1017 | 1018 | ||
1018 | err = 0; | 1019 | err = 0; |
@@ -1039,6 +1040,7 @@ static int br_multicast_ipv4_rcv(struct net_bridge *br, | |||
1039 | 1040 | ||
1040 | out: | 1041 | out: |
1041 | __skb_push(skb2, offset); | 1042 | __skb_push(skb2, offset); |
1043 | err_out: | ||
1042 | if (skb2 != skb) | 1044 | if (skb2 != skb) |
1043 | kfree_skb(skb2); | 1045 | kfree_skb(skb2); |
1044 | return err; | 1046 | return err; |