net: ipv4: route: Fix sending IGMP messages with link address
authorAndrew Lunn <andrew@lunn.ch>
Fri, 1 May 2015 14:39:54 +0000 (16:39 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 4 May 2015 04:04:08 +0000 (00:04 -0400)
In setups with a global scope address on an interface, and a lesser
scope address on an interface sending IGMP reports, the reports can be
sent using the other interfaces global scope address rather than the
local interface address. RFC 2236 suggests:

     Ignore the Report if you cannot identify the source address of
     the packet as belonging to a subnet assigned to the interface on
     which the packet was received.

since such reports could be forged.

Look at the protocol when deciding if a RT_SCOPE_LINK address should
be used for the packet.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/route.c

index 7cad0bf1c71cbc763cffe72edd9c8f84a242fcc3..9e15f5ca4495df8a59b22f91dc399b45284015d5 100644 (file)
@@ -2091,7 +2091,8 @@ struct rtable *__ip_route_output_key(struct net *net, struct flowi4 *fl4)
                        goto out;
                }
                if (ipv4_is_local_multicast(fl4->daddr) ||
-                   ipv4_is_lbcast(fl4->daddr)) {
+                   ipv4_is_lbcast(fl4->daddr) ||
+                   fl4->flowi4_proto == IPPROTO_IGMP) {
                        if (!fl4->saddr)
                                fl4->saddr = inet_select_addr(dev_out, 0,
                                                              RT_SCOPE_LINK);