int build_classifier(int if_count, char **if_names) { odp_pktio_t pktio; odp_cos_t cos_def; odp_cos_t cos_udp; odp_pmr_t pmr_udp; char name[80]; int i; cos_udp = build_cos_w_queue("cos_udp"); if (cos_udp == ODP_COS_INVALID) { OFP_ERR("Failed to create UDP COS"); return -1; } pmr_udp = build_udp_prm(); if (pmr_udp == ODP_PMR_INVAL) { OFP_ERR("Failed to create UDP PRM"); return -1; } for (i = 0; i < if_count; i++) { pktio = odp_pktio_lookup(if_names[i]); if (pktio == ODP_PKTIO_INVALID) { OFP_ERR("Failed to get pktio for interface %s\n", if_names[i]); return -1; } sprintf(name, "cos_default_%s", if_names[i]); cos_def = build_cos_set_queue(name, ofp_pktio_spq_get(pktio)); if (cos_def == ODP_COS_INVALID) { OFP_ERR("Failed to create default COS " "for interface %s\n", if_names[i]); return -1; } if (odp_pktio_default_cos_set(pktio, cos_def) < 0) { OFP_ERR("Failed to set default COS on interface %s\n", if_names[i]); return -1; } if (odp_pktio_error_cos_set(pktio, cos_def) < 0) { OFP_ERR("Failed to set error COS on interface %s\n", if_names[i]); return -1; } if (odp_pktio_pmr_cos(pmr_udp, pktio, cos_udp) < 0) { OFP_ERR("Failed to set UDP PRM on interface %s\n", if_names[i]); return 1; } } return 0; }
void configure_pmr_cos(void) { uint16_t val; uint16_t mask; int retval; val = CLS_PMR_SPORT; mask = 0xffff; odp_queue_param_t qparam; char cosname[ODP_COS_NAME_LEN]; char queuename[ODP_QUEUE_NAME_LEN]; pmr_list[CLS_PMR] = odp_pmr_create(ODP_PMR_UDP_SPORT, &val, &mask, sizeof(val)); CU_ASSERT(pmr_list[CLS_PMR] != ODP_PMR_INVAL); sprintf(cosname, "PMR_CoS"); cos_list[CLS_PMR] = odp_cos_create(cosname); CU_ASSERT_FATAL(cos_list[CLS_PMR] != ODP_COS_INVALID); qparam.sched.prio = ODP_SCHED_PRIO_HIGHEST; qparam.sched.sync = ODP_SCHED_SYNC_NONE; qparam.sched.group = ODP_SCHED_GROUP_ALL; sprintf(queuename, "%s", "PMR_CoS"); queue_list[CLS_PMR] = odp_queue_create(queuename, ODP_QUEUE_TYPE_SCHED, &qparam); CU_ASSERT_FATAL(queue_list[CLS_PMR] != ODP_QUEUE_INVALID); retval = odp_cos_set_queue(cos_list[CLS_PMR], queue_list[CLS_PMR]); CU_ASSERT(retval == 0); retval = odp_pktio_pmr_cos(pmr_list[CLS_PMR], pktio_loop, cos_list[CLS_PMR]); CU_ASSERT(retval == 0); }
void configure_cls_pmr_chain(void) { /* PKTIO --> PMR_SRC(SRC IP ADDR) --> PMR_DST (TCP SPORT) */ /* Packet matching only the SRC IP ADDR should be delivered in queue[CLS_PMR_CHAIN_SRC] and a packet matching both SRC IP ADDR and TCP SPORT should be delivered to queue[CLS_PMR_CHAIN_DST] */ uint16_t val; uint16_t maskport; int retval; char cosname[ODP_QUEUE_NAME_LEN]; odp_queue_param_t qparam; char queuename[ODP_QUEUE_NAME_LEN]; uint32_t addr; uint32_t mask; sprintf(cosname, "SrcCos"); cos_list[CLS_PMR_CHAIN_SRC] = odp_cos_create(cosname); CU_ASSERT_FATAL(cos_list[CLS_PMR_CHAIN_SRC] != ODP_COS_INVALID) qparam.sched.prio = ODP_SCHED_PRIO_NORMAL; qparam.sched.sync = ODP_SCHED_SYNC_NONE; qparam.sched.group = ODP_SCHED_GROUP_ALL; sprintf(queuename, "%s", "SrcQueue"); queue_list[CLS_PMR_CHAIN_SRC] = odp_queue_create(queuename, ODP_QUEUE_TYPE_SCHED, &qparam); CU_ASSERT_FATAL(queue_list[CLS_PMR_CHAIN_SRC] != ODP_QUEUE_INVALID); retval = odp_cos_set_queue(cos_list[CLS_PMR_CHAIN_SRC], queue_list[CLS_PMR_CHAIN_SRC]); CU_ASSERT(retval == 0); sprintf(cosname, "DstCos"); cos_list[CLS_PMR_CHAIN_DST] = odp_cos_create(cosname); CU_ASSERT_FATAL(cos_list[CLS_PMR_CHAIN_DST] != ODP_COS_INVALID); qparam.sched.prio = ODP_SCHED_PRIO_NORMAL; qparam.sched.sync = ODP_SCHED_SYNC_NONE; qparam.sched.group = ODP_SCHED_GROUP_ALL; sprintf(queuename, "%s", "DstQueue"); queue_list[CLS_PMR_CHAIN_DST] = odp_queue_create(queuename, ODP_QUEUE_TYPE_SCHED, &qparam); CU_ASSERT_FATAL(queue_list[CLS_PMR_CHAIN_DST] != ODP_QUEUE_INVALID); retval = odp_cos_set_queue(cos_list[CLS_PMR_CHAIN_DST], queue_list[CLS_PMR_CHAIN_DST]); parse_ipv4_string(CLS_PMR_CHAIN_SADDR, &addr, &mask); pmr_list[CLS_PMR_CHAIN_SRC] = odp_pmr_create(ODP_PMR_SIP_ADDR, &addr, &mask, sizeof(addr)); CU_ASSERT_FATAL(pmr_list[CLS_PMR_CHAIN_SRC] != ODP_PMR_INVAL); val = CLS_PMR_CHAIN_SPORT; maskport = 0xffff; pmr_list[CLS_PMR_CHAIN_DST] = odp_pmr_create(ODP_PMR_UDP_SPORT, &val, &maskport, sizeof(val)); CU_ASSERT_FATAL(pmr_list[CLS_PMR_CHAIN_DST] != ODP_PMR_INVAL); retval = odp_pktio_pmr_cos(pmr_list[CLS_PMR_CHAIN_SRC], pktio_loop, cos_list[CLS_PMR_CHAIN_SRC]); CU_ASSERT(retval == 0); retval = odp_cos_pmr_cos(pmr_list[CLS_PMR_CHAIN_DST], cos_list[CLS_PMR_CHAIN_SRC], cos_list[CLS_PMR_CHAIN_DST]); CU_ASSERT(retval == 0); }