Exemple #1
0
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]);
  }
}
Exemple #7
0
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);
}
Exemple #8
0
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.");
}
Exemple #9
0
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.");
}