inline int uconn_init(uconn_t *uc, int lp, int rp, lisp_addr_t *la,lisp_addr_t *ra) { uc->lp = lp; uc->rp = rp; la ? lisp_addr_copy(&uc->la, la) : lisp_addr_set_lafi(&uc->la, LM_AFI_NO_ADDR); ra ? lisp_addr_copy(&uc->ra, ra) : lisp_addr_set_lafi(&uc->ra, LM_AFI_NO_ADDR); return(GOOD); }
int pkt_parse_5_tuple(lbuf_t *b, packet_tuple_t *tuple) { struct iphdr *iph = NULL; struct ip6_hdr *ip6h = NULL; struct udphdr *udp = NULL; struct tcphdr *tcp = NULL; lbuf_t packet = *b; iph = lbuf_ip(&packet); lisp_addr_set_lafi(&tuple->src_addr, LM_AFI_IP); lisp_addr_set_lafi(&tuple->dst_addr, LM_AFI_IP); switch (iph->version) { case 4: lisp_addr_ip_init(&tuple->src_addr, &iph->saddr, AF_INET); lisp_addr_ip_init(&tuple->dst_addr, &iph->daddr, AF_INET); tuple->protocol = iph->protocol; lbuf_pull(&packet, iph->ihl * 4); break; case 6: ip6h = (struct ip6_hdr *)iph; lisp_addr_ip_init(&tuple->src_addr, &ip6h->ip6_src, AF_INET6); lisp_addr_ip_init(&tuple->dst_addr, &ip6h->ip6_dst, AF_INET6); /* XXX: assuming no extra headers */ tuple->protocol = ip6h->ip6_nxt; lbuf_pull(&packet, sizeof(struct ip6_hdr)); break; default: OOR_LOG(LDBG_2, "pkt_parse_5_tuple: Not an IP packet!"); return (BAD); } OOR_LOG(LDBG_2, "pkt_parse_5_tuple: %", tuple->protocol); if (tuple->protocol == IPPROTO_UDP) { udp = lbuf_data(&packet); tuple->src_port = ntohs(udp->source); tuple->dst_port = ntohs(udp->dest); } else if (tuple->protocol == IPPROTO_TCP) { tcp = lbuf_data(&packet); tuple->src_port = ntohs(tcp->source); tuple->dst_port = ntohs(tcp->dest); } else { /* If protocol is not TCP or UDP, ports of the tuple set to 0 */ tuple->src_port = 0; tuple->dst_port = 0; } return (GOOD); }