2 * Mausezahn - A fast versatile traffic generator
3 * Copyright (C) 2008 Herbert Haas
5 * This program is free software; you can redistribute it and/or modify it under
6 * the terms of the GNU General Public License version 2 as published by the
7 * Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, see http://www.gnu.org/licenses/gpl-2.0.html
24 int cmd_set(struct cli_def
*cli
, const char *command
, char *argv
[], int argc
)
27 unsigned int time_factor
;
28 int i
, cnt
, found_dev
;
34 cli_print(cli
, "Specify a variable to set:\r\n");
35 cli_print(cli
, "device specify the primary network device\r");
37 cli_print(cli
, "NOTE: The following options are non-MOPS and deprecated:\n");
39 cli_print(cli
, "a|sa specify a MAC source address\r");
40 cli_print(cli
, "b|da specify a MAC destination address\r");
41 cli_print(cli
, "A|SA specify a IP source address\r");
42 cli_print(cli
, "B|DA specify a IP destination address\r");
43 cli_print(cli
, "c|count specify a packet count value\r");
44 cli_print(cli
, "d|delay specify an interpacket delay (usec, msec, or sec)\r");
45 cli_print(cli
, "P|payload specify an ASCII payload\r");
46 cli_print(cli
, "H|hexload specify a hexadecimal payload\r");
47 cli_print(cli
, "p|padding specify a number of padding bytes (total for raw, added otherwise)\r");
48 cli_print(cli
, "Q|vlan specify one ore more 802.1Q vlan tags\r");
49 cli_print(cli
, "M|mpls specify one ore more MPLS labels\r");
55 if (strncmp(argv
[0], "device", 2)==0)
57 if (strncmp(argv
[1],"?",1)==0)
59 cli_print(cli
,"Specify the primary network device (use 'show dev' for a list)\n");
66 for (i
=0; i
<device_list_entries
; i
++)
68 if (strncmp(device_list
[i
].dev
, argv
[1], 16)==0)
76 strncpy(tx
.device
, argv
[1], 16);
79 cli_print(cli
, "Unknown device, will stick on %s\n", tx
.device
);
82 cli_print(cli
, "Nothing specified, will stick on %s\n", tx
.device
);
87 // set source MAC address
88 else if ( (strncmp(argv
[0], "a", 10)==0) ||
89 (strncmp(argv
[0], "sa", 10)==0) )
91 if (strncmp(argv
[1],"?",1)==0)
93 cli_print(cli
,"Specify a source MAC address (format: XX:XX:XX:XX:XX:XX)\n");
97 strncpy(tx
.eth_src_txt
, argv
[1], 32);
98 if (check_eth_mac_txt(ETH_SRC
))
100 cli_print(cli
, "Invalid MAC address! Format: XX:XX:XX:XX:XX:XX\r");
101 cli_print(cli
, "Current setting: sa = %02x:%02x:%02x:%02x:%02x:%02x\r",
102 tx
.eth_src
[0], tx
.eth_src
[1], tx
.eth_src
[2],
103 tx
.eth_src
[3], tx
.eth_src
[4], tx
.eth_src
[5]);
111 // set destination MAC address
112 else if ( (strncmp(argv
[0], "b", 10)==0) ||
113 (strncmp(argv
[0], "da", 10)==0) )
115 if (strncmp(argv
[1],"?",1)==0)
117 cli_print(cli
,"Specify a destination MAC address (format: XX:XX:XX:XX:XX:XX)\n");
121 strncpy(tx
.eth_dst_txt
, argv
[1], 32);
122 if (check_eth_mac_txt(ETH_DST
))
124 cli_print(cli
, "Invalid MAC address! Format: XX:XX:XX:XX:XX:XX\r");
125 cli_print(cli
, "Current setting: da = %02x:%02x:%02x:%02x:%02x:%02x\r",
126 tx
.eth_dst
[0], tx
.eth_dst
[1], tx
.eth_dst
[2],
127 tx
.eth_dst
[3], tx
.eth_dst
[4], tx
.eth_dst
[5]);
134 // set source IP address
135 else if ( (strncmp(argv
[0], "A", 10)==0) ||
136 (strncmp(argv
[0], "SA", 10)==0) )
138 if (strncmp(argv
[1],"?",1)==0)
140 cli_print(cli
,"Specify a source IP address, a FQDN, 'rand', or a range\n");
144 if (strcmp(argv
[1], "rand") == 0)
147 tx
.ip_src_h
= (u_int32_t
) ( ((float) rand()/RAND_MAX
)*0xE0000000); //this is 224.0.0.0
148 // TODO: mops_hton32 (&tx.ip_src_h, &tx.ip_src);
150 else if (get_ip_range_src(argv
[1])) // returns 1 when no range has been specified
152 l
= libnet_init (LIBNET_LINK_ADV
, tx
.device
, NULL
);
155 cli_print(cli
, "Error: could not access the network device!\n");
158 // name2addr4 accepts a DOTTED DECIMAL ADDRESS or a FQDN:
159 tx
.ip_src
= libnet_name2addr4 (l
, argv
[1], LIBNET_RESOLVE
);
160 x
= (unsigned char *) &tx
.ip_src
;
161 cli_print(cli
, "Set source IP address to %i.%i.%i.%i\n",
162 *x
,*(x
+1),*(x
+2),*(x
+3));
163 // TODO: mops_hton32 (&tx.ip_src, &tx.ip_src_h);
169 // set destination IP address
170 else if ( (strncmp(argv
[0], "B", 10)==0) ||
171 (strncmp(argv
[0], "DA", 10)==0) )
173 if (strncmp(argv
[1],"?",1)==0)
175 cli_print(cli
,"Specify a destination IP address, a FQDN, or a range\n");
179 if (get_ip_range_dst(argv
[1])) // returns 1 when no range has been specified
181 l
= libnet_init (LIBNET_LINK_ADV
, tx
.device
, NULL
);
184 cli_print(cli
, "Error: could not access the network device!\n");
187 // name2addr4 accepts a DOTTED DECIMAL ADDRESS or a FQDN:
188 tx
.ip_dst
= libnet_name2addr4 (l
, argv
[1], LIBNET_RESOLVE
);
189 x
= (unsigned char *) &tx
.ip_src
;
190 cli_print(cli
, "Set destination IP address to %i.%i.%i.%i\n",
191 *x
,*(x
+1),*(x
+2),*(x
+3));
192 // TODO: mops_hton32 (&tx.ip_dst, &tx.ip_dst_h);
199 else if ( (strncmp(argv
[0], "c", 10)==0) ||
200 (strncmp(argv
[0], "count", 10)==0) )
202 if (strncmp(argv
[1],"?",1)==0)
204 cli_print(cli
,"Specify a packet count value\n");
208 cnt
= (unsigned int) str2int (argv
[1]);
211 cli_print(cli
, "Warning: A packet count of zero means an infinite number of packets.\r");
212 cli_print(cli
, "Infinite packets are only supported via MOPS (use the 'packet' command\r");
213 cli_print(cli
, "in global configuration mode) or when running Mausezahn from the shell.\n");
214 cli_print(cli
, "Note: The count value has NOT been changed.\n");
223 // set interpacket delay
224 else if ( (strncmp(argv
[0], "d", 10)==0) ||
225 (strncmp(argv
[0], "delay", 10)==0) )
227 if (strncmp(argv
[1],"?",1)==0)
229 cli_print(cli
,"Specify an interpacket delay (usec, msec, or sec)\n");
233 // determine whether seconds or msecs are used
234 // default is usec!!!
236 if (exists(argv
[1],"s") || exists(argv
[1],"sec")) time_factor
=1000000;
237 if (exists(argv
[1],"m") || exists(argv
[1],"msec")) time_factor
=1000;
238 dum
= strtok(argv
[1],"ms");
239 tx
.delay
= strtol(dum
, (char **)NULL
, 10) * time_factor
;
240 if ((errno
== ERANGE
&& (tx
.delay
== LONG_MAX
|| tx
.delay
== LONG_MIN
))
241 || (errno
!= 0 && tx
.delay
== 0))
243 cli_print(cli
, "Value out of range!\n");
245 if (tx
.delay
<0) tx
.delay
=0; // no delay
247 cli_print(cli
, "Set interpacket delay to %u usec\n", tx
.delay
);
253 else if ( (strncmp(argv
[0], "P", 10)==0) ||
254 (strncmp(argv
[0], "payload", 10)==0) )
256 if (strncmp(argv
[1],"?",1)==0)
258 cli_print(cli
,"Specify an ASCII payload enclosed in quotes\n");
262 strncpy((char *)tx
.ascii_payload
, argv
[1], MAX_PAYLOAD_SIZE
);
269 else if ( (strncmp(argv
[0], "H", 10)==0) ||
270 (strncmp(argv
[0], "hexload", 10)==0) )
272 if (strncmp(argv
[1],"?",1)==0)
274 cli_print(cli
,"Specify a hexadecimal payload (using ':' or '.' as delimiters)\n");
278 tx
.hex_payload_s
= str2hex (argv
[1], tx
.hex_payload
, 8192);
279 if (tx
.hex_payload_s
==0)
280 cli_print(cli
, "Invalid hexadecimal string. Try something like aa:bb:cc:45:99:00:de:ad:be:ef: ...\n");
286 else if ( (strncmp(argv
[0], "M", 10)==0) ||
287 (strncmp(argv
[0], "mpls", 10)==0) )
289 if (strncmp(argv
[1],"?",1)==0)
291 cli_print(cli
,"Specify one or more MPLS labels\n");
295 if (strlen(argv
[1])) // TODO: Better verification of 802.1Q syntax
297 strncpy(tx
.mpls_txt
, argv
[1], 128);
305 else if ( (strncmp(argv
[0], "Q", 10)==0) ||
306 (strncmp(argv
[0], "vlan", 10)==0) )
308 if (strncmp(argv
[1],"?",1)==0)
310 cli_print(cli
,"Specify one or more 802.1Q VLAN tags (and optionally 801.1P values)\n");
314 if (strlen(argv
[1])) // TODO: Better verification of 802.1Q syntax
316 strncpy(tx
.dot1Q_txt
, argv
[1], 32);
324 else if ( (strncmp(argv
[0], "p", 10)==0) ||
325 (strncmp(argv
[0], "padding", 10)==0) )
327 if (strncmp(argv
[1],"?",1)==0)
329 cli_print(cli
,"Specify a number of padding bytes\n");
333 tx
.padding
= (unsigned int) str2int(argv
[1]);
334 if (tx
.padding
> MAX_PAYLOAD_SIZE
)
336 cli_print(cli
, "Note: Padding too big! However, let's try and see what happens...\n");
346 cli_print(cli
, "Unknown variable '%s'\n",argv
[0]);