From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.ehu.eus (smtp.lg.ehu.es [158.227.0.66]) by dpdk.org (Postfix) with ESMTP id C3CD438EB for ; Fri, 22 Apr 2016 10:08:54 +0200 (CEST) Received: from smtp.ehu.eus (localhost.localdomain [127.0.0.1]) by postfix.imss71 (Postfix) with ESMTP id 425AB2D718; Fri, 22 Apr 2016 10:08:54 +0200 (CEST) Received: from murillo.dhcp.i2t.ehu.eus (unknown [158.227.98.37]) by smtp1 (Postfix) with ESMTPS id 2B3792D1F7; Fri, 22 Apr 2016 10:08:54 +0200 (CEST) From: "inaki.murillo" To: dev@dpdk.org Cc: "inaki.murillo" Date: Fri, 22 Apr 2016 10:07:24 +0200 Message-Id: <1461312444-19414-1-git-send-email-inaki.murilloa@ehu.eus> X-Mailer: git-send-email 1.9.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.4 (smtp1 [0.0.0.0]); Fri, 22 Apr 2016 10:08:54 +0200 (CEST) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.4 (postfix.imss71 [0.0.0.0]); Fri, 22 Apr 2016 10:08:54 +0200 (CEST) Subject: [dpdk-dev] [PATCH v2][PKTGEN] Rate as a decimal number X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Apr 2016 08:08:55 -0000 Currently Pktgen does not accept a decimal number for the rate. This patch makes possible to set a decimal number as a rate. Signed-off-by: IƱaki Murillo Arroyo --- app/cmd-functions.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++--- app/cmd-functions.h | 38 +++++++++++++++++++++++++++ app/lpktgenlib.c | 2 +- app/pktgen-cmds.c | 10 ++++---- app/pktgen-cmds.h | 2 +- app/pktgen-port-cfg.h | 2 +- app/pktgen.c | 2 +- 7 files changed, 115 insertions(+), 12 deletions(-) diff --git a/app/cmd-functions.c b/app/cmd-functions.c index b2fda7c..84809bb 100644 --- a/app/cmd-functions.c +++ b/app/cmd-functions.c @@ -1805,7 +1805,7 @@ struct cmd_set_result { cmdline_fixed_string_t set; cmdline_portlist_t portlist; cmdline_fixed_string_t what; - uint32_t value; + float value; }; /**************************************************************************//** @@ -1865,8 +1865,8 @@ cmdline_parse_token_string_t cmd_set_what = TOKEN_STRING_INITIALIZER(struct cmd_set_result, what, "count#size#rate#burst#tx_cycles#sport#dport#seqCnt#prime#dump#vlanid"); -cmdline_parse_token_num_t cmd_set_value = - TOKEN_NUM_INITIALIZER(struct cmd_set_result, value, UINT32); +cmdline_parse_token_float_t cmd_set_value = + TOKEN_FLOAT_INITIALIZER(struct cmd_set_result, value, FLOAT); cmdline_parse_inst_t cmd_set = { .f = cmd_set_parsed, @@ -4691,3 +4691,68 @@ pktgen_load_cmds(char *filename) } return 0; } + +struct cmdline_token_ops cmdline_token_float_ops = { + .parse = cmdline_parse_float, + .complete_get_nb = NULL, + .complete_get_elt = NULL, + .get_help = cmdline_get_help_float, +}; + +/* parse a float */ +int +cmdline_parse_float(cmdline_parse_token_hdr_t *tk, const char *srcbuf, + void *res, unsigned ressize) +{ + unsigned int token_len; + float tmp; + + if (res && ressize < STR_TOKEN_SIZE) + return -1; + + if (!tk || !srcbuf || !*srcbuf) + return -1; + + token_len = 0; + while (!cmdline_isendoftoken(srcbuf[token_len]) && token_len < (STR_TOKEN_SIZE-1)){ + token_len++; + } + + /* return if token too long */ + if (token_len >= STR_TOKEN_SIZE - 1) + return -1; + + tmp = atof(srcbuf); + if ((tmp == 0 && strcmp(srcbuf, "0") == 0) || (tmp != 0)) { + /* we are sure that token_len is < STR_TOKEN_SIZE-1 */ + *(float *)res = tmp; + return token_len; + } + + return -1; + +} + +/* parse a float */ +int +cmdline_get_help_float(cmdline_parse_token_hdr_t *tk, + char *dstbuf, unsigned int size) +{ + struct cmdline_token_float_data nd; + int ret; + + if (!tk) + return -1; + + memcpy(&nd, &((struct cmdline_token_float *)tk)->float_data, sizeof(nd)); + + /* should not happen.... don't so this test */ + /* if (nd.type >= (sizeof(num_help)/sizeof(const char *))) */ + /* return -1; */ + + ret = snprintf(dstbuf, size, "FLOAT"); + if (ret < 0) + return -1; + dstbuf[size-1] = '\0'; + return 0; +} diff --git a/app/cmd-functions.h b/app/cmd-functions.h index 0ccef6d..4b8dc4c 100644 --- a/app/cmd-functions.h +++ b/app/cmd-functions.h @@ -77,4 +77,42 @@ extern void pktgen_cmdline_start(void); extern int pktgen_load_cmds(char *filename); +/* size of a parsed string */ +#define STR_TOKEN_SIZE 128 + +enum cmdline_floattype { + FLOAT +}; + +struct cmdline_token_float_data { + const float *float_data; +}; + +struct cmdline_token_float { + struct cmdline_token_hdr hdr; + struct cmdline_token_float_data float_data; +}; +typedef struct cmdline_token_float cmdline_parse_token_float_t; + +extern struct cmdline_token_ops cmdline_token_float_ops; + +int cmdline_parse_float(cmdline_parse_token_hdr_t *tk, + const char *srcbuf, void *res, unsigned ressize); +int cmdline_get_help_float(cmdline_parse_token_hdr_t *tk, + char *dstbuf, unsigned int size); + +#define TOKEN_FLOAT_INITIALIZER(structure, field, float_type) \ +{ \ + /* hdr */ \ + { \ + &cmdline_token_float_ops, /* ops */ \ + offsetof(structure, field), /* offset */ \ + }, \ + /* num_data */ \ + { \ + float_type, /* type */ \ + }, \ +} + + #endif /* _COMMANDS_H_ */ diff --git a/app/lpktgenlib.c b/app/lpktgenlib.c index 693a174..f3a2a84 100644 --- a/app/lpktgenlib.c +++ b/app/lpktgenlib.c @@ -240,7 +240,7 @@ parse_portlist(const char *buf, void *pl) { static int pktgen_set(lua_State *L) { - uint32_t value; + float value; cmdline_portlist_t portlist; char *what; diff --git a/app/pktgen-cmds.c b/app/pktgen-cmds.c index 83ba230..d150b41 100644 --- a/app/pktgen-cmds.c +++ b/app/pktgen-cmds.c @@ -178,7 +178,7 @@ pktgen_save(char *path) fprintf(fd, "#\n"); flags = rte_atomic32_read(&info->port_flags); fprintf(fd, - "# Port: %2d, Burst:%3d, Rate:%3d%%, Flags:%08x, TX Count:%s\n", + "# Port: %2d, Burst:%3d, Rate:%3f%%, Flags:%08x, TX Count:%s\n", info->pid, info->tx_burst, info->tx_rate, @@ -196,7 +196,7 @@ pktgen_save(char *path) "set %d size %d\n", info->pid, pkt->pktSize + FCS_SIZE); - fprintf(fd, "set %d rate %d\n", info->pid, info->tx_rate); + fprintf(fd, "set %d rate %f\n", info->pid, info->tx_rate); fprintf(fd, "set %d burst %d\n", info->pid, info->tx_burst); fprintf(fd, "set %d sport %d\n", info->pid, pkt->sport); fprintf(fd, "set %d dport %d\n", info->pid, pkt->dport); @@ -498,9 +498,9 @@ pktgen_transmit_count_rate(int port, char *buff, int len) port_info_t *info = &pktgen.info[port]; if (rte_atomic64_read(&info->transmit_count) == 0) - snprintf(buff, len, "Forever /%4d%%", info->tx_rate); + snprintf(buff, len, "Forever /%4f%%", info->tx_rate); else - snprintf(buff, len, "%ld /%4d%%", + snprintf(buff, len, "%ld /%4f%%", rte_atomic64_read(&info->transmit_count), info->tx_rate); @@ -1949,7 +1949,7 @@ pktgen_set_port_value(port_info_t *info, char type, uint32_t portValue) */ void -pktgen_set_tx_rate(port_info_t *info, uint32_t rate) +pktgen_set_tx_rate(port_info_t *info, float rate) { if (rate == 0) rate = 1; diff --git a/app/pktgen-cmds.h b/app/pktgen-cmds.h index 683abc3..1c50e59 100644 --- a/app/pktgen-cmds.h +++ b/app/pktgen-cmds.h @@ -135,7 +135,7 @@ extern void pktgen_set_pkt_size(port_info_t *info, uint32_t size); extern void pktgen_set_port_value(port_info_t *info, char type, uint32_t portValue); -extern void pktgen_set_tx_rate(port_info_t *info, uint32_t rate); +extern void pktgen_set_tx_rate(port_info_t *info, float rate); extern void pktgen_set_ipaddr(port_info_t *info, char type, cmdline_ipaddr_t *ip); extern void pktgen_set_dst_mac(port_info_t *info, cmdline_etheraddr_t *mac); diff --git a/app/pktgen-port-cfg.h b/app/pktgen-port-cfg.h index bd5876c..a20286d 100644 --- a/app/pktgen-port-cfg.h +++ b/app/pktgen-port-cfg.h @@ -193,7 +193,7 @@ typedef struct port_info_s { uint16_t pid; /**< Port ID value */ uint16_t tx_burst; /**< Number of TX burst packets */ uint8_t pad0; - uint8_t tx_rate; /**< Percentage rate for tx packets */ + float tx_rate; /**< Percentage rate for tx packets */ rte_atomic32_t port_flags; /**< Special send flags for ARP and other */ rte_atomic64_t transmit_count; /**< Packets to transmit loaded into current_tx_count */ diff --git a/app/pktgen.c b/app/pktgen.c index a0705ab..a64e0ca 100644 --- a/app/pktgen.c +++ b/app/pktgen.c @@ -143,7 +143,7 @@ pktgen_packet_rate(port_info_t *info) info->tx_pps = pps; info->tx_cycles = ((cpp * info->tx_burst) / wr_get_port_txcnt(pktgen.l2p, info->pid)); - info->tx_cycles -= ff[info->tx_rate / 10]; + info->tx_cycles -= ff[(int)info->tx_rate / 10]; } /**************************************************************************//** -- 1.9.1