Commit 2e9526b352061ee0fd2a1580a2e3a5af960dabc4

Authored by Herbert Xu
Committed by David S. Miller
1 parent 33cb7d33a1

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: Herbert Xu <herbert@gondor.apana.org.au>
Acked-by: Stephen Hemminger <shemminger@vyatta.com>
Tested-by: Nathan Neulinger <nneul@mst.edu>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 1 changed file with 16 additions and 12 deletions Side-by-side Diff

... ... @@ -1464,7 +1464,7 @@
1464 1464  
1465 1465 ether_setup(dev);
1466 1466  
1467   - dev->netdev_ops = &ipgre_netdev_ops;
  1467 + dev->netdev_ops = &ipgre_tap_netdev_ops;
1468 1468 dev->destructor = free_netdev;
1469 1469  
1470 1470 dev->iflink = 0;
1471 1471  
1472 1472  
1473 1473  
1474 1474  
... ... @@ -1525,25 +1525,29 @@
1525 1525 if (t->dev != dev)
1526 1526 return -EEXIST;
1527 1527 } else {
1528   - unsigned nflags = 0;
1529   -
1530 1528 t = nt;
1531 1529  
1532   - if (ipv4_is_multicast(p.iph.daddr))
1533   - nflags = IFF_BROADCAST;
1534   - else if (p.iph.daddr)
1535   - nflags = IFF_POINTOPOINT;
  1530 + if (dev->type != ARPHRD_ETHER) {
  1531 + unsigned nflags = 0;
1536 1532  
1537   - if ((dev->flags ^ nflags) &
1538   - (IFF_POINTOPOINT | IFF_BROADCAST))
1539   - return -EINVAL;
  1533 + if (ipv4_is_multicast(p.iph.daddr))
  1534 + nflags = IFF_BROADCAST;
  1535 + else if (p.iph.daddr)
  1536 + nflags = IFF_POINTOPOINT;
1540 1537  
  1538 + if ((dev->flags ^ nflags) &
  1539 + (IFF_POINTOPOINT | IFF_BROADCAST))
  1540 + return -EINVAL;
  1541 + }
  1542 +
1541 1543 ipgre_tunnel_unlink(ign, t);
1542 1544 t->parms.iph.saddr = p.iph.saddr;
1543 1545 t->parms.iph.daddr = p.iph.daddr;
1544 1546 t->parms.i_key = p.i_key;
1545   - memcpy(dev->dev_addr, &p.iph.saddr, 4);
1546   - memcpy(dev->broadcast, &p.iph.daddr, 4);
  1547 + if (dev->type != ARPHRD_ETHER) {
  1548 + memcpy(dev->dev_addr, &p.iph.saddr, 4);
  1549 + memcpy(dev->broadcast, &p.iph.daddr, 4);
  1550 + }
1547 1551 ipgre_tunnel_link(ign, t);
1548 1552 netdev_state_change(dev);
1549 1553 }