mpls_bool mpls_policy_address_export_check(mpls_instance_handle handle, mpls_inet_addr *addr) { struct ldp *ldp = handle; mpls_bool flag = MPLS_BOOL_FALSE; struct interface *ifp; struct in_addr in; in.s_addr = htonl(addr->u.ipv4); switch (ldp->address) { case LDP_ADDRESS_LDP: if ((ifp = if_lookup_exact_address(in)) && (struct ldp_interface*)(ifp->info)) { flag = MPLS_BOOL_TRUE; } /* fall through */ case LDP_ADDRESS_LSRID: if (in.s_addr == router_id.u.prefix4.s_addr) { flag = MPLS_BOOL_TRUE; } break; case LDP_ADDRESS_ALL: flag = MPLS_BOOL_TRUE; break; } return flag; }
static struct interface * rip2IfLookup (struct variable *v, oid name[], size_t *length, struct in_addr *addr, int exact) { int len; struct interface *ifp; if (exact) { /* Check the length. */ if (*length - v->namelen != sizeof (struct in_addr)) return NULL; oid2in_addr (name + v->namelen, sizeof (struct in_addr), addr); return if_lookup_exact_address (*addr); } else { len = *length - v->namelen; if (len > 4) len = 4; oid2in_addr (name + v->namelen, len, addr); ifp = rip_ifaddr_lookup_next (addr); if (ifp == NULL) return NULL; oid_copy_addr (name + v->namelen, addr, sizeof (struct in_addr)); *length = v->namelen + sizeof (struct in_addr); return ifp; } return NULL; }