Пример #1
0
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;
}
Пример #2
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;
}