void test_set_field_IPV6_SCTP_SRC(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_set_field *action_set; struct lagopus_packet *pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + 64); action_set = (struct ofp_action_set_field *)&action->ofpat; action_set->type = OFPAT_SET_FIELD; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); pkt = alloc_lagopus_packet(); TEST_ASSERT_NOT_NULL_MESSAGE(pkt, "lagopus_alloc_packet error."); m = PKT2MBUF(pkt); OS_M_PKTLEN(m) = 128; OS_MTOD(m, uint8_t *)[12] = 0x86; OS_MTOD(m, uint8_t *)[13] = 0xdd; OS_MTOD(m, uint8_t *)[20] = IPPROTO_SCTP; lagopus_packet_init(pkt, m, &port); set_match(action_set->field, 2, OFPXMT_OFB_SCTP_SRC << 1, 0x80, 0x21); execute_action(pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[54], 0x80, "SET_FIELD IPV6_SCTP_SRC[0] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[55], 0x21, "SET_FIELD IPV6_SCTP_SRC[1] error."); OS_MTOD(m, uint8_t *)[20] = IPPROTO_DSTOPTS; OS_MTOD(m, uint8_t *)[54] = IPPROTO_SCTP; OS_MTOD(m, uint8_t *)[55] = 0; lagopus_packet_init(pkt, m, &port); execute_action(pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[54], IPPROTO_SCTP, "SET_FIELD IPV6_SCTP_SRC proto error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[62], 0x80, "SET_FIELD IPV6_SCTP_SRC[0](next hdr) error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[63], 0x21, "SET_FIELD IPV6_SCTP_SRC[1](next hdr) error."); }
void test_set_field_IPV6_SCTP_DST(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_set_field *action_set; struct lagopus_packet pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + 64); action_set = (struct ofp_action_set_field *)&action->ofpat; action_set->type = OFPAT_SET_FIELD; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 128; m->data[12] = 0x86; m->data[13] = 0xdd; m->data[20] = IPPROTO_SCTP; lagopus_packet_init(&pkt, m, &port); set_match(action_set->field, 2, OFPXMT_OFB_SCTP_DST << 1, 0x80, 0x21); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[56], 0x80, "SET_FIELD IPV6_SCTP_DST[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[57], 0x21, "SET_FIELD IPV6_SCTP_DST[1] error."); m->data[20] = IPPROTO_DSTOPTS; m->data[54] = IPPROTO_SCTP; m->data[55] = 0; lagopus_packet_init(&pkt, m, &port); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[54], IPPROTO_SCTP, "SET_FIELD IPV6_SCTP_DST proto error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[64], 0x80, "SET_FIELD IPV6_SCTP_DST[0](next hdr) error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[65], 0x21, "SET_FIELD IPV6_SCTP_DST[1](next hdr) error."); }
void test_match_basic_IPV4_SCTP_SRC(void) { struct lagopus_packet pkt; struct port port; struct flow *flow; OS_MBUF *m; bool rv; /* prepare packet */ pkt.in_port = &port; m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; /* prepare flow */ flow = calloc(1, sizeof(struct flow) + 10 * sizeof(struct match)); TAILQ_INIT(&flow->match_list); add_match(&flow->match_list, 2, OFPXMT_OFB_ETH_TYPE << 1, 0x08, 0x00); m->data[12] = 0x81; m->data[13] = 0x00; m->data[16] = 0x08; m->data[17] = 0x00; m->data[18] = 0x45; add_match(&flow->match_list, 1, OFPXMT_OFB_IP_PROTO << 1, IPPROTO_SCTP); m->data[27] = IPPROTO_SCTP; /* SCTP_SRC */ add_match(&flow->match_list, 2, OFPXMT_OFB_SCTP_SRC << 1, 0xf0, 0x00); m->data[38] = 0; m->data[39] = 0xf0; refresh_match(flow); lagopus_packet_init(&pkt, m); rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, false, "SCTP_SRC mismatch error."); m->data[38] = 0xf0; m->data[39] = 0x00; rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, true, "SCTP_SRC match error."); free(m); }
void test_pop_vlan(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_pop_mpls *action_pop; struct lagopus_packet *pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action)); action_pop = (struct ofp_action_pop_mpls *)&action->ofpat; action_pop->type = OFPAT_POP_VLAN; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); pkt = alloc_lagopus_packet(); TEST_ASSERT_NOT_NULL_MESSAGE(pkt, "lagopus_alloc_packet error."); m = pkt->mbuf; OS_M_APPEND(m, 64 + 4); OS_MTOD(m, uint8_t *)[12] = 0x81; OS_MTOD(m, uint8_t *)[13] = 0x00; OS_MTOD(m, uint8_t *)[14] = 0x30; OS_MTOD(m, uint8_t *)[15] = 50; OS_MTOD(m, uint8_t *)[16] = 0x08; OS_MTOD(m, uint8_t *)[17] = 0x00; OS_MTOD(m, uint8_t *)[18] = 0x45; OS_MTOD(m, uint8_t *)[26] = 240; lagopus_packet_init(pkt, m, &port); execute_action(pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(OS_M_PKTLEN(m), 64, "POP_VLAN length error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[12], 0x08, "POP_VLAN ethertype[0] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[13], 0x00, "POP_VLAN ethertype[1] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[14], 0x45, "POP_VLAN ip_vhl error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[22], 240, "POP_VLAN ip_ttl error."); }
void test_classify_packet_IPV4_TCP(void) { struct port port; struct lagopus_packet pkt; OS_MBUF *m; /* prepare packet */ m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_EQUAL_MESSAGE(m, NULL, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 128; m->data[12] = 0x08; m->data[13] = 0x00; m->data[14] = 0x45; m->data[23] = IPPROTO_TCP; pkt.mbuf = (OS_MBUF *)m; lagopus_set_in_port(&pkt, &port); classify_packet(&pkt); TEST_ASSERT_EQUAL_MESSAGE(pkt.ether_type, ETHERTYPE_IP, "ether_type error."); TEST_ASSERT_EQUAL_MESSAGE(pkt.l3_hdr, &m->data[14], "l3_hdr error."); TEST_ASSERT_EQUAL_MESSAGE(pkt.l4_hdr, &m->data[34], "l4_hdr error."); /* with VLAN */ m->data[12] = 0x81; m->data[13] = 0x00; m->data[16] = 0x08; m->data[17] = 0x00; m->data[18] = 0x45; m->data[27] = IPPROTO_TCP; pkt.mbuf = (OS_MBUF *)m; lagopus_set_in_port(&pkt, &port); classify_packet(&pkt); TEST_ASSERT_EQUAL_MESSAGE(pkt.ether_type, ETHERTYPE_IP, "ether_type(vlan) error."); TEST_ASSERT_EQUAL_MESSAGE(pkt.l3_hdr, &m->data[18], "l3_hdr(vlan) error."); TEST_ASSERT_EQUAL_MESSAGE(pkt.l4_hdr, &m->data[38], "l4_hdr(vlan) error."); }
void test_classify_packet_IPV6_other(void) { struct port port; struct lagopus_packet pkt; OS_MBUF *m; m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_EQUAL_MESSAGE(m, NULL, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; m->data[12] = 0x86; m->data[13] = 0xdd; m->data[20] = IPPROTO_RSVP; pkt.mbuf = (OS_MBUF *)m; lagopus_set_in_port(&pkt, &port); classify_packet(&pkt); TEST_ASSERT_EQUAL_MESSAGE(pkt.ether_type, ETHERTYPE_IPV6, "ether_type error."); /* with exthdr */ m->data[20] = IPPROTO_DSTOPTS; m->data[54] = IPPROTO_RSVP; m->data[55] = 0; classify_packet(&pkt); TEST_ASSERT_EQUAL_MESSAGE(pkt.ether_type, ETHERTYPE_IPV6, "ether_type(exthdr) error."); /* with VLAN */ m->data[12] = 0x81; m->data[13] = 0x00; m->data[16] = 0x86; m->data[17] = 0xdd; m->data[24] = IPPROTO_RSVP; classify_packet(&pkt); TEST_ASSERT_EQUAL_MESSAGE(pkt.ether_type, ETHERTYPE_IPV6, "ether_type(vlan) error."); /* with VLAN and exthdr */ m->data[24] = IPPROTO_DSTOPTS; m->data[58] = IPPROTO_RSVP; m->data[59] = 0; classify_packet(&pkt); TEST_ASSERT_EQUAL_MESSAGE(pkt.ether_type, ETHERTYPE_IPV6, "ether_type(vlan+exthdr) error."); }
void test_match_basic_PBB_ISID_W(void) { struct lagopus_packet pkt; struct port port; struct flow *flow; OS_MBUF *m; bool rv; /* prepare packet */ m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; /* prepare flow */ flow = calloc(1, sizeof(struct flow) + 10 * sizeof(struct match)); TAILQ_INIT(&flow->match_list); #ifndef PBB_IS_VLAN add_match(&flow->match_list, 2, OFPXMT_OFB_ETH_TYPE << 1, 0x88, 0xe7); #endif m->data[12] = 0x88; m->data[13] = 0xe7; add_match(&flow->match_list, 6, (OFPXMT_OFB_PBB_ISID << 1) + 1, 0x5a, 0xc3, 0x00, 0xff, 0xff, 0x00); refresh_match(flow); lagopus_packet_init(&pkt, m, &port); rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, false, "PBB_ISID_W mismatch(1) error."); m->data[15] = 0x3c; m->data[16] = 0xc3; m->data[17] = 0x5a; rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, false, "PBB_ISID_W mismatch(2) error."); m->data[15] = 0x5a; m->data[16] = 0xc3; m->data[17] = 0x3c; rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, true, "PBB_ISID_W match error."); }
void test_set_field_ETH_TYPE(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_set_field *action_set; struct lagopus_packet pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + 64); action_set = (struct ofp_action_set_field *)&action->ofpat; action_set->type = OFPAT_SET_FIELD; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; m->data[12] = 0x08; m->data[13] = 0x00; lagopus_packet_init(&pkt, m, &port); set_match(action_set->field, 2, OFPXMT_OFB_ETH_TYPE << 1, 0x20, 0xf1); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[12], 0x20, "SET_FIELD ETH_TYPE[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[13], 0xf1, "SET_FIELD ETH_TYPE[1] error."); m->data[12] = 0x81; m->data[13] = 0x00; lagopus_packet_init(&pkt, m, &port); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[16], 0x20, "SET_FIELD(vlan) ETH_TYPE[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[17], 0xf1, "SET_FIELD(vlan) ETH_TYPE[1] error."); }
/** * Copy packet for output. */ struct lagopus_packet * copy_packet(struct lagopus_packet *src_pkt) { struct rte_mbuf *mbuf; struct lagopus_packet *pkt; size_t pktlen; pkt = alloc_lagopus_packet(); if (pkt == NULL) { lagopus_msg_error("alloc_lagopus_packet failed\n"); return NULL; } mbuf = pkt->mbuf; pktlen = OS_M_PKTLEN(src_pkt->mbuf); OS_M_APPEND(mbuf, pktlen); memcpy(OS_MTOD(pkt->mbuf, char *), OS_MTOD(src_pkt->mbuf, char *), pktlen); pkt->in_port = src_pkt->in_port; /* other pkt members are not used in physical output. */ return pkt; }
void test_set_field_ETH_SRC(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_set_field *action_set; struct lagopus_packet pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + 64); action_set = (struct ofp_action_set_field *)&action->ofpat; action_set->type = OFPAT_SET_FIELD; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; m->data[12] = 0x08; m->data[13] = 0x00; lagopus_packet_init(&pkt, m, &port); set_match(action_set->field, 6, OFPXMT_OFB_ETH_SRC << 1, 0x22, 0x44, 0x66, 0x88, 0xaa, 0xcc); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[6], 0x22, "SET_FIELD ETH_SRC[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[7], 0x44, "SET_FIELD ETH_SRC[1] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[8], 0x66, "SET_FIELD ETH_SRC[2] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[9], 0x88, "SET_FIELD ETH_SRC[3] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[10], 0xaa, "SET_FIELD ETH_SRC[4] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[11], 0xcc, "SET_FIELD ETH_SRC[5] error."); }
void test_set_field_ICMPV6_TYPE(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_set_field *action_set; struct lagopus_packet pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + 64); action_set = (struct ofp_action_set_field *)&action->ofpat; action_set->type = OFPAT_SET_FIELD; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; m->data[12] = 0x86; m->data[13] = 0xdd; m->data[20] = IPPROTO_ICMPV6; lagopus_packet_init(&pkt, m, &port); set_match(action_set->field, 2, OFPXMT_OFB_ICMPV6_TYPE << 1, ICMP6_ECHO_REQUEST); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[54], ICMP6_ECHO_REQUEST, "SET_FIELD ICMPV6_TYPE error."); m->data[20] = IPPROTO_DSTOPTS; m->data[54] = IPPROTO_ICMPV6; m->data[55] = 0; lagopus_packet_init(&pkt, m, &port); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[54], IPPROTO_ICMPV6, "SET_FIELD ICMPV6_TYPE proto error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[62], ICMP6_ECHO_REQUEST, "SET_FIELD ICMPV6_TYPE(next hdr) error."); }
void test_set_field_ETH_DST(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_set_field *action_set; struct lagopus_packet pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + 64); action_set = (struct ofp_action_set_field *)&action->ofpat; action_set->type = OFPAT_SET_FIELD; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; m->data[12] = 0x08; m->data[13] = 0x00; lagopus_packet_init(&pkt, m, &port); set_match(action_set->field, 6, OFPXMT_OFB_ETH_DST << 1, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[0], 0x23, "SET_FIELD ETH_DST[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[1], 0x45, "SET_FIELD ETH_DST[1] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[2], 0x67, "SET_FIELD ETH_DST[2] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[3], 0x89, "SET_FIELD ETH_DST[3] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[4], 0xab, "SET_FIELD ETH_DST[4] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[5], 0xcd, "SET_FIELD ETH_DST[5] error."); }
void test_match_basic_IPV6_FLABEL(void) { struct lagopus_packet pkt; struct port port; struct flow *flow; OS_MBUF *m; bool rv; /* prepare packet */ pkt.in_port = &port; m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; /* prepare flow */ flow = calloc(1, sizeof(struct flow) + 10 * sizeof(struct match)); TAILQ_INIT(&flow->match_list); add_match(&flow->match_list, 2, OFPXMT_OFB_ETH_TYPE << 1, 0x86, 0xdd); m->data[12] = 0x86; m->data[13] = 0xdd; m->data[15] = 0x00; m->data[16] = 0x12; m->data[17] = 0x34; add_match(&flow->match_list, 4, OFPXMT_OFB_IPV6_FLABEL << 1, 0x00, 0x01, 0x23, 0x45); refresh_match(flow); lagopus_packet_init(&pkt, m); rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, false, "IPV6_FLABEL mismatch error."); m->data[15] = 0x01; m->data[16] = 0x23; m->data[17] = 0x45; lagopus_packet_init(&pkt, m); rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, true, "IPV6_FLABEL match error."); }
void test_classify_packet_IPV4_UDP(void) { struct port port; struct lagopus_packet *pkt; OS_MBUF *m; /* prepare packet */ pkt = alloc_lagopus_packet(); TEST_ASSERT_NOT_NULL_MESSAGE(pkt, "lagopus_alloc_packet error."); m = PKT2MBUF(pkt); OS_M_PKTLEN(m) = 128; OS_MTOD(m, uint8_t *)[12] = 0x08; OS_MTOD(m, uint8_t *)[13] = 0x00; OS_MTOD(m, uint8_t *)[14] = 0x45; OS_MTOD(m, uint8_t *)[23] = IPPROTO_UDP; lagopus_packet_init(pkt, m, &port); TEST_ASSERT_EQUAL_MESSAGE(pkt->ether_type, ETHERTYPE_IP, "ether_type error."); TEST_ASSERT_EQUAL_MESSAGE(pkt->l3_hdr, &OS_MTOD(m, uint8_t *)[14], "l3_hdr error."); TEST_ASSERT_EQUAL_MESSAGE(pkt->l4_hdr, &OS_MTOD(m, uint8_t *)[34], "l4_hdr error."); /* with VLAN */ OS_MTOD(m, uint8_t *)[12] = 0x81; OS_MTOD(m, uint8_t *)[13] = 0x00; OS_MTOD(m, uint8_t *)[16] = 0x08; OS_MTOD(m, uint8_t *)[17] = 0x00; OS_MTOD(m, uint8_t *)[18] = 0x45; OS_MTOD(m, uint8_t *)[27] = IPPROTO_UDP; classify_ether_packet(pkt); TEST_ASSERT_EQUAL_MESSAGE(pkt->ether_type, ETHERTYPE_IP, "ether_type(vlan) error."); TEST_ASSERT_EQUAL_MESSAGE(pkt->l3_hdr, &OS_MTOD(m, uint8_t *)[18], "l3_hdr(vlan) error."); TEST_ASSERT_EQUAL_MESSAGE(pkt->l4_hdr, &OS_MTOD(m, uint8_t *)[38], "l4_hdr(vlan) error."); }
void test_dec_mpls_ttl(void) { struct port port; struct action_list action_list; struct action *action; struct lagopus_packet pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + 64); action->ofpat.type = OFPAT_DEC_MPLS_TTL; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_EQUAL_MESSAGE(m, NULL, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; m->data[12] = 0x88; m->data[13] = 0x47; m->data[17] = 100; lagopus_set_in_port(&pkt, &port); lagopus_packet_init(&pkt, m); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[17], 99, "DEC_MPLS_TTL error."); m->data[12] = 0x88; m->data[13] = 0x48; m->data[17] = 0; lagopus_packet_init(&pkt, m); pkt.in_port = NULL; execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[17], 0, "DEC_MPLS_TTL(0) error."); }
void test_match_basic_IPV4_IP_ECN(void) { struct lagopus_packet pkt; struct port port; struct flow *flow; OS_MBUF *m; bool rv; /* prepare packet */ pkt.in_port = &port; m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; /* prepare flow */ flow = calloc(1, sizeof(struct flow) + 10 * sizeof(struct match)); TAILQ_INIT(&flow->match_list); add_match(&flow->match_list, 2, OFPXMT_OFB_ETH_TYPE << 1, 0x08, 0x00); refresh_match(flow); m->data[12] = 0x08; m->data[13] = 0x00; m->data[14] = 0x45; add_match(&flow->match_list, 1, OFPXMT_OFB_IP_ECN << 1, 0x3); m->data[15] = 0xcc; refresh_match(flow); lagopus_packet_init(&pkt, m); rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, false, "IP_ECN mismatch error."); m->data[15] = 0x03; rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, true, "IP_ECN match error."); }
void test_set_field_IPV6_FLABEL(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_set_field *action_set; struct lagopus_packet pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + 64); action_set = (struct ofp_action_set_field *)&action->ofpat; action_set->type = OFPAT_SET_FIELD; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; m->data[12] = 0x86; m->data[13] = 0xdd; m->data[14] = 0x6f; lagopus_packet_init(&pkt, m, &port); set_match(action_set->field, 4, OFPXMT_OFB_IPV6_FLABEL << 1, 0x00, 0x0e, 0xab, 0xcd); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[14], 0x6f, "SET_FIELD IPV6_IPV6_FLABEL[0] error"); TEST_ASSERT_EQUAL_MESSAGE(m->data[15], 0x0e, "SET_FIELD IPV6_IPV6_FLABEL[1] error"); TEST_ASSERT_EQUAL_MESSAGE(m->data[16], 0xab, "SET_FIELD IPV6_IPV6_FLABEL[2] error"); TEST_ASSERT_EQUAL_MESSAGE(m->data[17], 0xcd, "SET_FIELD IPV6_IPV6_FLABEL[3] error"); }
void test_set_field_PBB_ISID(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_set_field *action_set; struct lagopus_packet pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + 64); action_set = (struct ofp_action_set_field *)&action->ofpat; action_set->type = OFPAT_SET_FIELD; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; m->data[12] = 0x88; m->data[13] = 0xe7; lagopus_set_in_port(&pkt, &port); lagopus_packet_init(&pkt, m); set_match(action_set->field, 3, OFPXMT_OFB_PBB_ISID << 1, 0xa5, 0x5a, 0xc3); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[15], 0xa5, "SET_FIELD PBB_ISID[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[16], 0x5a, "SET_FIELD PBB_ISID[1] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[17], 0xc3, "SET_FIELD PBB_ISID[2] error."); }
void test_match_basic_IN_PORT(void) { struct lagopus_packet pkt; struct port port; struct flow *flow; OS_MBUF *m; bool rv; /* prepare packet */ m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; /* prepare flow */ flow = allocate_test_flow(10 * sizeof(struct match)); refresh_match(flow); /* Port */ pkt.oob_data.in_port = htonl(2); lagopus_packet_init(&pkt, m, &port); rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, true, "IN_PORT wildcard match error."); FLOW_ADD_PORT_MATCH(flow, 1); refresh_match(flow); pkt.oob_data.in_port = htonl(2); rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, false, "IN_PORT mismatch error."); pkt.oob_data.in_port = htonl(1); rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, true, "IN_PORT match error."); free(m); }
void test_pop_mpls(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_pop_mpls *action_pop; struct lagopus_packet pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + sizeof(*action_pop) - sizeof(struct ofp_action_header)); action_pop = (struct ofp_action_pop_mpls *)&action->ofpat; action_pop->type = OFPAT_POP_MPLS; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_EQUAL_MESSAGE(m, NULL, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64 + 8; /* initial, double taged */ m->data[12] = 0x88; m->data[13] = 0x48; /* outer LSE */ m->data[17] = 50; /* innner LSE */ m->data[20] = 0x01; m->data[21] = 100; /* IPv4 */ m->data[22] = 0x45; m->data[30] = 240; lagopus_packet_init(&pkt, m, &port); action_pop->ethertype = 0x8847; execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(OS_M_PKTLEN(m), 64 + 4, "POP_MPLS length error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[12], 0x88, "POP_MPLS ethertype[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[13], 0x47, "POP_MPLS ethertype[1] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[16], 1, "POP_MPLS BOS error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[17], 100, "POP_MPLS TTL error."); action_pop->ethertype = 0x0800; execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(OS_M_PKTLEN(m), 64, "POP_MPLS(2) length error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[12], 0x08, "POP_MPLS(2) ethertype[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[13], 0x00, "POP_MPLS(2) ethertype[1] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[14], 0x45, "POP_MPLS(2) ip_vhl error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[22], 240, "POP_MPLS(2) ip_ttl error."); }
void test_set_field_IPV6_DST(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_set_field *action_set; struct lagopus_packet pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + 64); action_set = (struct ofp_action_set_field *)&action->ofpat; action_set->type = OFPAT_SET_FIELD; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; m->data[12] = 0x86; m->data[13] = 0xdd; lagopus_packet_init(&pkt, m, &port); set_match(action_set->field, 16, OFPXMT_OFB_IPV6_DST << 1, 0x20, 0x01, 0x00, 0x00, 0xe0, 0x45, 0x22, 0xeb, 0x09, 0x00, 0x00, 0x08, 0xdc, 0x18, 0x94, 0xad); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[38], 0x20, "SET_FIELD IPV6_DST[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[39], 0x01, "SET_FIELD IPV6_DST[1] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[40], 0x00, "SET_FIELD IPV6_DST[2] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[41], 0x00, "SET_FIELD IPV6_DST[3] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[42], 0xe0, "SET_FIELD IPV6_DST[4] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[43], 0x45, "SET_FIELD IPV6_DST[5] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[44], 0x22, "SET_FIELD IPV6_DST[6] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[45], 0xeb, "SET_FIELD IPV6_DST[7] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[46], 0x09, "SET_FIELD IPV6_DST[8] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[47], 0x00, "SET_FIELD IPV6_DST[9] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[48], 0x00, "SET_FIELD IPV6_DST[10] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[49], 0x08, "SET_FIELD IPV6_DST[11] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[50], 0xdc, "SET_FIELD IPV6_DST[12] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[51], 0x18, "SET_FIELD IPV6_DST[13] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[52], 0x94, "SET_FIELD IPV6_DST[14] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[53], 0xad, "SET_FIELD IPV6_DST[15] error."); }
void test_match_basic_IPV6_EXTHDR(void) { struct lagopus_packet pkt; struct port port; struct flow *flow; OS_MBUF *m; bool rv; /* prepare packet */ pkt.in_port = &port; m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 256; /* prepare flow */ flow = calloc(1, sizeof(struct flow) + 10 * sizeof(struct match)); TAILQ_INIT(&flow->match_list); add_match(&flow->match_list, 2, OFPXMT_OFB_ETH_TYPE << 1, 0x86, 0xdd); m->data[12] = 0x86; m->data[13] = 0xdd; add_match(&flow->match_list, 1, OFPXMT_OFB_IP_PROTO << 1, IPPROTO_TCP); m->data[20] = IPPROTO_DSTOPTS; m->data[54] = IPPROTO_TCP; m->data[55] = 4; add_match(&flow->match_list, 2, OFPXMT_OFB_IPV6_EXTHDR << 1, OFPIEH_UNSEQ >> 8, OFPIEH_NONEXT|OFPIEH_ESP|OFPIEH_AUTH|OFPIEH_DEST|OFPIEH_FRAG| OFPIEH_ROUTER|OFPIEH_HOP|OFPIEH_UNREP); refresh_match(flow); lagopus_packet_init(&pkt, m); rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, false, "IPV6_EXTHDR mismatch error."); m->data[54] = IPPROTO_HOPOPTS; m->data[55] = 0; m->data[62] = IPPROTO_ESP; m->data[63] = 0; m->data[70] = IPPROTO_AH; m->data[72] = 0; m->data[78] = IPPROTO_ROUTING; m->data[79] = 0; m->data[86] = IPPROTO_FRAGMENT; m->data[94] = IPPROTO_AH; m->data[95] = 0; m->data[102] = IPPROTO_ROUTING; m->data[103] = 0; m->data[110] = IPPROTO_HOPOPTS; m->data[111] = 0; m->data[118] = IPPROTO_FRAGMENT; m->data[126] = IPPROTO_ESP; m->data[127] = 0; m->data[134] = IPPROTO_DSTOPTS; m->data[135] = 0; m->data[142] = IPPROTO_NONE; m->data[143] = 0; m->data[150] = IPPROTO_TCP; lagopus_packet_init(&pkt, m); rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, true, "IPV6_EXTHDR match error."); }
/** * Dequeue mbufs from output queue and send to ethernet port. * This function is called from I/O (Output) thread. */ static inline void app_lcore_io_tx(struct app_lcore_params_io *lp, uint32_t n_workers, uint32_t bsz_rd, uint32_t bsz_wr) { uint32_t worker; for (worker = 0; worker < n_workers; worker ++) { uint32_t i; for (i = 0; i < lp->tx.n_nic_ports; i ++) { uint8_t port = lp->tx.nic_ports[i]; struct rte_ring *ring = lp->tx.rings[port][worker]; struct interface *ifp; uint32_t n_mbufs, n_pkts; int ret; n_mbufs = lp->tx.mbuf_out[port].n_mbufs; ret = rte_ring_sc_dequeue_burst(ring, (void **) &lp->tx.mbuf_out[port].array[n_mbufs], bsz_rd - n_mbufs); if (unlikely(ret == 0)) { continue; } n_mbufs += (uint32_t)ret; #if APP_IO_TX_DROP_ALL_PACKETS { uint32_t j; APP_IO_TX_PREFETCH0(lp->tx.mbuf_out[port].array[0]); APP_IO_TX_PREFETCH0(lp->tx.mbuf_out[port].array[1]); for (j = 0; j < n_mbufs; j ++) { if (likely(j < n_mbufs - 2)) { APP_IO_TX_PREFETCH0(lp->tx.mbuf_out[port].array[j + 2]); } rte_pktmbuf_free(lp->tx.mbuf_out[port].array[j]); } lp->tx.mbuf_out[port].n_mbufs = 0; continue; } #endif if (unlikely(n_mbufs < bsz_wr)) { lp->tx.mbuf_out[port].n_mbufs = n_mbufs; lp->tx.mbuf_out_flush[port] = 1; continue; } ifp = dpdk_interface_lookup(port); if (ifp != NULL && ifp->sched_port != NULL) { struct lagopus_packet *pkt; struct rte_mbuf *m; int qidx, color; for (i = 0; i < n_mbufs; i++) { m = lp->tx.mbuf_out[port].array[i]; pkt = (struct lagopus_packet *) (m->buf_addr + APP_DEFAULT_MBUF_LOCALDATA_OFFSET); if (unlikely(pkt->queue_id != 0)) { qidx = dpdk_interface_queue_id_to_index(ifp, pkt->queue_id); color = rte_meter_trtcm_color_blind_check(&ifp->ifqueue.meters[qidx], rte_rdtsc(), OS_M_PKTLEN(m)); rte_sched_port_pkt_write(m, 0, 0, 0, qidx, color); } } n_mbufs = rte_sched_port_enqueue(ifp->sched_port, lp->tx.mbuf_out[port].array, n_mbufs); n_mbufs = rte_sched_port_dequeue(ifp->sched_port, lp->tx.mbuf_out[port].array, n_mbufs); } DPRINTF("send %d pkts\n", n_mbufs); n_pkts = rte_eth_tx_burst(port, 0, lp->tx.mbuf_out[port].array, (uint16_t) n_mbufs); DPRINTF("sent %d pkts\n", n_pkts); #if APP_STATS lp->tx.nic_ports_iters[port] ++; lp->tx.nic_ports_count[port] += n_pkts; if (unlikely(lp->tx.nic_ports_iters[port] == APP_STATS)) { unsigned lcore = rte_lcore_id(); printf("\t\t\tI/O TX %u out (port %u): avg burst size = %.2f\n", lcore, (unsigned) port, ((double) lp->tx.nic_ports_count[port]) / ((double) lp->tx.nic_ports_iters[port])); lp->tx.nic_ports_iters[port] = 0; lp->tx.nic_ports_count[port] = 0; } #endif if (unlikely(n_pkts < n_mbufs)) { uint32_t k; for (k = n_pkts; k < n_mbufs; k ++) { struct rte_mbuf *pkt_to_free = lp->tx.mbuf_out[port].array[k]; rte_pktmbuf_free(pkt_to_free); } } lp->tx.mbuf_out[port].n_mbufs = 0; lp->tx.mbuf_out_flush[port] = 0; } } }
void test_match_basic_IPV6_DST_W(void) { struct lagopus_packet pkt; struct port port; struct flow *flow; OS_MBUF *m; bool rv; int i; /* prepare packet */ pkt.in_port = &port; m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; /* prepare flow */ flow = calloc(1, sizeof(struct flow) + 10 * sizeof(struct match)); TAILQ_INIT(&flow->match_list); add_match(&flow->match_list, 2, OFPXMT_OFB_ETH_TYPE << 1, 0x86, 0xdd); m->data[12] = 0x86; m->data[13] = 0xdd; i = 38; m->data[i++] = 0x20; m->data[i++] = 0x01; m->data[i++] = 0x20; m->data[i++] = 0xff; m->data[i++] = 0x00; m->data[i++] = 0x00; m->data[i++] = 0x10; m->data[i++] = 0x20; m->data[i++] = 0x11; m->data[i++] = 0xe1; m->data[i++] = 0x50; m->data[i++] = 0x89; m->data[i++] = 0xbf; m->data[i++] = 0xc6; m->data[i++] = 0x43; m->data[i++] = 0x11; lagopus_packet_init(&pkt, m); add_match(&flow->match_list, 32, (OFPXMT_OFB_IPV6_DST << 1) + 1, 0x20, 0x01, 0x00, 0x00, 0xe0, 0x45, 0x22, 0xeb, 0x09, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00); refresh_match(flow); rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, false, "IPV6_DST_W mismatch error."); i = 38; m->data[i++] = 0x20; m->data[i++] = 0x01; m->data[i++] = 0x00; m->data[i++] = 0x00; m->data[i++] = 0xe0; m->data[i++] = 0x45; m->data[i++] = 0x22; m->data[i++] = 0xeb; m->data[i++] = 0x09; m->data[i++] = 0x00; m->data[i++] = 0x00; m->data[i++] = 0x08; m->data[i++] = 0xdc; m->data[i++] = 0x18; m->data[i++] = 0x94; m->data[i++] = 0xad; rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, true, "IPV6_DST_W match error."); }
void test_match_flow_mpls(void) { struct lagopus_packet pkt; struct flowinfo *flowinfo; struct flow *flow; struct port port; OS_MBUF *m; int32_t prio; int i, nflow; /* prepare packet */ pkt.in_port = &port; m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; /* prepare flow table */ test_flow[0] = allocate_test_flow(10 * sizeof(struct match)); test_flow[0]->priority = 3; add_match(&test_flow[0]->match_list, 2, OFPXMT_OFB_ETH_TYPE << 1, 0x88, 0x47); add_match(&test_flow[0]->match_list, 4, OFPXMT_OFB_MPLS_LABEL << 1, 0x00, 0x00, 0x00, 0x01); test_flow[1] = allocate_test_flow(10 * sizeof(struct match)); test_flow[1]->priority = 2; FLOW_ADD_PORT_MATCH(test_flow[1], 2); test_flow[2] = allocate_test_flow(10 * sizeof(struct match)); test_flow[2]->priority = 1; FLOW_ADD_PORT_MATCH(test_flow[2], 3); /* create flowinfo */ flowinfo = new_flowinfo_eth_type(); nflow = sizeof(test_flow) / sizeof(test_flow[0]); for (i = 0; i < nflow; i++) { flowinfo->add_func(flowinfo, test_flow[i]); } /* test */ prio = 0; m->data[12] = 0x88; m->data[13] = 0x47; m->data[14] = 0xff; m->data[15] = 0xff; m->data[16] = 0xff; m->data[17] = 0xff; lagopus_packet_init(&pkt, m); flow = flowinfo->match_func(flowinfo, &pkt, &prio); TEST_ASSERT_NULL_MESSAGE(flow, "match_flow_mpls mismatch error"); m->data[14] = 0x00; m->data[15] = 0x00; m->data[16] = 0x1f; m->data[17] = 0xff; flow = flowinfo->match_func(flowinfo, &pkt, &prio); TEST_ASSERT_EQUAL_MESSAGE(flow, test_flow[0], "match_flow_mpls match flow error."); TEST_ASSERT_EQUAL_MESSAGE(prio, 3, "match_flow_mpls match prio error."); }
void test_pop_mpls(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_pop_mpls *action_pop; struct lagopus_packet *pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + sizeof(*action_pop) - sizeof(struct ofp_action_header)); action_pop = (struct ofp_action_pop_mpls *)&action->ofpat; action_pop->type = OFPAT_POP_MPLS; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); pkt = alloc_lagopus_packet(); TEST_ASSERT_NOT_NULL_MESSAGE(pkt, "lagopus_alloc_packet error."); m = pkt->mbuf; OS_M_APPEND(m, 64 + 8); /* initial, double taged */ OS_MTOD(m, uint8_t *)[12] = 0x88; OS_MTOD(m, uint8_t *)[13] = 0x48; /* outer LSE */ OS_MTOD(m, uint8_t *)[17] = 50; /* innner LSE */ OS_MTOD(m, uint8_t *)[20] = 0x01; OS_MTOD(m, uint8_t *)[21] = 100; /* IPv4 */ OS_MTOD(m, uint8_t *)[22] = 0x45; OS_MTOD(m, uint8_t *)[30] = 240; lagopus_packet_init(pkt, m, &port); action_pop->ethertype = 0x8847; TEST_ASSERT_EQUAL(execute_action(pkt, &action_list), LAGOPUS_RESULT_OK); TEST_ASSERT_EQUAL_MESSAGE(OS_M_PKTLEN(m), 64 + 4, "POP_MPLS length error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[12], 0x88, "POP_MPLS ethertype[0] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[13], 0x47, "POP_MPLS ethertype[1] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[16], 1, "POP_MPLS BOS error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[17], 100, "POP_MPLS TTL error."); action_pop->ethertype = 0x0800; execute_action(pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(OS_M_PKTLEN(m), 64, "POP_MPLS(2) length error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[12], 0x08, "POP_MPLS(2) ethertype[0] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[13], 0x00, "POP_MPLS(2) ethertype[1] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[14], 0x45, "POP_MPLS(2) ip_vhl error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[22], 240, "POP_MPLS(2) ip_ttl error."); }
void test_push_mpls(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_push *action_push; struct lagopus_packet *pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + sizeof(*action_push) - sizeof(struct ofp_action_header)); action_push = (struct ofp_action_push *)&action->ofpat; action_push->type = OFPAT_PUSH_MPLS; action_push->ethertype = 0x8847; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); pkt = alloc_lagopus_packet(); TEST_ASSERT_NOT_NULL_MESSAGE(pkt, "lagopus_alloc_packet error."); m = pkt->mbuf; OS_M_APPEND(m, 64); OS_MTOD(m, uint8_t *)[12] = 0x08; OS_MTOD(m, uint8_t *)[13] = 0x00; OS_MTOD(m, uint8_t *)[14] = 0x45; OS_MTOD(m, uint8_t *)[22] = 240; lagopus_packet_init(pkt, m, &port); execute_action(pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(OS_M_PKTLEN(m), 64 + 4, "PUSH_MPLS length error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[12], 0x88, "PUSH_MPLS ethertype[0] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[13], 0x47, "PUSH_MPLS ethertype[1] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[16], 1, "PUSH_MPLS BOS error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[17], 240, "PUSH_MPLS TTL error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[18], 0x45, "PUSH_MPLS payload error."); OS_MTOD(m, uint8_t *)[14] = 0x12; OS_MTOD(m, uint8_t *)[15] = 0x34; OS_MTOD(m, uint8_t *)[16] = 0x5f; action_push->ethertype = 0x8848; execute_action(pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(OS_M_PKTLEN(m), 64 + 8, "PUSH_MPLS(2) length error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[12], 0x88, "PUSH_MPLS(2) ethertype[0] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[13], 0x48, "PUSH_MPLS(2) ethertype[1] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[14], 0x12, "PUSH_MPLS(2) LSE[0] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[15], 0x34, "PUSH_MPLS(2) LSE[1] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[16], 0x5e, "PUSH_MPLS(2) LSE[2] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[17], 240, "PUSH_MPLS(2) LSE[3] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[18], 0x12, "PUSH_MPLS(2) payload[0] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[19], 0x34, "PUSH_MPLS(2) payload[1] error."); }
void test_push_mpls(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_push *action_push; struct lagopus_packet pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + sizeof(*action_push) - sizeof(struct ofp_action_header)); action_push = (struct ofp_action_push *)&action->ofpat; action_push->type = OFPAT_PUSH_MPLS; action_push->ethertype = 0x8847; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_EQUAL_MESSAGE(m, NULL, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; m->data[12] = 0x08; m->data[13] = 0x00; m->data[14] = 0x45; m->data[22] = 240; lagopus_packet_init(&pkt, m, &port); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(OS_M_PKTLEN(m), 64 + 4, "PUSH_MPLS length error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[12], 0x88, "PUSH_MPLS ethertype[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[13], 0x47, "PUSH_MPLS ethertype[1] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[16], 1, "PUSH_MPLS BOS error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[17], 240, "PUSH_MPLS TTL error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[18], 0x45, "PUSH_MPLS payload error."); m->data[14] = 0x12; m->data[15] = 0x34; m->data[16] = 0x5f; action_push->ethertype = 0x8848; execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(OS_M_PKTLEN(m), 64 + 8, "PUSH_MPLS(2) length error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[12], 0x88, "PUSH_MPLS(2) ethertype[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[13], 0x48, "PUSH_MPLS(2) ethertype[1] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[14], 0x12, "PUSH_MPLS(2) LSE[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[15], 0x34, "PUSH_MPLS(2) LSE[1] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[16], 0x5e, "PUSH_MPLS(2) LSE[2] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[17], 240, "PUSH_MPLS(2) LSE[3] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[18], 0x12, "PUSH_MPLS(2) payload[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[19], 0x34, "PUSH_MPLS(2) payload[1] error."); }
void test_push_pbb(void) { static const uint8_t dhost[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 }; static const uint8_t shost[] = { 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb }; struct port port; struct action_list action_list; struct action *action; struct ofp_action_push *action_push; struct lagopus_packet *pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + sizeof(*action_push) - sizeof(struct ofp_action_header)); action_push = (struct ofp_action_push *)&action->ofpat; action_push->type = OFPAT_PUSH_PBB; action_push->ethertype = 0x88e7; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); pkt = alloc_lagopus_packet(); TEST_ASSERT_NOT_NULL_MESSAGE(pkt, "lagopus_alloc_packet error."); m = pkt->mbuf; OS_M_APPEND(m, 64); OS_MEMCPY(&OS_MTOD(m, uint8_t *)[0], dhost, ETH_ALEN); OS_MEMCPY(&OS_MTOD(m, uint8_t *)[6], shost, ETH_ALEN); lagopus_packet_init(pkt, m, &port); execute_action(pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(OS_M_PKTLEN(m), 64 + 18, "PUSH_PBB length error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[12], 0x88, "PUSH_PBB TPID[0] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[13], 0xe7, "PUSH_PBB TPID[1] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[14], 0, "PUSH_PBB pcp_dei error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[15], 0x00, "PUSH_PBB i_sid[0] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[16], 0x00, "PUSH_PBB i_sid[1] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[17], 0x00, "PUSH_PBB i_sid[2] error."); TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(&OS_MTOD(m, uint8_t *)[18], dhost, ETH_ALEN, "PUSH_PBB dhost error."); TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(&OS_MTOD(m, uint8_t *)[24], shost, ETH_ALEN, "PUSH_PBB shost error."); OS_MTOD(m, uint8_t *)[15] = 0xab; OS_MTOD(m, uint8_t *)[16] = 0xcd; OS_MTOD(m, uint8_t *)[17] = 0xef; execute_action(pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(OS_M_PKTLEN(m), 64 + 18 + 18, "PUSH_PBB length error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[15], 0xab, "PUSH_PBB(2) i_sid[0] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[16], 0xcd, "PUSH_PBB(2) i_sid[1] error."); TEST_ASSERT_EQUAL_MESSAGE(OS_MTOD(m, uint8_t *)[17], 0xef, "PUSH_PBB(2) i_sid[2] error."); }
void test_set_field_MPLS_LABEL(void) { struct port port; struct action_list action_list; struct action *action; struct ofp_action_set_field *action_set; struct lagopus_packet pkt; OS_MBUF *m; TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + 64); action_set = (struct ofp_action_set_field *)&action->ofpat; action_set->type = OFPAT_SET_FIELD; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; OS_M_PKTLEN(m) = 64; m->data[12] = 0x88; m->data[13] = 0x47; m->data[14] = 0xff; m->data[15] = 0xff; m->data[16] = 0xff; m->data[17] = 0xff; lagopus_set_in_port(&pkt, &port); lagopus_packet_init(&pkt, m); set_match(action_set->field, 4, OFPXMT_OFB_MPLS_LABEL << 1, 0x00, 0x00, 0x01, 0x00); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[14], 0x00, "SET_FIELD MPLS_LABEL[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[15], 0x10, "SET_FIELD MPLS_LABEL[1] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[16], 0x0f, "SET_FIELD MPLS_LABEL[2] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[17], 0xff, "SET_FIELD MPLS_LABEL[3] error."); m->data[12] = 0x88; m->data[13] = 0x48; m->data[14] = 0x00; m->data[15] = 0x00; m->data[16] = 0x00; m->data[17] = 0x00; lagopus_packet_init(&pkt, m); set_match(action_set->field, 4, OFPXMT_OFB_MPLS_LABEL << 1, 0x00, 0x0c, 0xa4, 0x21); execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->data[14], 0xca, "SET_FIELD MPLS_LABEL(2)[0] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[15], 0x42, "SET_FIELD MPLS_LABEL(2)[1] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[16], 0x10, "SET_FIELD MPLS_LABEL(2)[2] error."); TEST_ASSERT_EQUAL_MESSAGE(m->data[17], 0x00, "SET_FIELD MPLS_LABEL(2)[3] error."); }