void test_match_basic_PHY_PORT(void) { struct lagopus_packet pkt; struct port port; struct flow *flow; OS_MBUF *m; bool rv; /* prepare packet */ memset(&port, 0, sizeof(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 = allocate_test_flow(10 * sizeof(struct match)); /* Port */ FLOW_ADD_PORT_MATCH(flow, 4); add_match(&flow->match_list, 4, OFPXMT_OFB_IN_PHY_PORT << 1, 0x00, 0x00, 0x00, 0x04); refresh_match(flow); lagopus_packet_init(&pkt, m, &port); pkt.oob_data.in_port = htonl(4); pkt.oob_data.in_phy_port = htonl(1); rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, false, "IN_PHY_PORT mismatch error."); pkt.oob_data.in_phy_port = htonl(4); rv = match_basic(&pkt, flow); TEST_ASSERT_EQUAL_MESSAGE(rv, true, "IN_PHY_PORT match error."); }
void setUp(void) { size_t s; lagopus_ip_address_t *addr; struct sockaddr_in *sin; uint8_t *p; /* Make the root flowinfo. */ TEST_ASSERT_NULL(flowinfo); flowinfo = new_flowinfo_vlan_vid(); TEST_ASSERT_NOT_NULL(flowinfo); TEST_ASSERT_FLOWINFO_FLOW_NUM(flowinfo, 0, __func__); /* * Make the test flows. * * ARP matches have the prerequisite. */ for (s = 0; s < ARRAY_LEN(test_flow); s++) { TEST_ASSERT_NULL(test_flow[s]); test_flow[s] = allocate_test_flow(10 * sizeof(struct match)); TEST_ASSERT_NOT_NULL(test_flow[s]); test_flow[s]->priority = (int)s; FLOW_ADD_ARP_PREREQUISITE(test_flow[s]); } /* Make the test addresses. */ for (s = 0; s < ARRAY_LEN(test_flow); s++) { lagopus_ip_address_create(ipv4srcstr, true, &addr); sin = NULL; lagopus_ip_address_sockaddr_get(addr, &sin); lagopus_ip_address_destroy(addr); p = (uint8_t *)&sin->sin_addr.s_addr; p[sizeof(sin->sin_addr.s_addr) - 1] = (uint8_t)(TEST_IPV4_ADDR_LSB(s) & 0xff); OS_MEMCPY(&ipv4src[s], &sin->sin_addr, sizeof(ipv4src[s])); lagopus_ip_address_create(ipv4tgtstr, true, &addr); sin = NULL; lagopus_ip_address_sockaddr_get(addr, &sin); lagopus_ip_address_destroy(addr); p = (uint8_t *)&sin->sin_addr.s_addr; p[sizeof(sin->sin_addr.s_addr) - 1] = (uint8_t)(TEST_IPV4_ADDR_LSB(s) & 0xff); OS_MEMCPY(&ipv4tgt[s], &sin->sin_addr, sizeof(ipv4tgt[s])); lagopus_ip_address_create(ipv4maskstr, true, &addr); sin = NULL; lagopus_ip_address_sockaddr_get(addr, &sin); lagopus_ip_address_destroy(addr); OS_MEMCPY(&ipv4mask[s], &sin->sin_addr, sizeof(ipv4mask[s])); } }
void setUp(void) { size_t s; /* Make the root flowinfo. */ TEST_ASSERT_NULL(flowinfo); flowinfo = new_flowinfo_vlan_vid(); TEST_ASSERT_NOT_NULL(flowinfo); TEST_ASSERT_FLOWINFO_FLOW_NUM(flowinfo, 0, __func__); /* Make the test flows. */ for (s = 0; s < ARRAY_LEN(test_flow); s++) { TEST_ASSERT_NULL(test_flow[s]); test_flow[s] = allocate_test_flow(10 * sizeof(struct match)); TEST_ASSERT_NOT_NULL(test_flow[s]); test_flow[s]->priority = (int)s; } }
void setUp(void) { size_t s; struct addrunion au; uint8_t *p; /* Make the root flowinfo. */ TEST_ASSERT_NULL(flowinfo); flowinfo = new_flowinfo_vlan_vid(); TEST_ASSERT_NOT_NULL(flowinfo); TEST_ASSERT_FLOWINFO_FLOW_NUM(flowinfo, 0, __func__); /* * Make the test flows. * * ARP matches have the prerequisite. */ for (s = 0; s < ARRAY_LEN(test_flow); s++) { TEST_ASSERT_NULL(test_flow[s]); test_flow[s] = allocate_test_flow(10 * sizeof(struct match)); TEST_ASSERT_NOT_NULL(test_flow[s]); test_flow[s]->priority = (int)s; FLOW_ADD_ARP_PREREQUISITE(test_flow[s]); } /* Make the test addresses. */ for (s = 0; s < ARRAY_LEN(test_flow); s++) { addrunion_ipv4_set(&au, ipv4srcstr); p = (uint8_t *)&au.addr4.s_addr; p[sizeof(au.addr4.s_addr) - 1] = (uint8_t)(TEST_IPV4_ADDR_LSB(s) & 0xff); OS_MEMCPY(&ipv4src[s], &au.addr4, sizeof(ipv4src[s])); addrunion_ipv4_set(&au, ipv4tgtstr); p = (uint8_t *)&au.addr4.s_addr; p[sizeof(au.addr4.s_addr) - 1] = (uint8_t)(TEST_IPV4_ADDR_LSB(s) & 0xff); OS_MEMCPY(&ipv4tgt[s], &au.addr4, sizeof(ipv4tgt[s])); addrunion_ipv4_set(&au, ipv4maskstr); OS_MEMCPY(&ipv4mask[s], &au.addr4, sizeof(ipv4mask[s])); } }
void setUp(void) { size_t s; uint8_t *p; /* Make the root flowinfo. */ TEST_ASSERT_NULL(flowinfo); flowinfo = new_flowinfo_vlan_vid(); TEST_ASSERT_NOT_NULL(flowinfo); TEST_ASSERT_FLOWINFO_FLOW_NUM(flowinfo, 0, __func__); /* * Make the test flows. * * IPv6 matches have prerequisite. */ for (s = 0; s < ARRAY_LEN(test_flow); s++) { TEST_ASSERT_NULL(test_flow[s]); test_flow[s] = allocate_test_flow(10 * sizeof(struct match)); TEST_ASSERT_NOT_NULL(test_flow[s]); test_flow[s]->priority = (int)s; FLOW_ADD_IPV6_PREREQUISITE(test_flow[s]); } /* Make the test addresses. */ for (s = 0; s < ARRAY_LEN(test_flow); s++) { addrunion_ipv6_set(&testsrc[s], testsrcstr); p = (uint8_t *)&testsrc[s].addr6.s6_addr; p[sizeof(testsrc[s].addr6.s6_addr) - 1] = (uint8_t)(TEST_IPV6_ADDR_LSB( s) & 0xff); addrunion_ipv6_set(&testdst[s], testdststr); p = (uint8_t *)&testdst[s].addr6.s6_addr; p[sizeof(testsrc[s].addr6.s6_addr) - 1] = (uint8_t)(TEST_IPV6_ADDR_LSB( s) & 0xff); addrunion_ipv6_set(&testmask[s], testmaskstr); } }
void setUp(void) { size_t s; /* Make the root flowinfo. */ TEST_ASSERT_NULL(flowinfo); flowinfo = new_flowinfo_vlan_vid(); TEST_ASSERT_NOT_NULL(flowinfo); TEST_ASSERT_FLOWINFO_FLOW_NUM(flowinfo, 0, __func__); /* * Make the test flows. * * MPLS matches have prerequisite. */ for (s = 0; s < ARRAY_LEN(test_flow); s++) { TEST_ASSERT_NULL(test_flow[s]); test_flow[s] = allocate_test_flow(10 * sizeof(struct match)); TEST_ASSERT_NOT_NULL(test_flow[s]); test_flow[s]->priority = (int)s; FLOW_ADD_MPLS_UT_PREREQUISITE(test_flow[s]); } }
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_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_match_flow_basic(void) { struct lagopus_packet pkt; struct flowinfo *flowinfo; struct flow *flow; struct port port; OS_MBUF *m; int32_t prio; int i, nflow; /* prepare flow table */ test_flow[0] = allocate_test_flow(10 * sizeof(struct match)); test_flow[0]->priority = 3; FLOW_ADD_PORT_MATCH(test_flow[0], 1); 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_basic(); nflow = sizeof(test_flow) / sizeof(test_flow[0]); for (i = 0; i < nflow; i++) { flowinfo->add_func(flowinfo, test_flow[i]); } /* 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; lagopus_packet_init(&pkt, m, &port); /* test */ prio = 0; pkt.oob_data.in_port = htonl(1); flow = flowinfo->match_func(flowinfo, &pkt, &prio); TEST_ASSERT_EQUAL_MESSAGE(flow, test_flow[0], "Port 1 match (prio 0) flow error."); TEST_ASSERT_EQUAL_MESSAGE(prio, 3, "Port 1 match (prio 0) prio error."); prio = 1; flow = flowinfo->match_func(flowinfo, &pkt, &prio); TEST_ASSERT_EQUAL_MESSAGE(flow, test_flow[0], "Port 1 match (prio 1) flow error."); TEST_ASSERT_EQUAL_MESSAGE(prio, 3, "Port 1 match (prio 1) prio error."); prio = 2; flow = flowinfo->match_func(flowinfo, &pkt, &prio); TEST_ASSERT_EQUAL_MESSAGE(flow, test_flow[0], "Port 1 match (prio 2) flow error."); TEST_ASSERT_EQUAL_MESSAGE(prio, 3, "Port 1 match (prio 2) prio error."); flow = flowinfo->match_func(flowinfo, &pkt, &prio); TEST_ASSERT_EQUAL_MESSAGE(flow, NULL, "Port 1 match (prio 3) flow error."); prio = 0; pkt.oob_data.in_port = htonl(2); flow = flowinfo->match_func(flowinfo, &pkt, &prio); TEST_ASSERT_EQUAL_MESSAGE(flow, test_flow[1], "Port 2 match (prio 0) flow error."); TEST_ASSERT_EQUAL_MESSAGE(prio, 2, "Port 2 match (prio 0) prio error."); prio = 1; flow = flowinfo->match_func(flowinfo, &pkt, &prio); TEST_ASSERT_EQUAL_MESSAGE(flow, test_flow[1], "Port 2 match (prio 1) flow error."); TEST_ASSERT_EQUAL_MESSAGE(prio, 2, "Port 2 match (prio 1) prio error."); flow = flowinfo->match_func(flowinfo, &pkt, &prio); TEST_ASSERT_EQUAL_MESSAGE(flow, NULL, "Port 2 match (prio 2) flow error."); TEST_ASSERT_EQUAL_MESSAGE(prio, 2, "Port 2 match (prio 2) prio error."); prio = 3; flow = flowinfo->match_func(flowinfo, &pkt, &prio); TEST_ASSERT_EQUAL_MESSAGE(flow, NULL, "Port 2 match (prio 3) flow error."); prio = 0; pkt.oob_data.in_port = htonl(3); flow = flowinfo->match_func(flowinfo, &pkt, &prio); TEST_ASSERT_EQUAL_MESSAGE(flow, test_flow[2], "Port 3 match (prio 0) flow error."); TEST_ASSERT_EQUAL_MESSAGE(prio, 1, "Port 3 match (prio 0) prio error."); flow = flowinfo->match_func(flowinfo, &pkt, &prio); TEST_ASSERT_EQUAL_MESSAGE(flow, NULL, "Port 3 match (prio 1) error."); prio = 0; pkt.oob_data.in_port = htonl(4); flow = flowinfo->match_func(flowinfo, &pkt, &prio); TEST_ASSERT_NULL_MESSAGE(flow, "mismatch error."); }