···166166config NET_IPIP167167 tristate "IP: tunneling"168168 select INET_TUNNEL169169+ select NET_IP_TUNNEL169170 ---help---170171 Tunneling means encapsulating data of one protocol type within171172 another protocol and sending it over a channel that understands the
+56-690
net/ipv4/ipip.c
···117117#include <net/net_namespace.h>118118#include <net/netns/generic.h>119119120120-#define HASH_SIZE 16121121-#define HASH(addr) (((__force u32)addr^((__force u32)addr>>4))&0xF)122122-123120static bool log_ecn_error = true;124121module_param(log_ecn_error, bool, 0644);125122MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN");126123127124static int ipip_net_id __read_mostly;128128-struct ipip_net {129129- struct ip_tunnel __rcu *tunnels_r_l[HASH_SIZE];130130- struct ip_tunnel __rcu *tunnels_r[HASH_SIZE];131131- struct ip_tunnel __rcu *tunnels_l[HASH_SIZE];132132- struct ip_tunnel __rcu *tunnels_wc[1];133133- struct ip_tunnel __rcu **tunnels[4];134134-135135- struct net_device *fb_tunnel_dev;136136-};137125138126static int ipip_tunnel_init(struct net_device *dev);139139-static void ipip_tunnel_setup(struct net_device *dev);140140-static void ipip_dev_free(struct net_device *dev);141127static struct rtnl_link_ops ipip_link_ops __read_mostly;142142-143143-static struct rtnl_link_stats64 *ipip_get_stats64(struct net_device *dev,144144- struct rtnl_link_stats64 *tot)145145-{146146- int i;147147-148148- for_each_possible_cpu(i) {149149- const struct pcpu_tstats *tstats = per_cpu_ptr(dev->tstats, i);150150- u64 rx_packets, rx_bytes, tx_packets, tx_bytes;151151- unsigned int start;152152-153153- do {154154- start = u64_stats_fetch_begin_bh(&tstats->syncp);155155- rx_packets = tstats->rx_packets;156156- tx_packets = tstats->tx_packets;157157- rx_bytes = tstats->rx_bytes;158158- tx_bytes = tstats->tx_bytes;159159- } while (u64_stats_fetch_retry_bh(&tstats->syncp, start));160160-161161- tot->rx_packets += rx_packets;162162- tot->tx_packets += tx_packets;163163- tot->rx_bytes += rx_bytes;164164- tot->tx_bytes += tx_bytes;165165- }166166-167167- tot->tx_fifo_errors = dev->stats.tx_fifo_errors;168168- tot->tx_carrier_errors = dev->stats.tx_carrier_errors;169169- tot->tx_dropped = dev->stats.tx_dropped;170170- tot->tx_aborted_errors = dev->stats.tx_aborted_errors;171171- tot->tx_errors = dev->stats.tx_errors;172172- tot->collisions = dev->stats.collisions;173173-174174- return tot;175175-}176176-177177-static struct ip_tunnel *ipip_tunnel_lookup(struct net *net,178178- __be32 remote, __be32 local)179179-{180180- unsigned int h0 = HASH(remote);181181- unsigned int h1 = HASH(local);182182- struct ip_tunnel *t;183183- struct ipip_net *ipn = net_generic(net, ipip_net_id);184184-185185- for_each_ip_tunnel_rcu(t, ipn->tunnels_r_l[h0 ^ h1])186186- if (local == t->parms.iph.saddr &&187187- remote == t->parms.iph.daddr && (t->dev->flags&IFF_UP))188188- return t;189189-190190- for_each_ip_tunnel_rcu(t, ipn->tunnels_r[h0])191191- if (remote == t->parms.iph.daddr && (t->dev->flags&IFF_UP))192192- return t;193193-194194- for_each_ip_tunnel_rcu(t, ipn->tunnels_l[h1])195195- if (local == t->parms.iph.saddr && (t->dev->flags&IFF_UP))196196- return t;197197-198198- t = rcu_dereference(ipn->tunnels_wc[0]);199199- if (t && (t->dev->flags&IFF_UP))200200- return t;201201- return NULL;202202-}203203-204204-static struct ip_tunnel __rcu **__ipip_bucket(struct ipip_net *ipn,205205- struct ip_tunnel_parm *parms)206206-{207207- __be32 remote = parms->iph.daddr;208208- __be32 local = parms->iph.saddr;209209- unsigned int h = 0;210210- int prio = 0;211211-212212- if (remote) {213213- prio |= 2;214214- h ^= HASH(remote);215215- }216216- if (local) {217217- prio |= 1;218218- h ^= HASH(local);219219- }220220- return &ipn->tunnels[prio][h];221221-}222222-223223-static inline struct ip_tunnel __rcu **ipip_bucket(struct ipip_net *ipn,224224- struct ip_tunnel *t)225225-{226226- return __ipip_bucket(ipn, &t->parms);227227-}228228-229229-static void ipip_tunnel_unlink(struct ipip_net *ipn, struct ip_tunnel *t)230230-{231231- struct ip_tunnel __rcu **tp;232232- struct ip_tunnel *iter;233233-234234- for (tp = ipip_bucket(ipn, t);235235- (iter = rtnl_dereference(*tp)) != NULL;236236- tp = &iter->next) {237237- if (t == iter) {238238- rcu_assign_pointer(*tp, t->next);239239- break;240240- }241241- }242242-}243243-244244-static void ipip_tunnel_link(struct ipip_net *ipn, struct ip_tunnel *t)245245-{246246- struct ip_tunnel __rcu **tp = ipip_bucket(ipn, t);247247-248248- rcu_assign_pointer(t->next, rtnl_dereference(*tp));249249- rcu_assign_pointer(*tp, t);250250-}251251-252252-static int ipip_tunnel_create(struct net_device *dev)253253-{254254- struct ip_tunnel *t = netdev_priv(dev);255255- struct net *net = dev_net(dev);256256- struct ipip_net *ipn = net_generic(net, ipip_net_id);257257- int err;258258-259259- err = ipip_tunnel_init(dev);260260- if (err < 0)261261- goto out;262262-263263- err = register_netdevice(dev);264264- if (err < 0)265265- goto out;266266-267267- strcpy(t->parms.name, dev->name);268268- dev->rtnl_link_ops = &ipip_link_ops;269269-270270- dev_hold(dev);271271- ipip_tunnel_link(ipn, t);272272- return 0;273273-274274-out:275275- return err;276276-}277277-278278-static struct ip_tunnel *ipip_tunnel_locate(struct net *net,279279- struct ip_tunnel_parm *parms, int create)280280-{281281- __be32 remote = parms->iph.daddr;282282- __be32 local = parms->iph.saddr;283283- struct ip_tunnel *t, *nt;284284- struct ip_tunnel __rcu **tp;285285- struct net_device *dev;286286- char name[IFNAMSIZ];287287- struct ipip_net *ipn = net_generic(net, ipip_net_id);288288-289289- for (tp = __ipip_bucket(ipn, parms);290290- (t = rtnl_dereference(*tp)) != NULL;291291- tp = &t->next) {292292- if (local == t->parms.iph.saddr && remote == t->parms.iph.daddr)293293- return t;294294- }295295- if (!create)296296- return NULL;297297-298298- if (parms->name[0])299299- strlcpy(name, parms->name, IFNAMSIZ);300300- else301301- strcpy(name, "tunl%d");302302-303303- dev = alloc_netdev(sizeof(*t), name, ipip_tunnel_setup);304304- if (dev == NULL)305305- return NULL;306306-307307- dev_net_set(dev, net);308308-309309- nt = netdev_priv(dev);310310- nt->parms = *parms;311311-312312- if (ipip_tunnel_create(dev) < 0)313313- goto failed_free;314314-315315- return nt;316316-317317-failed_free:318318- ipip_dev_free(dev);319319- return NULL;320320-}321321-322322-/* called with RTNL */323323-static void ipip_tunnel_uninit(struct net_device *dev)324324-{325325- struct net *net = dev_net(dev);326326- struct ipip_net *ipn = net_generic(net, ipip_net_id);327327-328328- if (dev == ipn->fb_tunnel_dev)329329- RCU_INIT_POINTER(ipn->tunnels_wc[0], NULL);330330- else331331- ipip_tunnel_unlink(ipn, netdev_priv(dev));332332- dev_put(dev);333333-}334128335129static int ipip_err(struct sk_buff *skb, u32 info)336130{···133339 8 bytes of packet payload. It means, that precise relaying of134340 ICMP in the real Internet is absolutely infeasible.135341 */342342+ struct net *net = dev_net(skb->dev);343343+ struct ip_tunnel_net *itn = net_generic(net, ipip_net_id);136344 const struct iphdr *iph = (const struct iphdr *)skb->data;137137- const int type = icmp_hdr(skb)->type;138138- const int code = icmp_hdr(skb)->code;139345 struct ip_tunnel *t;140346 int err;141141-142142- switch (type) {143143- default:144144- case ICMP_PARAMETERPROB:145145- return 0;146146-147147- case ICMP_DEST_UNREACH:148148- switch (code) {149149- case ICMP_SR_FAILED:150150- case ICMP_PORT_UNREACH:151151- /* Impossible event. */152152- return 0;153153- default:154154- /* All others are translated to HOST_UNREACH.155155- rfc2003 contains "deep thoughts" about NET_UNREACH,156156- I believe they are just ether pollution. --ANK157157- */158158- break;159159- }160160- break;161161- case ICMP_TIME_EXCEEDED:162162- if (code != ICMP_EXC_TTL)163163- return 0;164164- break;165165- case ICMP_REDIRECT:166166- break;167167- }347347+ const int type = icmp_hdr(skb)->type;348348+ const int code = icmp_hdr(skb)->code;168349169350 err = -ENOENT;170170- t = ipip_tunnel_lookup(dev_net(skb->dev), iph->daddr, iph->saddr);351351+ t = ip_tunnel_lookup(itn, skb->dev->ifindex, TUNNEL_NO_KEY,352352+ iph->daddr, iph->saddr, 0);171353 if (t == NULL)172354 goto out;173355···173403 else174404 t->err_count = 1;175405 t->err_time = jiffies;176176-out:177406407407+out:178408 return err;179409}180410411411+static const struct tnl_ptk_info tpi = {412412+ /* no tunnel info required for ipip. */413413+ .proto = htons(ETH_P_IP),414414+};415415+181416static int ipip_rcv(struct sk_buff *skb)182417{418418+ struct net *net = dev_net(skb->dev);419419+ struct ip_tunnel_net *itn = net_generic(net, ipip_net_id);183420 struct ip_tunnel *tunnel;184421 const struct iphdr *iph = ip_hdr(skb);185185- int err;186422187187- tunnel = ipip_tunnel_lookup(dev_net(skb->dev), iph->saddr, iph->daddr);188188- if (tunnel != NULL) {189189- struct pcpu_tstats *tstats;190190-423423+ tunnel = ip_tunnel_lookup(itn, skb->dev->ifindex, TUNNEL_NO_KEY,424424+ iph->saddr, iph->daddr, 0);425425+ if (tunnel) {191426 if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))192427 goto drop;193193-194194- secpath_reset(skb);195195-196196- skb->mac_header = skb->network_header;197197- skb_reset_network_header(skb);198198- skb->protocol = htons(ETH_P_IP);199199- skb->pkt_type = PACKET_HOST;200200-201201- __skb_tunnel_rx(skb, tunnel->dev);202202-203203- err = IP_ECN_decapsulate(iph, skb);204204- if (unlikely(err)) {205205- if (log_ecn_error)206206- net_info_ratelimited("non-ECT from %pI4 with TOS=%#x\n",207207- &iph->saddr, iph->tos);208208- if (err > 1) {209209- ++tunnel->dev->stats.rx_frame_errors;210210- ++tunnel->dev->stats.rx_errors;211211- goto drop;212212- }213213- }214214-215215- tstats = this_cpu_ptr(tunnel->dev->tstats);216216- u64_stats_update_begin(&tstats->syncp);217217- tstats->rx_packets++;218218- tstats->rx_bytes += skb->len;219219- u64_stats_update_end(&tstats->syncp);220220-221221- netif_rx(skb);222222- return 0;428428+ return ip_tunnel_rcv(tunnel, skb, &tpi, log_ecn_error);223429 }224430225431 return -1;···209463 * This function assumes it is being called from dev_queue_xmit()210464 * and that skb is filled properly by that function.211465 */212212-213466static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)214467{215468 struct ip_tunnel *tunnel = netdev_priv(dev);216469 const struct iphdr *tiph = &tunnel->parms.iph;217217- u8 tos = tunnel->parms.iph.tos;218218- __be16 df = tiph->frag_off;219219- struct rtable *rt; /* Route to the other host */220220- struct net_device *tdev; /* Device to other host */221221- const struct iphdr *old_iph;222222- struct iphdr *iph; /* Our new IP header */223223- unsigned int max_headroom; /* The extra header space needed */224224- __be32 dst = tiph->daddr;225225- struct flowi4 fl4;226226- int mtu;227470228228- if (skb->protocol != htons(ETH_P_IP))471471+ if (unlikely(skb->protocol != htons(ETH_P_IP)))229472 goto tx_error;230230- old_iph = ip_hdr(skb);231473232232- if (tos & 1)233233- tos = old_iph->tos;234234-235235- if (!dst) {236236- /* NBMA tunnel */237237- if ((rt = skb_rtable(skb)) == NULL) {238238- dev->stats.tx_fifo_errors++;239239- goto tx_error;240240- }241241- dst = rt_nexthop(rt, old_iph->daddr);242242- }243243-244244- rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,245245- dst, tiph->saddr,246246- 0, 0,247247- IPPROTO_IPIP, RT_TOS(tos),248248- tunnel->parms.link);249249- if (IS_ERR(rt)) {250250- dev->stats.tx_carrier_errors++;251251- goto tx_error_icmp;252252- }253253- tdev = rt->dst.dev;254254-255255- if (tdev == dev) {256256- ip_rt_put(rt);257257- dev->stats.collisions++;258258- goto tx_error;259259- }260260-261261- df |= old_iph->frag_off & htons(IP_DF);262262-263263- if (df) {264264- mtu = dst_mtu(&rt->dst) - sizeof(struct iphdr);265265-266266- if (mtu < 68) {267267- dev->stats.collisions++;268268- ip_rt_put(rt);269269- goto tx_error;270270- }271271-272272- if (skb_dst(skb))273273- skb_dst(skb)->ops->update_pmtu(skb_dst(skb), NULL, skb, mtu);274274-275275- if ((old_iph->frag_off & htons(IP_DF)) &&276276- mtu < ntohs(old_iph->tot_len)) {277277- icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,278278- htonl(mtu));279279- ip_rt_put(rt);280280- goto tx_error;281281- }282282- }283283-284284- if (tunnel->err_count > 0) {285285- if (time_before(jiffies,286286- tunnel->err_time + IPTUNNEL_ERR_TIMEO)) {287287- tunnel->err_count--;288288- dst_link_failure(skb);289289- } else290290- tunnel->err_count = 0;291291- }292292-293293- /*294294- * Okay, now see if we can stuff it in the buffer as-is.295295- */296296- max_headroom = (LL_RESERVED_SPACE(tdev)+sizeof(struct iphdr));297297-298298- if (skb_headroom(skb) < max_headroom || skb_shared(skb) ||299299- (skb_cloned(skb) && !skb_clone_writable(skb, 0))) {300300- struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom);301301- if (!new_skb) {302302- ip_rt_put(rt);303303- dev->stats.tx_dropped++;304304- dev_kfree_skb(skb);305305- return NETDEV_TX_OK;306306- }307307- if (skb->sk)308308- skb_set_owner_w(new_skb, skb->sk);309309- dev_kfree_skb(skb);310310- skb = new_skb;311311- old_iph = ip_hdr(skb);312312- }313313-314314- if (!skb->encapsulation) {474474+ if (likely(!skb->encapsulation)) {315475 skb_reset_inner_headers(skb);316476 skb->encapsulation = 1;317477 }318318- if (skb->ip_summed != CHECKSUM_PARTIAL)319319- skb->ip_summed = CHECKSUM_NONE;320478321321- skb->transport_header = skb->network_header;322322- skb_push(skb, sizeof(struct iphdr));323323- skb_reset_network_header(skb);324324- memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));325325- IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED |326326- IPSKB_REROUTED);327327- skb_dst_drop(skb);328328- skb_dst_set(skb, &rt->dst);329329-330330- /*331331- * Push down and install the IPIP header.332332- */333333-334334- iph = ip_hdr(skb);335335- iph->version = 4;336336- iph->ihl = sizeof(struct iphdr)>>2;337337- iph->frag_off = df;338338- iph->protocol = IPPROTO_IPIP;339339- iph->tos = INET_ECN_encapsulate(tos, old_iph->tos);340340- iph->daddr = fl4.daddr;341341- iph->saddr = fl4.saddr;342342- tunnel_ip_select_ident(skb, old_iph, &rt->dst);343343-344344- if ((iph->ttl = tiph->ttl) == 0)345345- iph->ttl = old_iph->ttl;346346-347347- iptunnel_xmit(skb, dev);348348-479479+ ip_tunnel_xmit(skb, dev, tiph);349480 return NETDEV_TX_OK;350481351351-tx_error_icmp:352352- dst_link_failure(skb);353482tx_error:354483 dev->stats.tx_errors++;355484 dev_kfree_skb(skb);356485 return NETDEV_TX_OK;357486}358487359359-static void ipip_tunnel_bind_dev(struct net_device *dev)360360-{361361- struct net_device *tdev = NULL;362362- struct ip_tunnel *tunnel;363363- const struct iphdr *iph;364364-365365- tunnel = netdev_priv(dev);366366- iph = &tunnel->parms.iph;367367-368368- if (iph->daddr) {369369- struct rtable *rt;370370- struct flowi4 fl4;371371-372372- rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,373373- iph->daddr, iph->saddr,374374- 0, 0,375375- IPPROTO_IPIP,376376- RT_TOS(iph->tos),377377- tunnel->parms.link);378378- if (!IS_ERR(rt)) {379379- tdev = rt->dst.dev;380380- ip_rt_put(rt);381381- }382382- dev->flags |= IFF_POINTOPOINT;383383- }384384-385385- if (!tdev && tunnel->parms.link)386386- tdev = __dev_get_by_index(dev_net(dev), tunnel->parms.link);387387-388388- if (tdev) {389389- dev->hard_header_len = tdev->hard_header_len + sizeof(struct iphdr);390390- dev->mtu = tdev->mtu - sizeof(struct iphdr);391391- }392392- dev->iflink = tunnel->parms.link;393393-}394394-395395-static void ipip_tunnel_update(struct ip_tunnel *t, struct ip_tunnel_parm *p)396396-{397397- struct net *net = dev_net(t->dev);398398- struct ipip_net *ipn = net_generic(net, ipip_net_id);399399-400400- ipip_tunnel_unlink(ipn, t);401401- synchronize_net();402402- t->parms.iph.saddr = p->iph.saddr;403403- t->parms.iph.daddr = p->iph.daddr;404404- memcpy(t->dev->dev_addr, &p->iph.saddr, 4);405405- memcpy(t->dev->broadcast, &p->iph.daddr, 4);406406- ipip_tunnel_link(ipn, t);407407- t->parms.iph.ttl = p->iph.ttl;408408- t->parms.iph.tos = p->iph.tos;409409- t->parms.iph.frag_off = p->iph.frag_off;410410- if (t->parms.link != p->link) {411411- t->parms.link = p->link;412412- ipip_tunnel_bind_dev(t->dev);413413- }414414- netdev_state_change(t->dev);415415-}416416-417488static int418418-ipip_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd)489489+ipip_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)419490{420491 int err = 0;421492 struct ip_tunnel_parm p;422422- struct ip_tunnel *t;423423- struct net *net = dev_net(dev);424424- struct ipip_net *ipn = net_generic(net, ipip_net_id);425493426426- switch (cmd) {427427- case SIOCGETTUNNEL:428428- t = NULL;429429- if (dev == ipn->fb_tunnel_dev) {430430- if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p))) {431431- err = -EFAULT;432432- break;433433- }434434- t = ipip_tunnel_locate(net, &p, 0);435435- }436436- if (t == NULL)437437- t = netdev_priv(dev);438438- memcpy(&p, &t->parms, sizeof(p));439439- if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p)))440440- err = -EFAULT;441441- break;494494+ if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))495495+ return -EFAULT;442496443443- case SIOCADDTUNNEL:444444- case SIOCCHGTUNNEL:445445- err = -EPERM;446446- if (!ns_capable(net->user_ns, CAP_NET_ADMIN))447447- goto done;448448-449449- err = -EFAULT;450450- if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))451451- goto done;452452-453453- err = -EINVAL;454454- if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPIP ||455455- p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)))456456- goto done;457457- if (p.iph.ttl)458458- p.iph.frag_off |= htons(IP_DF);459459-460460- t = ipip_tunnel_locate(net, &p, cmd == SIOCADDTUNNEL);461461-462462- if (dev != ipn->fb_tunnel_dev && cmd == SIOCCHGTUNNEL) {463463- if (t != NULL) {464464- if (t->dev != dev) {465465- err = -EEXIST;466466- break;467467- }468468- } else {469469- if (((dev->flags&IFF_POINTOPOINT) && !p.iph.daddr) ||470470- (!(dev->flags&IFF_POINTOPOINT) && p.iph.daddr)) {471471- err = -EINVAL;472472- break;473473- }474474- t = netdev_priv(dev);475475- }476476-477477- ipip_tunnel_update(t, &p);478478- }479479-480480- if (t) {481481- err = 0;482482- if (copy_to_user(ifr->ifr_ifru.ifru_data, &t->parms, sizeof(p)))483483- err = -EFAULT;484484- } else485485- err = (cmd == SIOCADDTUNNEL ? -ENOBUFS : -ENOENT);486486- break;487487-488488- case SIOCDELTUNNEL:489489- err = -EPERM;490490- if (!ns_capable(net->user_ns, CAP_NET_ADMIN))491491- goto done;492492-493493- if (dev == ipn->fb_tunnel_dev) {494494- err = -EFAULT;495495- if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))496496- goto done;497497- err = -ENOENT;498498- if ((t = ipip_tunnel_locate(net, &p, 0)) == NULL)499499- goto done;500500- err = -EPERM;501501- if (t->dev == ipn->fb_tunnel_dev)502502- goto done;503503- dev = t->dev;504504- }505505- unregister_netdevice(dev);506506- err = 0;507507- break;508508-509509- default:510510- err = -EINVAL;511511- }512512-513513-done:514514- return err;515515-}516516-517517-static int ipip_tunnel_change_mtu(struct net_device *dev, int new_mtu)518518-{519519- if (new_mtu < 68 || new_mtu > 0xFFF8 - sizeof(struct iphdr))497497+ if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPIP ||498498+ p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)))520499 return -EINVAL;521521- dev->mtu = new_mtu;500500+ if (p.i_key || p.o_key || p.i_flags || p.o_flags)501501+ return -EINVAL;502502+ if (p.iph.ttl)503503+ p.iph.frag_off |= htons(IP_DF);504504+505505+ err = ip_tunnel_ioctl(dev, &p, cmd);506506+ if (err)507507+ return err;508508+509509+ if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p)))510510+ return -EFAULT;511511+522512 return 0;523513}524514525515static const struct net_device_ops ipip_netdev_ops = {526526- .ndo_uninit = ipip_tunnel_uninit,516516+ .ndo_init = ipip_tunnel_init,517517+ .ndo_uninit = ip_tunnel_uninit,527518 .ndo_start_xmit = ipip_tunnel_xmit,528519 .ndo_do_ioctl = ipip_tunnel_ioctl,529529- .ndo_change_mtu = ipip_tunnel_change_mtu,530530- .ndo_get_stats64 = ipip_get_stats64,520520+ .ndo_change_mtu = ip_tunnel_change_mtu,521521+ .ndo_get_stats64 = ip_tunnel_get_stats64,531522};532532-533533-static void ipip_dev_free(struct net_device *dev)534534-{535535- free_percpu(dev->tstats);536536- free_netdev(dev);537537-}538523539524#define IPIP_FEATURES (NETIF_F_SG | \540525 NETIF_F_FRAGLIST | \···275798static void ipip_tunnel_setup(struct net_device *dev)276799{277800 dev->netdev_ops = &ipip_netdev_ops;278278- dev->destructor = ipip_dev_free;279801280802 dev->type = ARPHRD_TUNNEL;281281- dev->hard_header_len = LL_MAX_HEADER + sizeof(struct iphdr);282282- dev->mtu = ETH_DATA_LEN - sizeof(struct iphdr);283803 dev->flags = IFF_NOARP;284804 dev->iflink = 0;285805 dev->addr_len = 4;···286812287813 dev->features |= IPIP_FEATURES;288814 dev->hw_features |= IPIP_FEATURES;815815+ ip_tunnel_setup(dev, ipip_net_id);289816}290817291818static int ipip_tunnel_init(struct net_device *dev)292819{293820 struct ip_tunnel *tunnel = netdev_priv(dev);294821295295- tunnel->dev = dev;296296-297822 memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4);298823 memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4);299824300300- ipip_tunnel_bind_dev(dev);301301-302302- dev->tstats = alloc_percpu(struct pcpu_tstats);303303- if (!dev->tstats)304304- return -ENOMEM;305305-306306- return 0;307307-}308308-309309-static int __net_init ipip_fb_tunnel_init(struct net_device *dev)310310-{311311- struct ip_tunnel *tunnel = netdev_priv(dev);312312- struct iphdr *iph = &tunnel->parms.iph;313313- struct ipip_net *ipn = net_generic(dev_net(dev), ipip_net_id);314314-315315- tunnel->dev = dev;316316- strcpy(tunnel->parms.name, dev->name);317317-318318- iph->version = 4;319319- iph->protocol = IPPROTO_IPIP;320320- iph->ihl = 5;321321-322322- dev->tstats = alloc_percpu(struct pcpu_tstats);323323- if (!dev->tstats)324324- return -ENOMEM;325325-326326- dev_hold(dev);327327- rcu_assign_pointer(ipn->tunnels_wc[0], tunnel);328328- return 0;825825+ tunnel->hlen = 0;826826+ tunnel->parms.iph.protocol = IPPROTO_IPIP;827827+ return ip_tunnel_init(dev);329828}330829331830static void ipip_netlink_parms(struct nlattr *data[],···338891static int ipip_newlink(struct net *src_net, struct net_device *dev,339892 struct nlattr *tb[], struct nlattr *data[])340893{341341- struct net *net = dev_net(dev);342342- struct ip_tunnel *nt;894894+ struct ip_tunnel_parm p;343895344344- nt = netdev_priv(dev);345345- ipip_netlink_parms(data, &nt->parms);346346-347347- if (ipip_tunnel_locate(net, &nt->parms, 0))348348- return -EEXIST;349349-350350- return ipip_tunnel_create(dev);896896+ ipip_netlink_parms(data, &p);897897+ return ip_tunnel_newlink(dev, tb, &p);351898}352899353900static int ipip_changelink(struct net_device *dev, struct nlattr *tb[],354901 struct nlattr *data[])355902{356356- struct ip_tunnel *t;357903 struct ip_tunnel_parm p;358358- struct net *net = dev_net(dev);359359- struct ipip_net *ipn = net_generic(net, ipip_net_id);360360-361361- if (dev == ipn->fb_tunnel_dev)362362- return -EINVAL;363904364905 ipip_netlink_parms(data, &p);365906···355920 (!(dev->flags & IFF_POINTOPOINT) && p.iph.daddr))356921 return -EINVAL;357922358358- t = ipip_tunnel_locate(net, &p, 0);359359-360360- if (t) {361361- if (t->dev != dev)362362- return -EEXIST;363363- } else364364- t = netdev_priv(dev);365365-366366- ipip_tunnel_update(t, &p);367367- return 0;923923+ return ip_tunnel_changelink(dev, tb, &p);368924}369925370926static size_t ipip_get_size(const struct net_device *dev)···412986 .setup = ipip_tunnel_setup,413987 .newlink = ipip_newlink,414988 .changelink = ipip_changelink,989989+ .dellink = ip_tunnel_dellink,415990 .get_size = ipip_get_size,416991 .fill_info = ipip_fill_info,417992};···423996 .priority = 1,424997};425998426426-static const char banner[] __initconst =427427- KERN_INFO "IPv4 over IPv4 tunneling driver\n";428428-429429-static void ipip_destroy_tunnels(struct ipip_net *ipn, struct list_head *head)430430-{431431- int prio;432432-433433- for (prio = 1; prio < 4; prio++) {434434- int h;435435- for (h = 0; h < HASH_SIZE; h++) {436436- struct ip_tunnel *t;437437-438438- t = rtnl_dereference(ipn->tunnels[prio][h]);439439- while (t != NULL) {440440- unregister_netdevice_queue(t->dev, head);441441- t = rtnl_dereference(t->next);442442- }443443- }444444- }445445-}446446-447999static int __net_init ipip_init_net(struct net *net)4481000{449449- struct ipip_net *ipn = net_generic(net, ipip_net_id);450450- struct ip_tunnel *t;451451- int err;452452-453453- ipn->tunnels[0] = ipn->tunnels_wc;454454- ipn->tunnels[1] = ipn->tunnels_l;455455- ipn->tunnels[2] = ipn->tunnels_r;456456- ipn->tunnels[3] = ipn->tunnels_r_l;457457-458458- ipn->fb_tunnel_dev = alloc_netdev(sizeof(struct ip_tunnel),459459- "tunl0",460460- ipip_tunnel_setup);461461- if (!ipn->fb_tunnel_dev) {462462- err = -ENOMEM;463463- goto err_alloc_dev;464464- }465465- dev_net_set(ipn->fb_tunnel_dev, net);466466-467467- err = ipip_fb_tunnel_init(ipn->fb_tunnel_dev);468468- if (err)469469- goto err_reg_dev;470470-471471- if ((err = register_netdev(ipn->fb_tunnel_dev)))472472- goto err_reg_dev;473473-474474- t = netdev_priv(ipn->fb_tunnel_dev);475475-476476- strcpy(t->parms.name, ipn->fb_tunnel_dev->name);477477- return 0;478478-479479-err_reg_dev:480480- ipip_dev_free(ipn->fb_tunnel_dev);481481-err_alloc_dev:482482- /* nothing */483483- return err;10011001+ return ip_tunnel_init_net(net, ipip_net_id, &ipip_link_ops, "tunl0");4841002}48510034861004static void __net_exit ipip_exit_net(struct net *net)4871005{488488- struct ipip_net *ipn = net_generic(net, ipip_net_id);489489- LIST_HEAD(list);490490-491491- rtnl_lock();492492- ipip_destroy_tunnels(ipn, &list);493493- unregister_netdevice_queue(ipn->fb_tunnel_dev, &list);494494- unregister_netdevice_many(&list);495495- rtnl_unlock();10061006+ struct ip_tunnel_net *itn = net_generic(net, ipip_net_id);10071007+ ip_tunnel_delete_net(itn);4961008}49710094981010static struct pernet_operations ipip_net_ops = {4991011 .init = ipip_init_net,5001012 .exit = ipip_exit_net,5011013 .id = &ipip_net_id,502502- .size = sizeof(struct ipip_net),10141014+ .size = sizeof(struct ip_tunnel_net),5031015};50410165051017static int __init ipip_init(void)5061018{5071019 int err;5081020509509- printk(banner);10211021+ pr_info("ipip: IPv4 over IPv4 tunneling driver\n");51010225111023 err = register_pernet_device(&ipip_net_ops);5121024 if (err < 0)