Пример #1
0
static void lowpan_ndisc_prefix_rcv_add_addr(struct net *net,
        struct net_device *dev,
        const struct prefix_info *pinfo,
        struct inet6_dev *in6_dev,
        struct in6_addr *addr,
        int addr_type, u32 addr_flags,
        bool sllao, bool tokenized,
        __u32 valid_lft,
        u32 prefered_lft,
        bool dev_addr_generated)
{
    int err;

    /* generates short based address for RA PIO's */
    if (lowpan_is_ll(dev, LOWPAN_LLTYPE_IEEE802154) && dev_addr_generated &&
            !addrconf_ifid_802154_6lowpan(addr->s6_addr + 8, dev)) {
        err = addrconf_prefix_rcv_add_addr(net, dev, pinfo, in6_dev,
                                           addr, addr_type, addr_flags,
                                           sllao, tokenized, valid_lft,
                                           prefered_lft);
        if (err)
            ND_PRINTK(2, warn,
                      "RA: could not add a short address based address for prefix: %pI6c\n",
                      &pinfo->prefix);
    }
}
Пример #2
0
static int lowpan_event(struct notifier_block *unused,
			unsigned long event, void *ptr)
{
	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
	struct inet6_dev *idev;
	struct in6_addr addr;
	int i;

	if (dev->type != ARPHRD_6LOWPAN)
		return NOTIFY_DONE;

	idev = __in6_dev_get(dev);
	if (!idev)
		return NOTIFY_DONE;

	switch (event) {
	case NETDEV_UP:
	case NETDEV_CHANGE:
		/* (802.15.4 6LoWPAN short address slaac handling */
		if (lowpan_is_ll(dev, LOWPAN_LLTYPE_IEEE802154) &&
		    addrconf_ifid_802154_6lowpan(addr.s6_addr + 8, dev) == 0) {
			__ipv6_addr_set_half(&addr.s6_addr32[0],
					     htonl(0xFE800000), 0);
			addrconf_add_linklocal(idev, &addr, 0);
		}
		break;
	case NETDEV_DOWN:
		for (i = 0; i < LOWPAN_IPHC_CTX_TABLE_SIZE; i++)
			clear_bit(LOWPAN_IPHC_CTX_FLAG_ACTIVE,
				  &lowpan_dev(dev)->ctx.table[i].flags);
		break;
	default:
		return NOTIFY_DONE;
	}

	return NOTIFY_OK;
}