aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2018-01-24 15:03:37 -0500
committerDavid S. Miller <davem@davemloft.net>2018-01-24 15:03:37 -0500
commit46410c2efa9cb5b2f40c9ce24a75d147f44aedeb (patch)
tree16d2e3001ec0d1cc10b490818b945234bfc723d6
parent969ade4086b9f25ac345637b549074ed341bf729 (diff)
parent52e12d5daea48c92f0b0354f4cdc127a2c0a3c52 (diff)
Merge branch 'pktgen-Behavior-flags-fixes'
Dmitry Safonov says: ==================== pktgen: Behavior flags fixes v2: o fixed a nitpick from David Miller There are a bunch of fixes/cleanups/Documentations. Diffstat says for itself, regardless added docs and missed flag parameters. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--Documentation/networking/pktgen.txt19
-rw-r--r--net/core/pktgen.c266
2 files changed, 103 insertions, 182 deletions
diff --git a/Documentation/networking/pktgen.txt b/Documentation/networking/pktgen.txt
index 2c4e3354e128..d2fd78f85aa4 100644
--- a/Documentation/networking/pktgen.txt
+++ b/Documentation/networking/pktgen.txt
@@ -12,8 +12,8 @@ suitable sample script and configure that.
12On a dual CPU: 12On a dual CPU:
13 13
14ps aux | grep pkt 14ps aux | grep pkt
15root 129 0.3 0.0 0 0 ? SW 2003 523:20 [pktgen/0] 15root 129 0.3 0.0 0 0 ? SW 2003 523:20 [kpktgend_0]
16root 130 0.3 0.0 0 0 ? SW 2003 509:50 [pktgen/1] 16root 130 0.3 0.0 0 0 ? SW 2003 509:50 [kpktgend_1]
17 17
18 18
19For monitoring and control pktgen creates: 19For monitoring and control pktgen creates:
@@ -113,9 +113,16 @@ Configuring devices
113=================== 113===================
114This is done via the /proc interface, and most easily done via pgset 114This is done via the /proc interface, and most easily done via pgset
115as defined in the sample scripts. 115as defined in the sample scripts.
116You need to specify PGDEV environment variable to use functions from sample
117scripts, i.e.:
118export PGDEV=/proc/net/pktgen/eth4@0
119source samples/pktgen/functions.sh
116 120
117Examples: 121Examples:
118 122
123 pg_ctrl start starts injection.
124 pg_ctrl stop aborts injection. Also, ^C aborts generator.
125
119 pgset "clone_skb 1" sets the number of copies of the same packet 126 pgset "clone_skb 1" sets the number of copies of the same packet
120 pgset "clone_skb 0" use single SKB for all transmits 127 pgset "clone_skb 0" use single SKB for all transmits
121 pgset "burst 8" uses xmit_more API to queue 8 copies of the same 128 pgset "burst 8" uses xmit_more API to queue 8 copies of the same
@@ -165,8 +172,12 @@ Examples:
165 IPSEC # IPsec encapsulation (needs CONFIG_XFRM) 172 IPSEC # IPsec encapsulation (needs CONFIG_XFRM)
166 NODE_ALLOC # node specific memory allocation 173 NODE_ALLOC # node specific memory allocation
167 NO_TIMESTAMP # disable timestamping 174 NO_TIMESTAMP # disable timestamping
175 pgset 'flag ![name]' Clear a flag to determine behaviour.
176 Note that you might need to use single quote in
177 interactive mode, so that your shell wouldn't expand
178 the specified flag as a history command.
168 179
169 pgset spi SPI_VALUE Set specific SA used to transform packet. 180 pgset "spi [SPI_VALUE]" Set specific SA used to transform packet.
170 181
171 pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then 182 pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then
172 cycle through the port range. 183 cycle through the port range.
@@ -207,8 +218,6 @@ Examples:
207 pgset "tos XX" set former IPv4 TOS field (e.g. "tos 28" for AF11 no ECN, default 00) 218 pgset "tos XX" set former IPv4 TOS field (e.g. "tos 28" for AF11 no ECN, default 00)
208 pgset "traffic_class XX" set former IPv6 TRAFFIC CLASS (e.g. "traffic_class B8" for EF no ECN, default 00) 219 pgset "traffic_class XX" set former IPv6 TRAFFIC CLASS (e.g. "traffic_class B8" for EF no ECN, default 00)
209 220
210 pgset stop aborts injection. Also, ^C aborts generator.
211
212 pgset "rate 300M" set rate to 300 Mb/s 221 pgset "rate 300M" set rate to 300 Mb/s
213 pgset "ratep 1000000" set rate to 1Mpps 222 pgset "ratep 1000000" set rate to 1Mpps
214 223
diff --git a/net/core/pktgen.c b/net/core/pktgen.c
index 4fcfcb14e7c6..b8ab5c829511 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c
@@ -184,25 +184,44 @@
184 184
185#define func_enter() pr_debug("entering %s\n", __func__); 185#define func_enter() pr_debug("entering %s\n", __func__);
186 186
187#define PKT_FLAGS \
188 pf(IPV6) /* Interface in IPV6 Mode */ \
189 pf(IPSRC_RND) /* IP-Src Random */ \
190 pf(IPDST_RND) /* IP-Dst Random */ \
191 pf(TXSIZE_RND) /* Transmit size is random */ \
192 pf(UDPSRC_RND) /* UDP-Src Random */ \
193 pf(UDPDST_RND) /* UDP-Dst Random */ \
194 pf(UDPCSUM) /* Include UDP checksum */ \
195 pf(NO_TIMESTAMP) /* Don't timestamp packets (default TS) */ \
196 pf(MPLS_RND) /* Random MPLS labels */ \
197 pf(QUEUE_MAP_RND) /* queue map Random */ \
198 pf(QUEUE_MAP_CPU) /* queue map mirrors smp_processor_id() */ \
199 pf(FLOW_SEQ) /* Sequential flows */ \
200 pf(IPSEC) /* ipsec on for flows */ \
201 pf(MACSRC_RND) /* MAC-Src Random */ \
202 pf(MACDST_RND) /* MAC-Dst Random */ \
203 pf(VID_RND) /* Random VLAN ID */ \
204 pf(SVID_RND) /* Random SVLAN ID */ \
205 pf(NODE) /* Node memory alloc*/ \
206
207#define pf(flag) flag##_SHIFT,
208enum pkt_flags {
209 PKT_FLAGS
210};
211#undef pf
212
187/* Device flag bits */ 213/* Device flag bits */
188#define F_IPSRC_RND (1<<0) /* IP-Src Random */ 214#define pf(flag) static const __u32 F_##flag = (1<<flag##_SHIFT);
189#define F_IPDST_RND (1<<1) /* IP-Dst Random */ 215PKT_FLAGS
190#define F_UDPSRC_RND (1<<2) /* UDP-Src Random */ 216#undef pf
191#define F_UDPDST_RND (1<<3) /* UDP-Dst Random */ 217
192#define F_MACSRC_RND (1<<4) /* MAC-Src Random */ 218#define pf(flag) __stringify(flag),
193#define F_MACDST_RND (1<<5) /* MAC-Dst Random */ 219static char *pkt_flag_names[] = {
194#define F_TXSIZE_RND (1<<6) /* Transmit size is random */ 220 PKT_FLAGS
195#define F_IPV6 (1<<7) /* Interface in IPV6 Mode */ 221};
196#define F_MPLS_RND (1<<8) /* Random MPLS labels */ 222#undef pf
197#define F_VID_RND (1<<9) /* Random VLAN ID */ 223
198#define F_SVID_RND (1<<10) /* Random SVLAN ID */ 224#define NR_PKT_FLAGS ARRAY_SIZE(pkt_flag_names)
199#define F_FLOW_SEQ (1<<11) /* Sequential flows */
200#define F_IPSEC_ON (1<<12) /* ipsec on for flows */
201#define F_QUEUE_MAP_RND (1<<13) /* queue map Random */
202#define F_QUEUE_MAP_CPU (1<<14) /* queue map mirrors smp_processor_id() */
203#define F_NODE (1<<15) /* Node memory alloc*/
204#define F_UDPCSUM (1<<16) /* Include UDP checksum */
205#define F_NO_TIMESTAMP (1<<17) /* Don't timestamp packets (default TS) */
206 225
207/* Thread control flag bits */ 226/* Thread control flag bits */
208#define T_STOP (1<<0) /* Stop run */ 227#define T_STOP (1<<0) /* Stop run */
@@ -534,6 +553,7 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
534{ 553{
535 const struct pktgen_dev *pkt_dev = seq->private; 554 const struct pktgen_dev *pkt_dev = seq->private;
536 ktime_t stopped; 555 ktime_t stopped;
556 unsigned int i;
537 u64 idle; 557 u64 idle;
538 558
539 seq_printf(seq, 559 seq_printf(seq,
@@ -595,7 +615,6 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
595 pkt_dev->src_mac_count, pkt_dev->dst_mac_count); 615 pkt_dev->src_mac_count, pkt_dev->dst_mac_count);
596 616
597 if (pkt_dev->nr_labels) { 617 if (pkt_dev->nr_labels) {
598 unsigned int i;
599 seq_puts(seq, " mpls: "); 618 seq_puts(seq, " mpls: ");
600 for (i = 0; i < pkt_dev->nr_labels; i++) 619 for (i = 0; i < pkt_dev->nr_labels; i++)
601 seq_printf(seq, "%08x%s", ntohl(pkt_dev->labels[i]), 620 seq_printf(seq, "%08x%s", ntohl(pkt_dev->labels[i]),
@@ -631,68 +650,21 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
631 650
632 seq_puts(seq, " Flags: "); 651 seq_puts(seq, " Flags: ");
633 652
634 if (pkt_dev->flags & F_IPV6) 653 for (i = 0; i < NR_PKT_FLAGS; i++) {
635 seq_puts(seq, "IPV6 "); 654 if (i == F_FLOW_SEQ)
636 655 if (!pkt_dev->cflows)
637 if (pkt_dev->flags & F_IPSRC_RND) 656 continue;
638 seq_puts(seq, "IPSRC_RND ");
639
640 if (pkt_dev->flags & F_IPDST_RND)
641 seq_puts(seq, "IPDST_RND ");
642
643 if (pkt_dev->flags & F_TXSIZE_RND)
644 seq_puts(seq, "TXSIZE_RND ");
645
646 if (pkt_dev->flags & F_UDPSRC_RND)
647 seq_puts(seq, "UDPSRC_RND ");
648
649 if (pkt_dev->flags & F_UDPDST_RND)
650 seq_puts(seq, "UDPDST_RND ");
651
652 if (pkt_dev->flags & F_UDPCSUM)
653 seq_puts(seq, "UDPCSUM ");
654
655 if (pkt_dev->flags & F_NO_TIMESTAMP)
656 seq_puts(seq, "NO_TIMESTAMP ");
657
658 if (pkt_dev->flags & F_MPLS_RND)
659 seq_puts(seq, "MPLS_RND ");
660
661 if (pkt_dev->flags & F_QUEUE_MAP_RND)
662 seq_puts(seq, "QUEUE_MAP_RND ");
663 657
664 if (pkt_dev->flags & F_QUEUE_MAP_CPU) 658 if (pkt_dev->flags & (1 << i))
665 seq_puts(seq, "QUEUE_MAP_CPU "); 659 seq_printf(seq, "%s ", pkt_flag_names[i]);
666 660 else if (i == F_FLOW_SEQ)
667 if (pkt_dev->cflows) { 661 seq_puts(seq, "FLOW_RND ");
668 if (pkt_dev->flags & F_FLOW_SEQ)
669 seq_puts(seq, "FLOW_SEQ "); /*in sequence flows*/
670 else
671 seq_puts(seq, "FLOW_RND ");
672 }
673 662
674#ifdef CONFIG_XFRM 663#ifdef CONFIG_XFRM
675 if (pkt_dev->flags & F_IPSEC_ON) { 664 if (i == F_IPSEC && pkt_dev->spi)
676 seq_puts(seq, "IPSEC ");
677 if (pkt_dev->spi)
678 seq_printf(seq, "spi:%u", pkt_dev->spi); 665 seq_printf(seq, "spi:%u", pkt_dev->spi);
679 }
680#endif 666#endif
681 667 }
682 if (pkt_dev->flags & F_MACSRC_RND)
683 seq_puts(seq, "MACSRC_RND ");
684
685 if (pkt_dev->flags & F_MACDST_RND)
686 seq_puts(seq, "MACDST_RND ");
687
688 if (pkt_dev->flags & F_VID_RND)
689 seq_puts(seq, "VID_RND ");
690
691 if (pkt_dev->flags & F_SVID_RND)
692 seq_puts(seq, "SVID_RND ");
693
694 if (pkt_dev->flags & F_NODE)
695 seq_puts(seq, "NODE_ALLOC ");
696 668
697 seq_puts(seq, "\n"); 669 seq_puts(seq, "\n");
698 670
@@ -858,6 +830,35 @@ static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev)
858 return i; 830 return i;
859} 831}
860 832
833static __u32 pktgen_read_flag(const char *f, bool *disable)
834{
835 __u32 i;
836
837 if (f[0] == '!') {
838 *disable = true;
839 f++;
840 }
841
842 for (i = 0; i < NR_PKT_FLAGS; i++) {
843 if (!IS_ENABLED(CONFIG_XFRM) && i == IPSEC_SHIFT)
844 continue;
845
846 /* allow only disabling ipv6 flag */
847 if (!*disable && i == IPV6_SHIFT)
848 continue;
849
850 if (strcmp(f, pkt_flag_names[i]) == 0)
851 return 1 << i;
852 }
853
854 if (strcmp(f, "FLOW_RND") == 0) {
855 *disable = !*disable;
856 return F_FLOW_SEQ;
857 }
858
859 return 0;
860}
861
861static ssize_t pktgen_if_write(struct file *file, 862static ssize_t pktgen_if_write(struct file *file,
862 const char __user * user_buffer, size_t count, 863 const char __user * user_buffer, size_t count,
863 loff_t * offset) 864 loff_t * offset)
@@ -1215,7 +1216,10 @@ static ssize_t pktgen_if_write(struct file *file,
1215 return count; 1216 return count;
1216 } 1217 }
1217 if (!strcmp(name, "flag")) { 1218 if (!strcmp(name, "flag")) {
1219 __u32 flag;
1218 char f[32]; 1220 char f[32];
1221 bool disable = false;
1222
1219 memset(f, 0, 32); 1223 memset(f, 0, 32);
1220 len = strn_len(&user_buffer[i], sizeof(f) - 1); 1224 len = strn_len(&user_buffer[i], sizeof(f) - 1);
1221 if (len < 0) 1225 if (len < 0)
@@ -1224,107 +1228,15 @@ static ssize_t pktgen_if_write(struct file *file,
1224 if (copy_from_user(f, &user_buffer[i], len)) 1228 if (copy_from_user(f, &user_buffer[i], len))
1225 return -EFAULT; 1229 return -EFAULT;
1226 i += len; 1230 i += len;
1227 if (strcmp(f, "IPSRC_RND") == 0)
1228 pkt_dev->flags |= F_IPSRC_RND;
1229
1230 else if (strcmp(f, "!IPSRC_RND") == 0)
1231 pkt_dev->flags &= ~F_IPSRC_RND;
1232
1233 else if (strcmp(f, "TXSIZE_RND") == 0)
1234 pkt_dev->flags |= F_TXSIZE_RND;
1235
1236 else if (strcmp(f, "!TXSIZE_RND") == 0)
1237 pkt_dev->flags &= ~F_TXSIZE_RND;
1238
1239 else if (strcmp(f, "IPDST_RND") == 0)
1240 pkt_dev->flags |= F_IPDST_RND;
1241
1242 else if (strcmp(f, "!IPDST_RND") == 0)
1243 pkt_dev->flags &= ~F_IPDST_RND;
1244
1245 else if (strcmp(f, "UDPSRC_RND") == 0)
1246 pkt_dev->flags |= F_UDPSRC_RND;
1247
1248 else if (strcmp(f, "!UDPSRC_RND") == 0)
1249 pkt_dev->flags &= ~F_UDPSRC_RND;
1250
1251 else if (strcmp(f, "UDPDST_RND") == 0)
1252 pkt_dev->flags |= F_UDPDST_RND;
1253
1254 else if (strcmp(f, "!UDPDST_RND") == 0)
1255 pkt_dev->flags &= ~F_UDPDST_RND;
1256
1257 else if (strcmp(f, "MACSRC_RND") == 0)
1258 pkt_dev->flags |= F_MACSRC_RND;
1259
1260 else if (strcmp(f, "!MACSRC_RND") == 0)
1261 pkt_dev->flags &= ~F_MACSRC_RND;
1262
1263 else if (strcmp(f, "MACDST_RND") == 0)
1264 pkt_dev->flags |= F_MACDST_RND;
1265
1266 else if (strcmp(f, "!MACDST_RND") == 0)
1267 pkt_dev->flags &= ~F_MACDST_RND;
1268
1269 else if (strcmp(f, "MPLS_RND") == 0)
1270 pkt_dev->flags |= F_MPLS_RND;
1271
1272 else if (strcmp(f, "!MPLS_RND") == 0)
1273 pkt_dev->flags &= ~F_MPLS_RND;
1274 1231
1275 else if (strcmp(f, "VID_RND") == 0) 1232 flag = pktgen_read_flag(f, &disable);
1276 pkt_dev->flags |= F_VID_RND;
1277 1233
1278 else if (strcmp(f, "!VID_RND") == 0) 1234 if (flag) {
1279 pkt_dev->flags &= ~F_VID_RND; 1235 if (disable)
1280 1236 pkt_dev->flags &= ~flag;
1281 else if (strcmp(f, "SVID_RND") == 0) 1237 else
1282 pkt_dev->flags |= F_SVID_RND; 1238 pkt_dev->flags |= flag;
1283 1239 } else {
1284 else if (strcmp(f, "!SVID_RND") == 0)
1285 pkt_dev->flags &= ~F_SVID_RND;
1286
1287 else if (strcmp(f, "FLOW_SEQ") == 0)
1288 pkt_dev->flags |= F_FLOW_SEQ;
1289
1290 else if (strcmp(f, "QUEUE_MAP_RND") == 0)
1291 pkt_dev->flags |= F_QUEUE_MAP_RND;
1292
1293 else if (strcmp(f, "!QUEUE_MAP_RND") == 0)
1294 pkt_dev->flags &= ~F_QUEUE_MAP_RND;
1295
1296 else if (strcmp(f, "QUEUE_MAP_CPU") == 0)
1297 pkt_dev->flags |= F_QUEUE_MAP_CPU;
1298
1299 else if (strcmp(f, "!QUEUE_MAP_CPU") == 0)
1300 pkt_dev->flags &= ~F_QUEUE_MAP_CPU;
1301#ifdef CONFIG_XFRM
1302 else if (strcmp(f, "IPSEC") == 0)
1303 pkt_dev->flags |= F_IPSEC_ON;
1304#endif
1305
1306 else if (strcmp(f, "!IPV6") == 0)
1307 pkt_dev->flags &= ~F_IPV6;
1308
1309 else if (strcmp(f, "NODE_ALLOC") == 0)
1310 pkt_dev->flags |= F_NODE;
1311
1312 else if (strcmp(f, "!NODE_ALLOC") == 0)
1313 pkt_dev->flags &= ~F_NODE;
1314
1315 else if (strcmp(f, "UDPCSUM") == 0)
1316 pkt_dev->flags |= F_UDPCSUM;
1317
1318 else if (strcmp(f, "!UDPCSUM") == 0)
1319 pkt_dev->flags &= ~F_UDPCSUM;
1320
1321 else if (strcmp(f, "NO_TIMESTAMP") == 0)
1322 pkt_dev->flags |= F_NO_TIMESTAMP;
1323
1324 else if (strcmp(f, "!NO_TIMESTAMP") == 0)
1325 pkt_dev->flags &= ~F_NO_TIMESTAMP;
1326
1327 else {
1328 sprintf(pg_result, 1240 sprintf(pg_result,
1329 "Flag -:%s:- unknown\nAvailable flags, (prepend ! to un-set flag):\n%s", 1241 "Flag -:%s:- unknown\nAvailable flags, (prepend ! to un-set flag):\n%s",
1330 f, 1242 f,
@@ -2541,7 +2453,7 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev)
2541 pkt_dev->flows[flow].cur_daddr = 2453 pkt_dev->flows[flow].cur_daddr =
2542 pkt_dev->cur_daddr; 2454 pkt_dev->cur_daddr;
2543#ifdef CONFIG_XFRM 2455#ifdef CONFIG_XFRM
2544 if (pkt_dev->flags & F_IPSEC_ON) 2456 if (pkt_dev->flags & F_IPSEC)
2545 get_ipsec_sa(pkt_dev, flow); 2457 get_ipsec_sa(pkt_dev, flow);
2546#endif 2458#endif
2547 pkt_dev->nflows++; 2459 pkt_dev->nflows++;
@@ -2646,7 +2558,7 @@ static void free_SAs(struct pktgen_dev *pkt_dev)
2646static int process_ipsec(struct pktgen_dev *pkt_dev, 2558static int process_ipsec(struct pktgen_dev *pkt_dev,
2647 struct sk_buff *skb, __be16 protocol) 2559 struct sk_buff *skb, __be16 protocol)
2648{ 2560{
2649 if (pkt_dev->flags & F_IPSEC_ON) { 2561 if (pkt_dev->flags & F_IPSEC) {
2650 struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x; 2562 struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x;
2651 int nhead = 0; 2563 int nhead = 0;
2652 if (x) { 2564 if (x) {