X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=VNFs%2FDPPD-PROX%2Fprox_args.c;h=09e903b5c3cac6d54616cdeac5fcb25dc765e355;hb=b950110b2a8a23ac498deef1bebca643f80c38b1;hp=25599cb71e5fe34b8b6ad9575251a3812d799a68;hpb=c871c361f9d69a93429ae385e7dbf21a46aa6857;p=samplevnf.git diff --git a/VNFs/DPPD-PROX/prox_args.c b/VNFs/DPPD-PROX/prox_args.c index 25599cb7..09e903b5 100644 --- a/VNFs/DPPD-PROX/prox_args.c +++ b/VNFs/DPPD-PROX/prox_args.c @@ -38,9 +38,10 @@ #include "defines.h" #include "prox_ipv6.h" #include "prox_compat.h" +#include "ip_subnet.h" #define MAX_RTE_ARGV 64 -#define MAX_ARG_LEN 64 +#define MAX_ARG_LEN 256 struct cfg_depr { const char *opt; @@ -531,7 +532,7 @@ static int get_port_cfg(unsigned sindex, char *str, void *data) } else if (STR_EQ(str, "name")) { uint32_t val; - prox_strncpy(cfg->name, pkey, MAX_NAME_SIZE); + prox_strncpy(cfg->names[0], pkey, MAX_NAME_SIZE); PROX_ASSERT(cur_if < PROX_MAX_PORTS); return add_port_name(cur_if, pkey); } @@ -541,6 +542,16 @@ static int get_port_cfg(unsigned sindex, char *str, void *data) else if (STR_EQ(str, "tx desc")) { return parse_int(&cfg->n_txd, pkey); } + else if (STR_EQ(str, "ipv6 mask length")) { + return parse_int(&cfg->v6_mask_length, pkey); + } + else if (STR_EQ(str, "all_rx_queues")) { + uint32_t val; + if (parse_bool(&val, pkey)) { + return -1; + } + cfg->all_rx_queues = val; + } else if (STR_EQ(str, "promiscuous")) { uint32_t val; if (parse_bool(&val, pkey)) { @@ -568,7 +579,18 @@ static int get_port_cfg(unsigned sindex, char *str, void *data) cfg->lsc_val = val; } else if (STR_EQ(str, "local ipv4")) { - return parse_ip(&cfg->ip, pkey); + if (parse_ip_set(cfg->ip_addr, pkey, PROX_MAX_VLAN_TAGS) != 0) { + cfg->ip_addr[0].ip = 24; + return parse_ip(&cfg->ip_addr[0].ip, pkey); + } + return 0; + } + else if (STR_EQ(str, "virtual")) { + uint32_t val; + if (parse_bool(&val, pkey)) { + return -1; + } + cfg->virtual = val; } else if (STR_EQ(str, "vdev")) { prox_strncpy(cfg->vdev, pkey, MAX_NAME_SIZE); @@ -604,7 +626,7 @@ static int get_port_cfg(unsigned sindex, char *str, void *data) } else if (STR_EQ(str, "vlan tag")) { - return parse_int(&cfg->vlan_tag, pkey); + return parse_int_set(cfg->vlan_tags, pkey, sizeof(cfg->vlan_tags) / sizeof(cfg->vlan_tags[0])); } else if (STR_EQ(str, "vlan")) { #if RTE_VERSION >= RTE_VERSION_NUM(18,8,0,1) @@ -633,10 +655,14 @@ static int get_port_cfg(unsigned sindex, char *str, void *data) // A frame of 1526 bytes (1500 bytes mtu, 14 bytes hdr, 4 bytes crc and 8 bytes vlan) // should not be considered as a jumbo frame. However rte_ethdev.c considers that // the max_rx_pkt_len for a non jumbo frame is 1518 +#if RTE_VERSION < RTE_VERSION_NUM(21,11,0,0) cfg->port_conf.rxmode.max_rx_pkt_len = cfg->mtu + PROX_RTE_ETHER_HDR_LEN + PROX_RTE_ETHER_CRC_LEN; - if (cfg->port_conf.rxmode.max_rx_pkt_len > PROX_RTE_ETHER_MAX_LEN) { + if (cfg->port_conf.rxmode.max_rx_pkt_len > PROX_RTE_ETHER_MAX_LEN) +#else + cfg->port_conf.rxmode.mtu = cfg->mtu; + if (cfg->port_conf.rxmode.mtu > PROX_RTE_ETHER_MAX_LEN - PROX_RTE_ETHER_HDR_LEN - PROX_RTE_ETHER_CRC_LEN) +#endif cfg->requested_rx_offload |= DEV_RX_OFFLOAD_JUMBO_FRAME; - } } } @@ -901,6 +927,9 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) return parse_flag(&targ->runtime_flags, TASK_FP_HANDLE_ARP, pkey); } + if (STR_EQ(str, "do not forward geneve")) { + return parse_flag(&targ->runtime_flags, TASK_DO_NOT_FWD_GENEVE, pkey); + } /* Using tx port name, only a _single_ port can be assigned to a task. */ if (STR_EQ(str, "tx port")) { if (targ->nb_txports > 0) { @@ -1000,6 +1029,18 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) if (STR_EQ(str, "random")) { return parse_str(targ->rand_str[targ->n_rand_str++], pkey, sizeof(targ->rand_str[0])); } + if (STR_EQ(str, "range")) { + int rc = parse_range(&targ->range[targ->n_ranges].min, &targ->range[targ->n_ranges].max, pkey); + targ->n_ranges++; + return rc; + } + if (STR_EQ(str, "range_offset")) { + if (targ->n_ranges == 0) { + set_errf("No range defined previously (use range=...)"); + return -1; + } + return parse_int(&targ->range[targ->n_ranges - 1].offset, pkey); + } if (STR_EQ(str, "rand_offset")) { if (targ->n_rand_str == 0) { set_errf("No random defined previously (use random=...)"); @@ -1110,6 +1151,9 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) if (STR_EQ(str, "latency buffer size")) { return parse_int(&targ->latency_buffer_size, pkey); } + if (STR_EQ(str, "loss buffer size")) { + return parse_int(&targ->loss_buffer_size, pkey); + } if (STR_EQ(str, "accuracy pos")) { return parse_int(&targ->accur_pos, pkey); } @@ -1126,7 +1170,16 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) if (STR_EQ(str, "packet id pos")) { return parse_int(&targ->packet_id_pos, pkey); } - if (STR_EQ(str, "probability")) { + if (STR_EQ(str, "flow id pos")) { + return parse_int(&targ->flow_id_pos, pkey); + } + if (STR_EQ(str, "packet id in flow pos")) { + return parse_int(&targ->packet_id_in_flow_pos, pkey); + } + if (STR_EQ(str, "flow count")) { + return parse_int(&targ->flow_count, pkey); + } + if (STR_EQ(str, "probability")) { // old - use "probability no drop" instead float probability; int rc = parse_float(&probability, pkey); if (probability == 0) { @@ -1136,9 +1189,44 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) set_errf("Probability must be < 100\n"); return -1; } - targ->probability = probability * 10000; + targ->probability_no_drop = probability * 10000; + return rc; + } + if (STR_EQ(str, "proba no drop")) { + float probability; + int rc = parse_float(&probability, pkey); + if (probability == 0) { + set_errf("probability no drop must be != 0\n"); + return -1; + } else if (probability > 100.0) { + set_errf("Probability must be < 100\n"); + return -1; + } + targ->probability_no_drop = probability * 10000; + return rc; + } + if (STR_EQ(str, "proba delay")) { + float probability; + int rc = parse_float(&probability, pkey); + if (probability > 100.0) { + set_errf("Probability must be < 100\n"); + return -1; + } + targ->probability_delay = probability * 10000; + return rc; + } +#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) + if (STR_EQ(str, "proba duplicate")) { + float probability; + int rc = parse_float(&probability, pkey); + if (probability > 100.0) { + set_errf("probability duplicate must be < 100\n"); + return -1; + } + targ->probability_duplicate = probability * 10000; return rc; } +#endif if (STR_EQ(str, "concur conn")) { return parse_int(&targ->n_concur_conn, pkey); } @@ -1472,9 +1560,14 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) } return 0; } + if (STR_EQ(str, "gateway ipv6")) { /* Gateway IP address used when generating */ + if ((targ->flags & TASK_ARG_NDP) == 0) + plog_warn("gateway ipv6 configured but NDP sub mode not enabled\n"); + return parse_ip6(&targ->gateway_ipv6, pkey); + } if (STR_EQ(str, "local ipv4")) { /* source IP address to be used for packets */ struct ip4_subnet cidr; - if (parse_ip4_cidr(&cidr, pkey) != 0) { + if (parse_ip4_and_prefix(&cidr, pkey) != 0) { if (targ->gateway_ipv4) targ->local_prefix = 32; else @@ -1528,6 +1621,8 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) return parse_int(&targ->arp_ndp_retransmit_timeout, pkey); if (STR_EQ(str, "number of packets")) return parse_int(&targ->n_pkts, pkey); + if (STR_EQ(str, "store size")) + return parse_int(&targ->store_max, pkey); if (STR_EQ(str, "pipes")) { uint32_t val; int err = parse_int(&val, pkey); @@ -1547,7 +1642,7 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) if (err) { return -1; } -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) targ->qos_conf.subport_params[0].qsize[0] = val; targ->qos_conf.subport_params[0].qsize[1] = val; targ->qos_conf.subport_params[0].qsize[2] = val; @@ -1561,45 +1656,69 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) return 0; } if (STR_EQ(str, "subport tb rate")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION >= RTE_VERSION_NUM(20,11,0,0) + return parse_u64(&targ->qos_conf.port_params.subport_profiles->tb_rate, pkey); +#else +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.subport_params[0].tb_rate, pkey); #else return parse_int(&targ->qos_conf.subport_params[0].tb_rate, pkey); +#endif #endif } if (STR_EQ(str, "subport tb size")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION >= RTE_VERSION_NUM(20,11,0,0) + return parse_u64(&targ->qos_conf.port_params.subport_profiles->tb_size, pkey); +#else +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.subport_params[0].tb_size, pkey); #else return parse_int(&targ->qos_conf.subport_params[0].tb_size, pkey); +#endif #endif } if (STR_EQ(str, "subport tc 0 rate")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION >= RTE_VERSION_NUM(20,11,0,0) + return parse_u64(&targ->qos_conf.port_params.subport_profiles->tc_rate[0], pkey); +#else +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.subport_params[0].tc_rate[0], pkey); #else return parse_int(&targ->qos_conf.subport_params[0].tc_rate[0], pkey); +#endif #endif } if (STR_EQ(str, "subport tc 1 rate")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION >= RTE_VERSION_NUM(20,11,0,0) + return parse_u64(&targ->qos_conf.port_params.subport_profiles->tc_rate[1], pkey); +#else +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.subport_params[0].tc_rate[1], pkey); #else return parse_int(&targ->qos_conf.subport_params[0].tc_rate[1], pkey); +#endif #endif } if (STR_EQ(str, "subport tc 2 rate")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION >= RTE_VERSION_NUM(20,11,0,0) + return parse_u64(&targ->qos_conf.port_params.subport_profiles->tc_rate[2], pkey); +#else +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.subport_params[0].tc_rate[2], pkey); #else return parse_int(&targ->qos_conf.subport_params[0].tc_rate[2], pkey); +#endif #endif } if (STR_EQ(str, "subport tc 3 rate")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION >= RTE_VERSION_NUM(20,11,0,0) + return parse_u64(&targ->qos_conf.port_params.subport_profiles->tc_rate[3], pkey); +#else +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.subport_params[0].tc_rate[3], pkey); #else return parse_int(&targ->qos_conf.subport_params[0].tc_rate[3], pkey); +#endif #endif } @@ -1610,29 +1729,40 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) return -1; } +#if RTE_VERSION >= RTE_VERSION_NUM(20,11,0,0) + targ->qos_conf.port_params.subport_profiles->tc_rate[0] = val; + targ->qos_conf.port_params.subport_profiles->tc_rate[1] = val; + targ->qos_conf.port_params.subport_profiles->tc_rate[2] = val; + targ->qos_conf.port_params.subport_profiles->tc_rate[3] = val; +#else targ->qos_conf.subport_params[0].tc_rate[0] = val; targ->qos_conf.subport_params[0].tc_rate[1] = val; targ->qos_conf.subport_params[0].tc_rate[2] = val; targ->qos_conf.subport_params[0].tc_rate[3] = val; +#endif return 0; } if (STR_EQ(str, "subport tc period")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION >= RTE_VERSION_NUM(20,11,0,0) + return parse_u64(&targ->qos_conf.port_params.subport_profiles->tc_period, pkey); +#else +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.subport_params[0].tc_period, pkey); #else return parse_int(&targ->qos_conf.subport_params[0].tc_period, pkey); +#endif #endif } if (STR_EQ(str, "pipe tb rate")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.pipe_params[0].tb_rate, pkey); #else return parse_int(&targ->qos_conf.pipe_params[0].tb_rate, pkey); #endif } if (STR_EQ(str, "pipe tb size")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.pipe_params[0].tb_size, pkey); #else return parse_int(&targ->qos_conf.pipe_params[0].tb_size, pkey); @@ -1652,35 +1782,35 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) return 0; } if (STR_EQ(str, "pipe tc 0 rate")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.pipe_params[0].tc_rate[0], pkey); #else return parse_int(&targ->qos_conf.pipe_params[0].tc_rate[0], pkey); #endif } if (STR_EQ(str, "pipe tc 1 rate")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.pipe_params[0].tc_rate[1], pkey); #else return parse_int(&targ->qos_conf.pipe_params[0].tc_rate[1], pkey); #endif } if (STR_EQ(str, "pipe tc 2 rate")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.pipe_params[0].tc_rate[2], pkey); #else return parse_int(&targ->qos_conf.pipe_params[0].tc_rate[2], pkey); #endif } if (STR_EQ(str, "pipe tc 3 rate")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.pipe_params[0].tc_rate[3], pkey); #else return parse_int(&targ->qos_conf.pipe_params[0].tc_rate[3], pkey); #endif } if (STR_EQ(str, "pipe tc period")) { -#if RTE_VERSION >= RTE_VERSION_NUM(19,11,0,0) +#if RTE_VERSION > RTE_VERSION_NUM(19,11,0,0) return parse_u64(&targ->qos_conf.pipe_params[0].tc_period, pkey); #else return parse_int(&targ->qos_conf.pipe_params[0].tc_period, pkey); @@ -1777,31 +1907,41 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) return parse_int(&targ->n_max_rules, pkey); } - if (STR_EQ(str, "tunnel hop limit")) { - uint32_t val; - int err = parse_int(&val, pkey); - if (err) { - return -1; - } - targ->tunnel_hop_limit = val; - return 0; - } + if (STR_EQ(str, "tunnel hop limit")) { + uint32_t val; + int err = parse_int(&val, pkey); + if (err) { + return -1; + } + targ->tunnel_hop_limit = val; + return 0; + } - if (STR_EQ(str, "lookup port mask")) { - uint32_t val; - int err = parse_int(&val, pkey); - if (err) { - return -1; - } - targ->lookup_port_mask = val; - return 0; - } + if (STR_EQ(str, "lookup port mask")) { + uint32_t val; + int err = parse_int(&val, pkey); + if (err) { + return -1; + } + targ->lookup_port_mask = val; + return 0; + } if (STR_EQ(str, "irq debug")) { parse_int(&targ->irq_debug, pkey); return 0; } + if (STR_EQ(str, "multiplier")) { + parse_int(&targ->multiplier, pkey); + return 0; + } + + if (STR_EQ(str, "mirror size")) { + parse_int(&targ->mirror_size, pkey); + return 0; + } + set_errf("Option '%s' is not known", str); /* fail on unknown keys */ return -1; @@ -2160,10 +2300,14 @@ int prox_setup_rte(const char *prog_name) sprintf(rte_arg[++argc], "-c%s", tmp); rte_argv[argc] = rte_arg[argc]; #if RTE_VERSION >= RTE_VERSION_NUM(1,8,0,0) + uint32_t master_core = prox_cfg.master; if (prox_cfg.flags & DSF_USE_DUMMY_CPU_TOPO) - sprintf(rte_arg[++argc], "--master-lcore=%u", 0); - else - sprintf(rte_arg[++argc], "--master-lcore=%u", prox_cfg.master); + master_core = 0; +#if RTE_VERSION < RTE_VERSION_NUM(21,11,0,0) + sprintf(rte_arg[++argc], "--master-lcore=%u", master_core); +#else + sprintf(rte_arg[++argc], "--main-lcore=%u", master_core); +#endif rte_argv[argc] = rte_arg[argc]; #else /* For old DPDK versions, the master core had to be the first @@ -2226,7 +2370,7 @@ int prox_setup_rte(const char *prog_name) if (ptr) { *ptr++ = '\0'; } - strcpy(rte_arg[++argc], ptr2); + prox_strncpy(rte_arg[++argc], ptr2, MAX_ARG_LEN); rte_argv[argc] = rte_arg[argc]; } } @@ -2279,7 +2423,7 @@ int prox_setup_rte(const char *prog_name) } uint16_t port_id; for (int i = 0; i < n_deferred_ports; i++) { - if (rte_eth_dev_get_port_by_name(deferred_port[i].name, &port_id) != 0) { + if (prox_rte_eth_dev_get_port_by_name(deferred_port[i].name, &port_id) != 0) { plog_err("Did not find port name %s used while reading %s\n", deferred_port[i].name, deferred_port[i].is_rx_port ? "rx port" : "tx_port"); return -1; }