Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2e9526b3 authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller
Browse files

gre: Fix dev_addr clobbering for gretap



Nathan Neulinger noticed that gretap devices get their MAC address
from the local IP address, which results in invalid MAC addresses
half of the time.

This is because gretap is still using the tunnel netdev ops rather
than the correct tap netdev ops struct.

This patch also fixes changelink to not clobber the MAC address
for the gretap case.

Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Acked-by: default avatarStephen Hemminger <shemminger@vyatta.com>
Tested-by: default avatarNathan Neulinger <nneul@mst.edu>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 33cb7d33
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -1464,7 +1464,7 @@ static void ipgre_tap_setup(struct net_device *dev)

	ether_setup(dev);

	dev->netdev_ops		= &ipgre_netdev_ops;
	dev->netdev_ops		= &ipgre_tap_netdev_ops;
	dev->destructor 	= free_netdev;

	dev->iflink		= 0;
@@ -1525,10 +1525,11 @@ static int ipgre_changelink(struct net_device *dev, struct nlattr *tb[],
		if (t->dev != dev)
			return -EEXIST;
	} else {
		unsigned nflags = 0;

		t = nt;

		if (dev->type != ARPHRD_ETHER) {
			unsigned nflags = 0;

			if (ipv4_is_multicast(p.iph.daddr))
				nflags = IFF_BROADCAST;
			else if (p.iph.daddr)
@@ -1537,13 +1538,16 @@ static int ipgre_changelink(struct net_device *dev, struct nlattr *tb[],
			if ((dev->flags ^ nflags) &
			    (IFF_POINTOPOINT | IFF_BROADCAST))
				return -EINVAL;
		}

		ipgre_tunnel_unlink(ign, t);
		t->parms.iph.saddr = p.iph.saddr;
		t->parms.iph.daddr = p.iph.daddr;
		t->parms.i_key = p.i_key;
		if (dev->type != ARPHRD_ETHER) {
			memcpy(dev->dev_addr, &p.iph.saddr, 4);
			memcpy(dev->broadcast, &p.iph.daddr, 4);
		}
		ipgre_tunnel_link(ign, t);
		netdev_state_change(dev);
	}