184
184
185
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 ,
208
+ enum pkt_flags {
209
+ PKT_FLAGS
210
+ };
211
+ #undef pf
212
+
187
213
/* Device flag bits */
188
- #define F_IPSRC_RND (1<<0) /* IP-Src Random */
189
- #define F_IPDST_RND (1<<1) /* IP-Dst Random */
190
- #define F_UDPSRC_RND (1<<2) /* UDP-Src Random */
191
- #define F_UDPDST_RND (1<<3) /* UDP-Dst Random */
192
- #define F_MACSRC_RND (1<<4) /* MAC-Src Random */
193
- #define F_MACDST_RND (1<<5) /* MAC-Dst Random */
194
- #define F_TXSIZE_RND (1<<6) /* Transmit size is random */
195
- #define F_IPV6 (1<<7) /* Interface in IPV6 Mode */
196
- #define F_MPLS_RND (1<<8) /* Random MPLS labels */
197
- #define F_VID_RND (1<<9) /* Random VLAN ID */
198
- #define F_SVID_RND (1<<10) /* Random SVLAN ID */
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) */
214
+ #define pf (flag ) static const __u32 F_##flag = (1<<flag##_SHIFT);
215
+ PKT_FLAGS
216
+ #undef pf
217
+
218
+ #define pf (flag ) __stringify(flag),
219
+ static char * pkt_flag_names [] = {
220
+ PKT_FLAGS
221
+ };
222
+ #undef pf
223
+
224
+ #define NR_PKT_FLAGS ARRAY_SIZE(pkt_flag_names)
206
225
207
226
/* Thread control flag bits */
208
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
554
const struct pktgen_dev * pkt_dev = seq -> private ;
536
555
ktime_t stopped ;
556
+ unsigned int i ;
537
557
u64 idle ;
538
558
539
559
seq_printf (seq ,
@@ -595,7 +615,6 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
595
615
pkt_dev -> src_mac_count , pkt_dev -> dst_mac_count );
596
616
597
617
if (pkt_dev -> nr_labels ) {
598
- unsigned int i ;
599
618
seq_puts (seq , " mpls: " );
600
619
for (i = 0 ; i < pkt_dev -> nr_labels ; i ++ )
601
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
651
seq_puts (seq , " Flags: " );
633
652
634
- if (pkt_dev -> flags & F_IPV6 )
635
- seq_puts (seq , "IPV6 " );
636
-
637
- if (pkt_dev -> flags & F_IPSRC_RND )
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 " );
653
+ for (i = 0 ; i < NR_PKT_FLAGS ; i ++ ) {
654
+ if (i == F_FLOW_SEQ )
655
+ if (!pkt_dev -> cflows )
656
+ continue ;
663
657
664
- if (pkt_dev -> flags & F_QUEUE_MAP_CPU )
665
- seq_puts (seq , "QUEUE_MAP_CPU " );
666
-
667
- if (pkt_dev -> cflows ) {
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
- }
658
+ if (pkt_dev -> flags & (1 << i ))
659
+ seq_printf (seq , "%s " , pkt_flag_names [i ]);
660
+ else if (i == F_FLOW_SEQ )
661
+ seq_puts (seq , "FLOW_RND " );
673
662
674
663
#ifdef CONFIG_XFRM
675
- if (pkt_dev -> flags & F_IPSEC_ON ) {
676
- seq_puts (seq , "IPSEC " );
677
- if (pkt_dev -> spi )
664
+ if (i == F_IPSEC && pkt_dev -> spi )
678
665
seq_printf (seq , "spi:%u" , pkt_dev -> spi );
679
- }
680
666
#endif
681
-
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 " );
667
+ }
696
668
697
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
830
return i ;
859
831
}
860
832
833
+ static __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
+
861
862
static ssize_t pktgen_if_write (struct file * file ,
862
863
const char __user * user_buffer , size_t count ,
863
864
loff_t * offset )
@@ -1215,7 +1216,10 @@ static ssize_t pktgen_if_write(struct file *file,
1215
1216
return count ;
1216
1217
}
1217
1218
if (!strcmp (name , "flag" )) {
1219
+ __u32 flag ;
1218
1220
char f [32 ];
1221
+ bool disable = false;
1222
+
1219
1223
memset (f , 0 , 32 );
1220
1224
len = strn_len (& user_buffer [i ], sizeof (f ) - 1 );
1221
1225
if (len < 0 )
@@ -1224,107 +1228,15 @@ static ssize_t pktgen_if_write(struct file *file,
1224
1228
if (copy_from_user (f , & user_buffer [i ], len ))
1225
1229
return - EFAULT ;
1226
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 )
1276
- pkt_dev -> flags |= F_VID_RND ;
1232
+ flag = pktgen_read_flag (f , & disable );
1277
1233
1278
- else if (strcmp (f , "!VID_RND" ) == 0 )
1279
- pkt_dev -> flags &= ~F_VID_RND ;
1280
-
1281
- else if (strcmp (f , "SVID_RND" ) == 0 )
1282
- pkt_dev -> flags |= F_SVID_RND ;
1283
-
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 {
1234
+ if (flag ) {
1235
+ if (disable )
1236
+ pkt_dev -> flags &= ~flag ;
1237
+ else
1238
+ pkt_dev -> flags |= flag ;
1239
+ } else {
1328
1240
sprintf (pg_result ,
1329
1241
"Flag -:%s:- unknown\nAvailable flags, (prepend ! to un-set flag):\n%s" ,
1330
1242
f ,
@@ -2541,7 +2453,7 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev)
2541
2453
pkt_dev -> flows [flow ].cur_daddr =
2542
2454
pkt_dev -> cur_daddr ;
2543
2455
#ifdef CONFIG_XFRM
2544
- if (pkt_dev -> flags & F_IPSEC_ON )
2456
+ if (pkt_dev -> flags & F_IPSEC )
2545
2457
get_ipsec_sa (pkt_dev , flow );
2546
2458
#endif
2547
2459
pkt_dev -> nflows ++ ;
@@ -2646,7 +2558,7 @@ static void free_SAs(struct pktgen_dev *pkt_dev)
2646
2558
static int process_ipsec (struct pktgen_dev * pkt_dev ,
2647
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
2562
struct xfrm_state * x = pkt_dev -> flows [pkt_dev -> curfl ].x ;
2651
2563
int nhead = 0 ;
2652
2564
if (x ) {
0 commit comments