/* * Get lafi and type of a list */ void locator_list_lafi_type ( glist_t *loct_list, int *lafi, int *type) { locator_t *loct = NULL; lisp_addr_t *addr = NULL; *lafi = 0; *type = 0; if (loct_list == NULL || glist_size(loct_list) == 0){ return; } loct = (locator_t *)glist_first_data(loct_list); addr = locator_addr(loct); *lafi = lisp_addr_lafi(addr); switch(*lafi){ case LM_AFI_NO_ADDR: *type = 0; return; case LM_AFI_IP: *type = lisp_addr_ip_afi(addr); return; case LM_AFI_IPPREF: LMLOG(LDBG_2, "locator_list_lafi_type: locator list should not contain prefixes"); return; case LM_AFI_LCAF: *type = lisp_addr_lcaf_type(addr); return; } }
/* Process a LISP protocol message sitting on * socket s with address family afi */ int vpnapi_control_dp_recv_msg(sock_t *sl) { uconn_t uc; lbuf_t *b; oor_ctrl_t *ctrl; oor_ctrl_dev_t *dev; ctrl = sl->arg; /* Only one device supported for now */ dev = glist_first_data(ctrl->devices); uc.lp = LISP_CONTROL_PORT; b = lisp_msg_create_buf(); if (sock_ctrl_recv(sl->fd, b, &uc) != GOOD) { OOR_LOG(LDBG_1, "Couldn't retrieve socket information" "for control message! Discarding packet!"); lbuf_del(b); return (BAD); } if (lbuf_size(b) < 4){ OOR_LOG(LDBG_3, "Received a non LISP message in the " "control port! Discarding packet!"); return (BAD); } lbuf_reset_lisp(b); OOR_LOG(LDBG_1, "Received %s, IP: %s -> %s, UDP: %d -> %d", lisp_msg_hdr_to_char(b), lisp_addr_to_char(&uc.ra), lisp_addr_to_char(&uc.la), uc.rp, uc.lp); /* direct call of ctrl device * TODO: check type to decide where to send msg*/ ctrl_dev_recv(dev, b, &uc); lbuf_del(b); return (GOOD); }