static int ipip6_tunnel_init(struct net_device *dev) { struct net_device *tdev = NULL; struct ip_tunnel *tunnel; struct iphdr *iph; tunnel = (struct ip_tunnel*)dev->priv; iph = &tunnel->parms.iph; ipip6_tunnel_init_gen(dev); if (iph->daddr) { struct rtable *rt; if (!ip_route_output(&rt, iph->daddr, iph->saddr, RT_TOS(iph->tos), tunnel->parms.link)) { tdev = rt->u.dst.dev; ip_rt_put(rt); } dev->flags |= IFF_POINTOPOINT; } if (!tdev && tunnel->parms.link) tdev = __dev_get_by_index(tunnel->parms.link); if (tdev) { dev->hard_header_len = tdev->hard_header_len + sizeof(struct iphdr); dev->mtu = tdev->mtu - sizeof(struct iphdr); if (dev->mtu < IPV6_MIN_MTU) dev->mtu = IPV6_MIN_MTU; } dev->iflink = tunnel->parms.link; return 0; }
int __init ipip6_fb_tunnel_init(struct net_device *dev) { struct iphdr *iph; ipip6_tunnel_init_gen(dev); #ifdef MODULE dev->open = ipip6_fb_tunnel_open; dev->stop = ipip6_fb_tunnel_close; #endif iph = &ipip6_fb_tunnel.parms.iph; iph->version = 4; iph->protocol = IPPROTO_IPV6; iph->ihl = 5; iph->ttl = 64; dev_hold(dev); tunnels_wc[0] = &ipip6_fb_tunnel; return 0; }