static struct rip_peer * rip2PeerLookup (struct variable *v, oid name[], size_t *length, struct in_addr *addr, int exact) { int len; struct rip_peer *peer; if (exact) { /* Check the length. */ if (*length - v->namelen != sizeof (struct in_addr) + 1) return NULL; oid2in_addr (name + v->namelen, sizeof (struct in_addr), addr); peer = rip_peer_lookup (addr); if (peer->domain == name[v->namelen + sizeof (struct in_addr)]) return peer; return NULL; } else { len = *length - v->namelen; if (len > 4) len = 4; oid2in_addr (name + v->namelen, len, addr); len = *length - v->namelen; peer = rip_peer_lookup (addr); if (peer) { if ((len < sizeof (struct in_addr) + 1) || (peer->domain > name[v->namelen + sizeof (struct in_addr)])) { oid_copy_addr (name + v->namelen, &peer->addr, sizeof (struct in_addr)); name[v->namelen + sizeof (struct in_addr)] = peer->domain; *length = sizeof (struct in_addr) + v->namelen + 1; return peer; } } peer = rip_peer_lookup_next (addr); if (! peer) return NULL; oid_copy_addr (name + v->namelen, &peer->addr, sizeof (struct in_addr)); name[v->namelen + sizeof (struct in_addr)] = peer->domain; *length = sizeof (struct in_addr) + v->namelen + 1; return peer; } return NULL; }
/* Get RIP peer. At the same time update timeout thread. */ static struct rip_peer * rip_peer_get (struct in_addr *addr) { struct rip_peer *peer; peer = rip_peer_lookup (addr); if (peer) { if (peer->t_timeout) thread_cancel (peer->t_timeout); } else { peer = rip_peer_new (); peer->addr = *addr; listnode_add_sort (peer_list, peer); } /* Update timeout thread. */ peer->t_timeout = thread_add_timer (master, rip_peer_timeout, peer, RIP_PEER_TIMER_DEFAULT); /* Last update time set. */ time (&peer->uptime); return peer; }
u_int32_t rip_peer_getseqno (struct in_addr *from) { struct rip_peer *peer = rip_peer_lookup (from); return peer ? peer->seqno : 0; }