From eec66bd42d31a87e210f9ee0ef6d212caa330e1e Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Fri, 6 Jun 2014 20:47:59 +0800 Subject: [PATCH] pktgen: Allow switching dst and src addresses configuration So it could simulate multiple clients and one target server use case. --- tools/tools/netrate/pktgen/pktgen.c | 22 ++++++++++++++++------ tools/tools/netrate/pktgen/pktgen.h | 4 ++++ tools/tools/netrate/pktgenctl/pktgenctl.c | 10 +++++++--- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/tools/tools/netrate/pktgen/pktgen.c b/tools/tools/netrate/pktgen/pktgen.c index 87bedda715..3c4a72650d 100644 --- a/tools/tools/netrate/pktgen/pktgen.c +++ b/tools/tools/netrate/pktgen/pktgen.c @@ -117,8 +117,9 @@ struct pktgen { struct pktgen_pcpu pktg_pcpu[MAXCPU]; }; -#define PKTG_F_CONFIG 0x1 -#define PKTG_F_RUNNING 0x4 +#define PKTG_F_CONFIG 0x1 +#define PKTG_F_RUNNING 0x4 +#define PKTG_F_SWITCH_SRCDST 0x8 static int pktgen_modevent(module_t, int, void *); @@ -347,6 +348,8 @@ pktgen_config(struct pktgen *pktg, const struct pktgen_conf *conf) */ pktg->pktg_flags |= PKTG_F_CONFIG; + if (conf->pc_flags & PKTGEN_FLAG_SWITCH_SRCDST) + pktg->pktg_flags |= PKTG_F_SWITCH_SRCDST; pktg->pktg_duration = conf->pc_duration; pktg->pktg_datalen = conf->pc_datalen; pktg->pktg_pktenq = pktenq; @@ -504,10 +507,17 @@ pktgen_start_ifsq_handler(netmsg_t nmsg) ui = mtod(m, struct udpiphdr *); ui->ui_pr = IPPROTO_UDP; - ui->ui_src.s_addr = pktg->pktg_src.sin_addr.s_addr; - ui->ui_dst.s_addr = dst->sin_addr.s_addr; - ui->ui_sport = pktg->pktg_src.sin_port; - ui->ui_dport = dst->sin_port; + if (pktg->pktg_flags & PKTG_F_SWITCH_SRCDST) { + ui->ui_src.s_addr = dst->sin_addr.s_addr; + ui->ui_dst.s_addr = pktg->pktg_src.sin_addr.s_addr; + ui->ui_sport = dst->sin_port; + ui->ui_dport = pktg->pktg_src.sin_port; + } else { + ui->ui_src.s_addr = pktg->pktg_src.sin_addr.s_addr; + ui->ui_dst.s_addr = dst->sin_addr.s_addr; + ui->ui_sport = pktg->pktg_src.sin_port; + ui->ui_dport = dst->sin_port; + } ui->ui_ulen = ulen; ui->ui_sum = in_pseudo(ui->ui_src.s_addr, ui->ui_dst.s_addr, psum); diff --git a/tools/tools/netrate/pktgen/pktgen.h b/tools/tools/netrate/pktgen/pktgen.h index 6bfb250c24..45dae1fa37 100644 --- a/tools/tools/netrate/pktgen/pktgen.h +++ b/tools/tools/netrate/pktgen/pktgen.h @@ -47,10 +47,14 @@ struct pktgen_conf { int pc_ndst; struct sockaddr_in *pc_dst; int pc_pktenq; + + int pc_flags; /* PKTGEN_FLAG_ */ }; #define PKTGENSTART _IO('G', 19) #define PKTGENSCONF _IOW('G', 20, struct pktgen_conf) #define PKTGENMQSTART _IO('G', 21) +#define PKTGEN_FLAG_SWITCH_SRCDST 0x1 + #endif /* !_NET_PKTGEN_H */ diff --git a/tools/tools/netrate/pktgenctl/pktgenctl.c b/tools/tools/netrate/pktgenctl/pktgenctl.c index be73ed800f..f9dc3dea81 100644 --- a/tools/tools/netrate/pktgenctl/pktgenctl.c +++ b/tools/tools/netrate/pktgenctl/pktgenctl.c @@ -54,7 +54,7 @@ #define PKTGEN_DEVPATH "/dev/pktg0" -#define DEFAULT_PORT 3000 +#define DEFAULT_PORT 7000 #define INDST_MASK 0x0001 #define INSRC_MASK 0x0002 @@ -70,7 +70,7 @@ usage(void) "-d dst_inaddr[:dst_port] [-d dst_inaddr[:dst_port] ...] " "-s src_inaddr[:src_port] " "-e (gw_eaddr|dst_eaddr) -i iface " - "[-m data_len] [-l duration] [-D dev] [-q pktenq] [-M]\n"); + "[-m data_len] [-l duration] [-D dev] [-q pktenq] [-M] [-S]\n"); exit(1); } @@ -122,7 +122,7 @@ main(int argc, char *argv[]) err(1, "calloc(%d dst)", ndst_alloc); conf.pc_ndst = 0; - while ((c = getopt(argc, argv, "d:s:e:i:m:l:D:q:M")) != -1) { + while ((c = getopt(argc, argv, "d:s:e:i:m:l:D:q:MS")) != -1) { switch (c) { case 'd': if (conf.pc_ndst >= ndst_alloc) { @@ -199,6 +199,10 @@ main(int argc, char *argv[]) start = PKTGENMQSTART; break; + case 'S': + conf.pc_flags |= PKTGEN_FLAG_SWITCH_SRCDST; + break; + default: usage(); } -- 2.41.0