]> Pileus Git - ~andy/linux/blobdiff - net/ipv4/ipip.c
ipip/rtnl: add IFLA_IPTUN_PMTUDISC on dump
[~andy/linux] / net / ipv4 / ipip.c
index 099fc1c428b419e3344b9f63cb19bacb0b5d0800..1fc0ea4786b933c8618fc39234eb5c5800a4d3ce 100644 (file)
@@ -680,29 +680,27 @@ ipip_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd)
                                        break;
                                }
                                t = netdev_priv(dev);
-                               ipip_tunnel_unlink(ipn, t);
-                               synchronize_net();
-                               t->parms.iph.saddr = p.iph.saddr;
-                               t->parms.iph.daddr = p.iph.daddr;
-                               memcpy(dev->dev_addr, &p.iph.saddr, 4);
-                               memcpy(dev->broadcast, &p.iph.daddr, 4);
-                               ipip_tunnel_link(ipn, t);
-                               netdev_state_change(dev);
                        }
+
+                       ipip_tunnel_unlink(ipn, t);
+                       synchronize_net();
+                       t->parms.iph.saddr = p.iph.saddr;
+                       t->parms.iph.daddr = p.iph.daddr;
+                       memcpy(dev->dev_addr, &p.iph.saddr, 4);
+                       memcpy(dev->broadcast, &p.iph.daddr, 4);
+                       ipip_tunnel_link(ipn, t);
+                       t->parms.iph.ttl = p.iph.ttl;
+                       t->parms.iph.tos = p.iph.tos;
+                       t->parms.iph.frag_off = p.iph.frag_off;
+                       if (t->parms.link != p.link) {
+                               t->parms.link = p.link;
+                               ipip_tunnel_bind_dev(dev);
+                       }
+                       netdev_state_change(dev);
                }
 
                if (t) {
                        err = 0;
-                       if (cmd == SIOCCHGTUNNEL) {
-                               t->parms.iph.ttl = p.iph.ttl;
-                               t->parms.iph.tos = p.iph.tos;
-                               t->parms.iph.frag_off = p.iph.frag_off;
-                               if (t->parms.link != p.link) {
-                                       t->parms.link = p.link;
-                                       ipip_tunnel_bind_dev(dev);
-                                       netdev_state_change(dev);
-                               }
-                       }
                        if (copy_to_user(ifr->ifr_ifru.ifru_data, &t->parms, sizeof(p)))
                                err = -EFAULT;
                } else
@@ -837,6 +835,8 @@ static size_t ipip_get_size(const struct net_device *dev)
                nla_total_size(1) +
                /* IFLA_IPTUN_TOS */
                nla_total_size(1) +
+               /* IFLA_IPTUN_PMTUDISC */
+               nla_total_size(1) +
                0;
 }
 
@@ -849,7 +849,9 @@ static int ipip_fill_info(struct sk_buff *skb, const struct net_device *dev)
            nla_put_be32(skb, IFLA_IPTUN_LOCAL, parm->iph.saddr) ||
            nla_put_be32(skb, IFLA_IPTUN_REMOTE, parm->iph.daddr) ||
            nla_put_u8(skb, IFLA_IPTUN_TTL, parm->iph.ttl) ||
-           nla_put_u8(skb, IFLA_IPTUN_TOS, parm->iph.tos))
+           nla_put_u8(skb, IFLA_IPTUN_TOS, parm->iph.tos) ||
+           nla_put_u8(skb, IFLA_IPTUN_PMTUDISC,
+                      !!(parm->iph.frag_off & htons(IP_DF))))
                goto nla_put_failure;
        return 0;