diff options
Diffstat (limited to 'net/ipv4/ip_gre.c')
-rw-r--r-- | net/ipv4/ip_gre.c | 58 |
1 files changed, 34 insertions, 24 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 85c487b8572b..0101521f366b 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -126,8 +126,6 @@ static int ipgre_tunnel_bind_dev(struct net_device *dev); | |||
126 | 126 | ||
127 | /* Fallback tunnel: no source, no destination, no key, no options */ | 127 | /* Fallback tunnel: no source, no destination, no key, no options */ |
128 | 128 | ||
129 | static int ipgre_fb_tunnel_init(struct net_device *dev); | ||
130 | |||
131 | #define HASH_SIZE 16 | 129 | #define HASH_SIZE 16 |
132 | 130 | ||
133 | static int ipgre_net_id; | 131 | static int ipgre_net_id; |
@@ -371,7 +369,7 @@ static void ipgre_err(struct sk_buff *skb, u32 info) | |||
371 | by themself??? | 369 | by themself??? |
372 | */ | 370 | */ |
373 | 371 | ||
374 | struct iphdr *iph = (struct iphdr*)skb->data; | 372 | struct iphdr *iph = (struct iphdr *)skb->data; |
375 | __be16 *p = (__be16*)(skb->data+(iph->ihl<<2)); | 373 | __be16 *p = (__be16*)(skb->data+(iph->ihl<<2)); |
376 | int grehlen = (iph->ihl<<2) + 4; | 374 | int grehlen = (iph->ihl<<2) + 4; |
377 | const int type = icmp_hdr(skb)->type; | 375 | const int type = icmp_hdr(skb)->type; |
@@ -632,7 +630,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
632 | 630 | ||
633 | if (dev->header_ops && dev->type == ARPHRD_IPGRE) { | 631 | if (dev->header_ops && dev->type == ARPHRD_IPGRE) { |
634 | gre_hlen = 0; | 632 | gre_hlen = 0; |
635 | tiph = (struct iphdr*)skb->data; | 633 | tiph = (struct iphdr *)skb->data; |
636 | } else { | 634 | } else { |
637 | gre_hlen = tunnel->hlen; | 635 | gre_hlen = tunnel->hlen; |
638 | tiph = &tunnel->parms.iph; | 636 | tiph = &tunnel->parms.iph; |
@@ -660,7 +658,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
660 | if (neigh == NULL) | 658 | if (neigh == NULL) |
661 | goto tx_error; | 659 | goto tx_error; |
662 | 660 | ||
663 | addr6 = (struct in6_addr*)&neigh->primary_key; | 661 | addr6 = (struct in6_addr *)&neigh->primary_key; |
664 | addr_type = ipv6_addr_type(addr6); | 662 | addr_type = ipv6_addr_type(addr6); |
665 | 663 | ||
666 | if (addr_type == IPV6_ADDR_ANY) { | 664 | if (addr_type == IPV6_ADDR_ANY) { |
@@ -726,7 +724,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
726 | } | 724 | } |
727 | #ifdef CONFIG_IPV6 | 725 | #ifdef CONFIG_IPV6 |
728 | else if (skb->protocol == htons(ETH_P_IPV6)) { | 726 | else if (skb->protocol == htons(ETH_P_IPV6)) { |
729 | struct rt6_info *rt6 = (struct rt6_info*)skb->dst; | 727 | struct rt6_info *rt6 = (struct rt6_info *)skb->dst; |
730 | 728 | ||
731 | if (rt6 && mtu < dst_mtu(skb->dst) && mtu >= IPV6_MIN_MTU) { | 729 | if (rt6 && mtu < dst_mtu(skb->dst) && mtu >= IPV6_MIN_MTU) { |
732 | if ((tunnel->parms.iph.daddr && | 730 | if ((tunnel->parms.iph.daddr && |
@@ -800,7 +798,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
800 | iph->ttl = old_iph->ttl; | 798 | iph->ttl = old_iph->ttl; |
801 | #ifdef CONFIG_IPV6 | 799 | #ifdef CONFIG_IPV6 |
802 | else if (skb->protocol == htons(ETH_P_IPV6)) | 800 | else if (skb->protocol == htons(ETH_P_IPV6)) |
803 | iph->ttl = ((struct ipv6hdr*)old_iph)->hop_limit; | 801 | iph->ttl = ((struct ipv6hdr *)old_iph)->hop_limit; |
804 | #endif | 802 | #endif |
805 | else | 803 | else |
806 | iph->ttl = dst_metric(&rt->u.dst, RTAX_HOPLIMIT); | 804 | iph->ttl = dst_metric(&rt->u.dst, RTAX_HOPLIMIT); |
@@ -962,7 +960,7 @@ ipgre_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) | |||
962 | break; | 960 | break; |
963 | } | 961 | } |
964 | } else { | 962 | } else { |
965 | unsigned nflags=0; | 963 | unsigned nflags = 0; |
966 | 964 | ||
967 | t = netdev_priv(dev); | 965 | t = netdev_priv(dev); |
968 | 966 | ||
@@ -1104,7 +1102,7 @@ static int ipgre_header(struct sk_buff *skb, struct net_device *dev, | |||
1104 | 1102 | ||
1105 | static int ipgre_header_parse(const struct sk_buff *skb, unsigned char *haddr) | 1103 | static int ipgre_header_parse(const struct sk_buff *skb, unsigned char *haddr) |
1106 | { | 1104 | { |
1107 | struct iphdr *iph = (struct iphdr*) skb_mac_header(skb); | 1105 | struct iphdr *iph = (struct iphdr *) skb_mac_header(skb); |
1108 | memcpy(haddr, &iph->saddr, 4); | 1106 | memcpy(haddr, &iph->saddr, 4); |
1109 | return 4; | 1107 | return 4; |
1110 | } | 1108 | } |
@@ -1142,6 +1140,7 @@ static int ipgre_open(struct net_device *dev) | |||
1142 | static int ipgre_close(struct net_device *dev) | 1140 | static int ipgre_close(struct net_device *dev) |
1143 | { | 1141 | { |
1144 | struct ip_tunnel *t = netdev_priv(dev); | 1142 | struct ip_tunnel *t = netdev_priv(dev); |
1143 | |||
1145 | if (ipv4_is_multicast(t->parms.iph.daddr) && t->mlink) { | 1144 | if (ipv4_is_multicast(t->parms.iph.daddr) && t->mlink) { |
1146 | struct in_device *in_dev; | 1145 | struct in_device *in_dev; |
1147 | in_dev = inetdev_by_index(dev_net(dev), t->mlink); | 1146 | in_dev = inetdev_by_index(dev_net(dev), t->mlink); |
@@ -1155,14 +1154,22 @@ static int ipgre_close(struct net_device *dev) | |||
1155 | 1154 | ||
1156 | #endif | 1155 | #endif |
1157 | 1156 | ||
1157 | static const struct net_device_ops ipgre_netdev_ops = { | ||
1158 | .ndo_init = ipgre_tunnel_init, | ||
1159 | .ndo_uninit = ipgre_tunnel_uninit, | ||
1160 | #ifdef CONFIG_NET_IPGRE_BROADCAST | ||
1161 | .ndo_open = ipgre_open, | ||
1162 | .ndo_stop = ipgre_close, | ||
1163 | #endif | ||
1164 | .ndo_start_xmit = ipgre_tunnel_xmit, | ||
1165 | .ndo_do_ioctl = ipgre_tunnel_ioctl, | ||
1166 | .ndo_change_mtu = ipgre_tunnel_change_mtu, | ||
1167 | }; | ||
1168 | |||
1158 | static void ipgre_tunnel_setup(struct net_device *dev) | 1169 | static void ipgre_tunnel_setup(struct net_device *dev) |
1159 | { | 1170 | { |
1160 | dev->init = ipgre_tunnel_init; | 1171 | dev->netdev_ops = &ipgre_netdev_ops; |
1161 | dev->uninit = ipgre_tunnel_uninit; | ||
1162 | dev->destructor = free_netdev; | 1172 | dev->destructor = free_netdev; |
1163 | dev->hard_start_xmit = ipgre_tunnel_xmit; | ||
1164 | dev->do_ioctl = ipgre_tunnel_ioctl; | ||
1165 | dev->change_mtu = ipgre_tunnel_change_mtu; | ||
1166 | 1173 | ||
1167 | dev->type = ARPHRD_IPGRE; | 1174 | dev->type = ARPHRD_IPGRE; |
1168 | dev->needed_headroom = LL_MAX_HEADER + sizeof(struct iphdr) + 4; | 1175 | dev->needed_headroom = LL_MAX_HEADER + sizeof(struct iphdr) + 4; |
@@ -1194,8 +1201,6 @@ static int ipgre_tunnel_init(struct net_device *dev) | |||
1194 | return -EINVAL; | 1201 | return -EINVAL; |
1195 | dev->flags = IFF_BROADCAST; | 1202 | dev->flags = IFF_BROADCAST; |
1196 | dev->header_ops = &ipgre_header_ops; | 1203 | dev->header_ops = &ipgre_header_ops; |
1197 | dev->open = ipgre_open; | ||
1198 | dev->stop = ipgre_close; | ||
1199 | } | 1204 | } |
1200 | #endif | 1205 | #endif |
1201 | } else | 1206 | } else |
@@ -1204,7 +1209,7 @@ static int ipgre_tunnel_init(struct net_device *dev) | |||
1204 | return 0; | 1209 | return 0; |
1205 | } | 1210 | } |
1206 | 1211 | ||
1207 | static int ipgre_fb_tunnel_init(struct net_device *dev) | 1212 | static void ipgre_fb_tunnel_init(struct net_device *dev) |
1208 | { | 1213 | { |
1209 | struct ip_tunnel *tunnel = netdev_priv(dev); | 1214 | struct ip_tunnel *tunnel = netdev_priv(dev); |
1210 | struct iphdr *iph = &tunnel->parms.iph; | 1215 | struct iphdr *iph = &tunnel->parms.iph; |
@@ -1220,7 +1225,6 @@ static int ipgre_fb_tunnel_init(struct net_device *dev) | |||
1220 | 1225 | ||
1221 | dev_hold(dev); | 1226 | dev_hold(dev); |
1222 | ign->tunnels_wc[0] = tunnel; | 1227 | ign->tunnels_wc[0] = tunnel; |
1223 | return 0; | ||
1224 | } | 1228 | } |
1225 | 1229 | ||
1226 | 1230 | ||
@@ -1264,9 +1268,9 @@ static int ipgre_init_net(struct net *net) | |||
1264 | err = -ENOMEM; | 1268 | err = -ENOMEM; |
1265 | goto err_alloc_dev; | 1269 | goto err_alloc_dev; |
1266 | } | 1270 | } |
1267 | |||
1268 | ign->fb_tunnel_dev->init = ipgre_fb_tunnel_init; | ||
1269 | dev_net_set(ign->fb_tunnel_dev, net); | 1271 | dev_net_set(ign->fb_tunnel_dev, net); |
1272 | |||
1273 | ipgre_fb_tunnel_init(ign->fb_tunnel_dev); | ||
1270 | ign->fb_tunnel_dev->rtnl_link_ops = &ipgre_link_ops; | 1274 | ign->fb_tunnel_dev->rtnl_link_ops = &ipgre_link_ops; |
1271 | 1275 | ||
1272 | if ((err = register_netdev(ign->fb_tunnel_dev))) | 1276 | if ((err = register_netdev(ign->fb_tunnel_dev))) |
@@ -1397,16 +1401,22 @@ static int ipgre_tap_init(struct net_device *dev) | |||
1397 | return 0; | 1401 | return 0; |
1398 | } | 1402 | } |
1399 | 1403 | ||
1404 | static const struct net_device_ops ipgre_tap_netdev_ops = { | ||
1405 | .ndo_init = ipgre_tap_init, | ||
1406 | .ndo_uninit = ipgre_tunnel_uninit, | ||
1407 | .ndo_start_xmit = ipgre_tunnel_xmit, | ||
1408 | .ndo_set_mac_address = eth_mac_addr, | ||
1409 | .ndo_validate_addr = eth_validate_addr, | ||
1410 | .ndo_change_mtu = ipgre_tunnel_change_mtu, | ||
1411 | }; | ||
1412 | |||
1400 | static void ipgre_tap_setup(struct net_device *dev) | 1413 | static void ipgre_tap_setup(struct net_device *dev) |
1401 | { | 1414 | { |
1402 | 1415 | ||
1403 | ether_setup(dev); | 1416 | ether_setup(dev); |
1404 | 1417 | ||
1405 | dev->init = ipgre_tap_init; | 1418 | dev->netdev_ops = &ipgre_netdev_ops; |
1406 | dev->uninit = ipgre_tunnel_uninit; | ||
1407 | dev->destructor = free_netdev; | 1419 | dev->destructor = free_netdev; |
1408 | dev->hard_start_xmit = ipgre_tunnel_xmit; | ||
1409 | dev->change_mtu = ipgre_tunnel_change_mtu; | ||
1410 | 1420 | ||
1411 | dev->iflink = 0; | 1421 | dev->iflink = 0; |
1412 | dev->features |= NETIF_F_NETNS_LOCAL; | 1422 | dev->features |= NETIF_F_NETNS_LOCAL; |