示例#1
0
void
test_lagopus_find_flow(void) {
  datastore_bridge_info_t info;
  struct bridge *bridge;
  struct port *port;
  struct port nport;
  struct lagopus_packet *pkt;
  struct table *table;
  struct flow *flow;
  OS_MBUF *m;

  /* setup bridge and port */
  memset(&info, 0, sizeof(info));
  info.fail_mode = DATASTORE_BRIDGE_FAIL_MODE_SECURE;
  TEST_ASSERT_EQUAL(dp_bridge_create("br0", &info), LAGOPUS_RESULT_OK);
  TEST_ASSERT_EQUAL(dp_port_create("port0"), LAGOPUS_RESULT_OK);
  TEST_ASSERT_EQUAL(dp_port_create("port1"), LAGOPUS_RESULT_OK);
  TEST_ASSERT_EQUAL(dp_bridge_port_set("br0", "port0", 1), LAGOPUS_RESULT_OK);
  TEST_ASSERT_EQUAL(dp_bridge_port_set("br0", "port1", 2), LAGOPUS_RESULT_OK);

  pkt = alloc_lagopus_packet();
  TEST_ASSERT_NOT_NULL_MESSAGE(pkt, "lagopus_alloc_packet error.");
  m = PKT2MBUF(pkt);
  OS_M_APPEND(m, 64);
  m->refcnt = 2;

  bridge = dp_bridge_lookup("br0");
  TEST_ASSERT_NOT_NULL(bridge);
  lagopus_packet_init(pkt, m, port_lookup(&bridge->ports, 1));
  table = flowdb_get_table(pkt->in_port->bridge->flowdb, 0);
  table->userdata = new_flowinfo_eth_type();
  flow = lagopus_find_flow(pkt, table);
  TEST_ASSERT_EQUAL_MESSAGE(table->lookup_count, 0,
                            "lookup_count(misc) error.");
  TEST_ASSERT_NULL_MESSAGE(flow,
                           "flow(misc) error.");
  OS_MTOD(m, uint8_t *)[14] = 0x08;
  OS_MTOD(m, uint8_t *)[15] = 0x06;
  lagopus_packet_init(pkt, m, &port);
  flow = lagopus_find_flow(pkt, table);
  TEST_ASSERT_EQUAL_MESSAGE(table->lookup_count, 0,
                            "lookup_count(arp) error.");
  TEST_ASSERT_NULL_MESSAGE(flow,
                           "flow(arp) error.");
  OS_MTOD(m, uint8_t *)[14] = 0x08;
  OS_MTOD(m, uint8_t *)[15] = 0x00;
  lagopus_packet_init(pkt, m, port_lookup(&bridge->ports, 1));
  flow = lagopus_find_flow(pkt, table);
  TEST_ASSERT_EQUAL_MESSAGE(table->lookup_count, 0,
                            "lookup_count(ipv4) error.");
  TEST_ASSERT_NULL_MESSAGE(flow,
                           "flow(ipv4) error.");
  OS_MTOD(m, uint8_t *)[14] = 0x86;
  OS_MTOD(m, uint8_t *)[15] = 0xdd;
  OS_MTOD(m, uint8_t *)[20] = IPPROTO_TCP;
  lagopus_packet_init(pkt, m, port_lookup(&bridge->ports, 1));
  flow = lagopus_find_flow(pkt, table);
  TEST_ASSERT_EQUAL_MESSAGE(table->lookup_count, 0,
                            "lookup_count(ipv6) error.");
  TEST_ASSERT_NULL_MESSAGE(flow,
                           "flow(ipv6) error.");
  OS_MTOD(m, uint8_t *)[14] = 0x88;
  OS_MTOD(m, uint8_t *)[15] = 0x47;
  lagopus_packet_init(pkt, m, port_lookup(&bridge->ports, 1));
  flow = lagopus_find_flow(pkt, table);
  TEST_ASSERT_EQUAL_MESSAGE(table->lookup_count, 0,
                            "lookup_count(mpls) error.");
  TEST_ASSERT_NULL_MESSAGE(flow,
                           "flow(mpls) error.");
  OS_MTOD(m, uint8_t *)[14] = 0x88;
  OS_MTOD(m, uint8_t *)[15] = 0x48;
  lagopus_packet_init(pkt, m, port_lookup(&bridge->ports, 1));
  flow = lagopus_find_flow(pkt, table);
  TEST_ASSERT_EQUAL_MESSAGE(table->lookup_count, 0,
                            "lookup_count(mpls-mc) error.");
  TEST_ASSERT_NULL_MESSAGE(flow,
                           "flow(mpls-mc) error.");
  OS_MTOD(m, uint8_t *)[14] = 0x88;
  OS_MTOD(m, uint8_t *)[15] = 0xe7;
  lagopus_packet_init(pkt, m, port_lookup(&bridge->ports, 1));
  flow = lagopus_find_flow(pkt, table);
  TEST_ASSERT_EQUAL_MESSAGE(table->lookup_count, 0,
                            "lookup_count(pbb) error.");
  TEST_ASSERT_NULL_MESSAGE(flow,
                           "flow(pbb) error.");
}
示例#2
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.");
}