/* Process encapsulated map request header: lisp header and the interal IP and * UDP header */ int lisp_msg_ecm_decap(lbuf_t *pkt, uint16_t *src_port) { uint16_t ipsum = 0; uint16_t udpsum = 0; int udp_len = 0; struct udphdr *udph; struct ip *iph; /* this is the new start of the packet */ lisp_msg_pull_ecm_hdr(pkt); /* Set and extract inner layer 3 packet */ lbuf_reset_l3(pkt); iph = pkt_pull_ip(pkt); /* Set and extract inner layer 4 packet */ lbuf_reset_l4(pkt); udph = pkt_pull_udp(pkt); /* Set the beginning of the LISP msg*/ lbuf_reset_lisp(pkt); /* This should overwrite the external port (dst_port in map-reply = * inner src_port in encap map-request) */ *src_port = ntohs(udph->source); #ifdef BSD udp_len = ntohs(udph->uh_ulen); #else udp_len = ntohs(udph->len); #endif /* Verify the checksums. */ if (iph->ip_v == IPVERSION) { ipsum = ip_checksum((uint16_t *) iph, sizeof(struct ip)); if (ipsum != 0) { OOR_LOG(LDBG_2, "IP checksum failed."); } } /* Verify UDP checksum only if different from 0. * This means we ACCEPT UDP checksum 0! */ if (udph->check != 0) { udpsum = udp_checksum(udph, udp_len, iph, ip_version_to_sock_afi(iph->ip_v)); if (udpsum != 0) { OOR_LOG(LDBG_2, "UDP checksum failed."); return (BAD); } } OOR_LOG(LDBG_2, "%s, inner IP: %s -> %s, inner UDP: %d -> %d", lisp_msg_hdr_to_char(pkt), ip_to_char(&iph->ip_src, ip_version_to_sock_afi(iph->ip_v)), ip_to_char(&iph->ip_dst, ip_version_to_sock_afi(iph->ip_v)), ntohs(udph->source), ntohs(udph->dest)); return (GOOD); }
/* 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); }