|
@@ -834,7 +834,7 @@ static void igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
|
|
|
int mark = 0;
|
|
|
|
|
|
|
|
|
- if (len == 8 || IGMP_V2_SEEN(in_dev)) {
|
|
|
+ if (len == 8) {
|
|
|
if (ih->code == 0) {
|
|
|
/* Alas, old v1 router presents here. */
|
|
|
|
|
@@ -856,6 +856,18 @@ static void igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
|
|
|
igmpv3_clear_delrec(in_dev);
|
|
|
} else if (len < 12) {
|
|
|
return; /* ignore bogus packet; freed by caller */
|
|
|
+ } else if (IGMP_V1_SEEN(in_dev)) {
|
|
|
+ /* This is a v3 query with v1 queriers present */
|
|
|
+ max_delay = IGMP_Query_Response_Interval;
|
|
|
+ group = 0;
|
|
|
+ } else if (IGMP_V2_SEEN(in_dev)) {
|
|
|
+ /* this is a v3 query with v2 queriers present;
|
|
|
+ * Interpretation of the max_delay code is problematic here.
|
|
|
+ * A real v2 host would use ih_code directly, while v3 has a
|
|
|
+ * different encoding. We use the v3 encoding as more likely
|
|
|
+ * to be intended in a v3 query.
|
|
|
+ */
|
|
|
+ max_delay = IGMPV3_MRC(ih3->code)*(HZ/IGMP_TIMER_SCALE);
|
|
|
} else { /* v3 */
|
|
|
if (!pskb_may_pull(skb, sizeof(struct igmpv3_query)))
|
|
|
return;
|