#define ipa_xor(x,y) ip6_xor(x,y)
#define ipa_not(x) ip6_not(x)
+/* Compare addresses when zero address works like a wildcard */
+static inline int ipa_equal_wildcard(ip_addr x, ip_addr y)
+{ return ipa_zero(x) || ipa_zero(y) || ipa_equal(x, y); }
+
/*
* A zero address is either a token for invalid/unused, or the prefix of default
x->vrf == y->vrf &&
x->port == y->port &&
x->inst == y->inst &&
- ipa_equal(x->addr, y->addr);
+ ipa_equal(x->addr, y->addr) &&
+ ipa_equal_wildcard(x->addr_local, y->addr_local);
}
static void
struct object_lock *l = (struct object_lock *) r;
static char *olock_states[] = { "free", "locked", "waiting", "event" };
- debug("(%d:%s:%I:%d:%d) [%s]\n", l->type, (l->iface ? l->iface->name : "?"), l->addr, l->port, l->inst, olock_states[l->state]);
+ debug("(%d:%s:%I:%I:%d:%d) [%s]\n", l->type, (l->iface ? l->iface->name : "?"), l->addr, l->addr_local, l->port, l->inst, olock_states[l->state]);
if (!EMPTY_LIST(l->waiters))
debug(" [wanted]\n");
}
struct object_lock {
resource r;
- ip_addr addr; /* Identification of a object: IP address */
+ ip_addr addr; /* Identification of a object: IP address (strict compare) */
+ ip_addr addr_local; /* ... another IP address (allow zero IP wildcard) */
uint type; /* ... object type (OBJLOCK_xxx) */
uint port; /* ... port number */
uint inst; /* ... instance ID */
struct object_lock *lock;
lock = p->lock = olock_new(P->pool);
lock->addr = p->remote_ip;
+ lock->addr_local = p->cf->local_ip;
lock->port = p->cf->remote_port;
lock->iface = p->cf->iface;
lock->vrf = p->cf->iface ? NULL : p->p.vrf;