.. | .. |
---|
1094 | 1094 | |
---|
1095 | 1095 | static void ipip6_tunnel_bind_dev(struct net_device *dev) |
---|
1096 | 1096 | { |
---|
| 1097 | + struct ip_tunnel *tunnel = netdev_priv(dev); |
---|
| 1098 | + int t_hlen = tunnel->hlen + sizeof(struct iphdr); |
---|
1097 | 1099 | struct net_device *tdev = NULL; |
---|
1098 | | - struct ip_tunnel *tunnel; |
---|
| 1100 | + int hlen = LL_MAX_HEADER; |
---|
1099 | 1101 | const struct iphdr *iph; |
---|
1100 | 1102 | struct flowi4 fl4; |
---|
1101 | 1103 | |
---|
1102 | | - tunnel = netdev_priv(dev); |
---|
1103 | 1104 | iph = &tunnel->parms.iph; |
---|
1104 | 1105 | |
---|
1105 | 1106 | if (iph->daddr) { |
---|
.. | .. |
---|
1122 | 1123 | tdev = __dev_get_by_index(tunnel->net, tunnel->parms.link); |
---|
1123 | 1124 | |
---|
1124 | 1125 | if (tdev && !netif_is_l3_master(tdev)) { |
---|
1125 | | - int t_hlen = tunnel->hlen + sizeof(struct iphdr); |
---|
1126 | 1126 | int mtu; |
---|
1127 | 1127 | |
---|
1128 | 1128 | mtu = tdev->mtu - t_hlen; |
---|
1129 | 1129 | if (mtu < IPV6_MIN_MTU) |
---|
1130 | 1130 | mtu = IPV6_MIN_MTU; |
---|
1131 | 1131 | WRITE_ONCE(dev->mtu, mtu); |
---|
| 1132 | + hlen = tdev->hard_header_len + tdev->needed_headroom; |
---|
1132 | 1133 | } |
---|
| 1134 | + dev->needed_headroom = t_hlen + hlen; |
---|
1133 | 1135 | } |
---|
1134 | 1136 | |
---|
1135 | 1137 | static void ipip6_tunnel_update(struct ip_tunnel *t, struct ip_tunnel_parm *p, |
---|