Пример #1
0
struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
				    __be32 mask)
{
	ASSERT_RTNL();

	for_primary_ifa(in_dev) {
		if (ifa->ifa_mask == mask && inet_ifa_match(prefix, ifa))
			return ifa;
	} endfor_ifa(in_dev);
	return NULL;
}
Пример #2
0
int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b)
{
	rcu_read_lock();
	for_primary_ifa(in_dev) {
		if (inet_ifa_match(a, ifa)) {
			if (!b || inet_ifa_match(b, ifa)) {
				rcu_read_unlock();
				return 1;
			}
		}
	} endfor_ifa(in_dev);
	rcu_read_unlock();
	return 0;
}
Пример #3
0
static u32 confirm_addr_indev(struct in_device *in_dev, u32 dst,
                              u32 local, int scope)
{
    int same = 0;
    u32 addr = 0;

    for_ifa(in_dev) {
        if (!addr &&
                (local == ifa->ifa_local || !local) &&
                ifa->ifa_scope <= scope) {
            addr = ifa->ifa_local;
            if (same)
                break;
        }
        if (!same) {
            same = (!local || inet_ifa_match(local, ifa)) &&
                   (!dst || inet_ifa_match(dst, ifa));
            if (same && addr) {
                if (local || !dst)
                    break;
                /* Is the selected addr into dst subnet? */
                if (inet_ifa_match(addr, ifa))
                    break;
                /* No, then can we use new local src? */
                if (ifa->ifa_scope <= scope) {
                    addr = ifa->ifa_local;
                    break;
                }
                /* search for large dst subnet for addr */
                same = 0;
            }
        }
    }
    endfor_ifa(in_dev);

    return same? addr : 0;
}