2 * Mausezahn - A fast versatile traffic generator
3 * Copyright (C) 2008-2010 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
31 char mz_listen_addr
[16];
33 struct mops
*clipkt
; // actual packet used by CLI thread
39 void mz_cli_init(void)
41 amp_head
= automops_init();
43 // Initialize default credentials (will be overwritten by mausezahn.conf)
44 strcpy(mz_username
, MZ_DEFAULT_USERNAME
);
45 strcpy(mz_password
, MZ_DEFAULT_PASSWORD
);
46 strcpy(mz_enable
, MZ_DEFAULT_ENABLE_PASSWORD
);
48 // read login credentials from config file
49 if (cli_read_cfg("mausezahn.conf")) {
50 fprintf(stderr
, "mz: Problems opening config file. Will use defaults\n");
53 if ((verbose
) && (AUTOMOPS_ENABLED
)) {
54 automops_dump_all(amp_head
);
55 fprintf(stderr
, "------------ MOPS/CLI initialization completed ------------\n");
62 // Read in configuration file
63 int cli_read_cfg(char *str
)
71 int i
, j
=0, len
, found
=0, nonspc
=0;
72 int user
=0, pass
=0, ena
=0, amp
=0, mgmt_only
=0, cli
=0, port
=0, addr
=0;
74 strncpy(filename
, str
, 255);
76 if (getfullpath_cfg(filename
)) return 1;
79 fprintf(stderr
, "Opening config file %s...\n", filename
);
82 fd
= fopen (filename
, "r");
83 if (fd
==NULL
) return 1;
85 while (fgets(line
, 255, fd
) != NULL
) {
86 len
=strnlen(line
, 255);
87 // Take string left side of # (comments)
88 if (len
) for(i
=0;i
<len
;i
++) if (line
[i
]=='#') line
[i
]='\0'; // cut off
89 len
=strnlen(line
, 255);
90 if (len
) for(i
=0;i
<len
;i
++) if (!isspace(line
[i
])) nonspc
++;
91 if (nonspc
==0) continue; else nonspc
=0;
92 if (!user
) user
= sscanf(line
, " user = %s ", mz_username
);
93 if (!pass
) pass
= sscanf(line
, " password = %s ", mz_password
);
94 if (!ena
) ena
= sscanf(line
, " enable = %s ", mz_enable
);
95 if (!port
) port
= sscanf(line
, " port = %i ", &mz_port
);
96 if (!addr
) addr
= sscanf(line
, " listen-addr = %s ", mz_listen_addr
);
97 if (!cli
) cli
= sscanf(line
, " cli-device = %s ", dev
);
99 for (i
=0; i
<device_list_entries
; i
++) {
100 if (strncmp(device_list
[i
].dev
, dev
, 16)==0) {
101 device_list
[i
].cli
=1;
107 fprintf(stderr
, " Warning: [%s] cli device '%s' does not exist!\n", filename
, dev
);
114 if (!mgmt_only
) mgmt_only
= sscanf(line
, " management-only = %s ", dev
);
116 for (i
=0; i
<device_list_entries
; i
++) {
117 if (strncmp(device_list
[i
].dev
, dev
, 16)==0) {
118 device_list
[i
].mgmt_only
=1;
123 if (!found
) fprintf(stderr
, " Warning: [%s] management device '%s' does not exist!\n", filename
, dev
);
128 if (AUTOMOPS_ENABLED
) {
129 // read-in all protocol definitions
130 amp
= sscanf(line
, " automops = %s ", path
);
132 ampfile
= mapfile(path
);
133 if (ampfile
==NULL
) fprintf(stderr
, " Warning: Cannot read %s\n", path
);
136 j
= parse_protocol (ampfile
);
139 fprintf(stderr
, " Warning: invalid protocol definitions in %s\n", path
);
152 fprintf(stderr
, "%s: No user name specified - will use default.\n", filename
);
155 fprintf(stderr
, "%s: No password specified - will use default.\n", filename
);
158 fprintf(stderr
, "%s: No enable password specified - will use default.\n", filename
);
161 fprintf(stderr
, "%s: No port specified - will use default.\n", filename
);
164 fprintf(stderr
, "%s: No listen address specified - will use default.\n", filename
);
175 ///// TODO ***************************************************************
177 // Process "startup-config" using:
179 // cli_file (struct cli_def *cli, FILE *f, int privilege, int mode)
181 // This reads and processes every line read from f as if it were entered
182 // at the console. The privilege level will be set to privilege and mode
183 // set to mode during the processing of the file.
186 // Idle timeout or watchdog or whatever:
188 // cli_regular (struct cli_def *cli, int(*callback)(struct cli_def *))
190 // Adds a callback function which will be called every second that a user
191 // is connected to the cli. This can be used for regular processing such
192 // as debugging, time counting or implementing idle timeouts.
194 // Pass NULL as the callback function to disable this at runtime.
196 // ************************************************************************
201 struct sockaddr_in servaddr
;
224 int on
= 1, x
, s
, cnt
=0;
228 (void) signal(SIGINT
, clean_up
); // to close and free everything upon SIGINT
230 // Must be called first to setup data structures
234 // Set the hostname (shown in the the prompt)
235 cli_set_hostname(cli
, "mz");
238 cli_set_banner(cli
, "mausezahn " VERSION_LONG
);
240 // Enable usernames and passwords
241 cli_allow_user(cli
, mz_username
, mz_password
);
242 cli_allow_enable(cli
, mz_enable
);
245 mp_head
= mops_init(); // now mp_head points to the head of the doubly linked list
247 // Initialize packet sequences list
248 packet_sequences
= mz_ll_create_new_element(NULL
);
253 for (i
=0; i
<device_list_entries
; i
++) {
254 get_dev_params(device_list
[i
].dev
);
257 // Initialize sequence list
260 // **************** THE MAIN CLI COMMANDS ****************
262 // ---- DEBUG MODE: ----
263 debug
= cli_register_command(cli
, NULL
, "debug", NULL
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Enter debug mode");
264 cli_register_command(cli
, debug
, "packet", debug_packet
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Debug packet processing");
265 cli_register_command(cli
, debug
, "all", debug_all
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Debug all (beware!)");
267 // ---- INTERFACE MODE COMMANDS: ---- (these are defaults for the 'device defaults' command)
268 cli_register_command(cli
, NULL
, "interface", enter_interface
, PRIVILEGE_PRIVILEGED
, MODE_CONFIG
, "Enter interface configuration mode");
269 ip_int
= cli_register_command(cli
, NULL
, "ip", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_INTERFACE
, "Configure interface IP address");
270 cli_register_command(cli
, ip_int
, "address", conf_ip_address
, PRIVILEGE_PRIVILEGED
, MZ_MODE_INTERFACE
, "Configure interface IP address");
271 mac_int
= cli_register_command(cli
, NULL
, "mac", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_INTERFACE
, "Configure interface MAC address");
272 cli_register_command(cli
, mac_int
, "address", conf_mac_address
, PRIVILEGE_PRIVILEGED
, MZ_MODE_INTERFACE
, "Configure interface MAC address");
273 tag
= cli_register_command(cli
, NULL
, "tag", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_INTERFACE
, "Configure tags");
274 cli_register_command(cli
, tag
, "dot1q", conf_tag_dot1q
, PRIVILEGE_PRIVILEGED
, MZ_MODE_INTERFACE
, "Configure 802.1Q and 802.1P parameters");
275 cli_register_command(cli
, tag
, "mpls", conf_tag_mpls
, PRIVILEGE_PRIVILEGED
, MZ_MODE_INTERFACE
, "Configure mpls label stack");
277 // ---- VARIOUS CONFIG MODE COMMANDS : ----
278 frame
= cli_register_command(cli
, NULL
, "frame", NULL
, PRIVILEGE_PRIVILEGED
, MODE_CONFIG
, "Configure global frame settings");
279 cli_register_command(cli
, frame
, "limit", conf_frame_limit
, PRIVILEGE_PRIVILEGED
, MODE_CONFIG
, "Configure frame size limits");
280 cli_register_command(cli
, NULL
, "sequence", conf_sequence
, PRIVILEGE_PRIVILEGED
, MODE_CONFIG
, "Configure a sequence of packets");
282 // ---- PACKET CONFIG MODE COMMANDS: ----
283 cli_register_command(cli
, NULL
, "packet", enter_packet
, PRIVILEGE_PRIVILEGED
, MODE_CONFIG
, "Enter packet configuration mode");
284 cli_register_command(cli
, NULL
, "clone", cmd_packet_clone
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Clone from another packet");
285 cli_register_command(cli
, NULL
, "name", cmd_packet_name
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Assign a unique name");
286 cli_register_command(cli
, NULL
, "description", cmd_packet_description
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Assign a packet description text");
287 cli_register_command(cli
, NULL
, "bind", cmd_packet_bind
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Select the network interface");
288 cli_register_command(cli
, NULL
, "count", cmd_packet_count
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the packet count value");
289 cli_register_command(cli
, NULL
, "delay", cmd_packet_delay
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the inter-packet delay");
290 cli_register_command(cli
, NULL
, "interval", cmd_packet_interval
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure a greater interval");
291 cli_register_command(cli
, NULL
, "type", cmd_packet_type
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Specify packet type");
292 mac_packet
= cli_register_command(cli
, NULL
, "mac", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure packet's MAC addresses");
293 address
= cli_register_command(cli
, mac_packet
, "address", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure packet's source IP address");
294 cli_register_command(cli
, address
, "source", cmd_packet_mac_address_source
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure packet's source MAC addresses");
295 cli_register_command(cli
, address
, "destination", cmd_packet_mac_address_destination
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure packet's destination MAC addresses");
296 tag
= cli_register_command(cli
, NULL
, "tag", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure tags");
297 cli_register_command(cli
, tag
, "dot1q", cmd_packet_dot1q
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure 802.1Q (and 802.1P) parameters");
298 cli_register_command(cli
, tag
, "mpls", cmd_packet_mpls
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure MPLS label stack");
299 pld
= cli_register_command(cli
, NULL
, "payload", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure a payload");
300 cli_register_command(cli
, pld
, "hex", cmd_packet_payload_hex
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure a payload in hexadecimal format");
301 cli_register_command(cli
, pld
, "ascii", cmd_packet_payload_ascii
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure a payload in ascii format");
302 cli_register_command(cli
, pld
, "raw", cmd_packet_payload_raw
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure a raw payload (whole file as it is)");
303 port
= cli_register_command(cli
, NULL
, "port", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure packet's port numbers");
304 cli_register_command(cli
, port
, "source", cmd_port_source
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure packet's source port number");
305 cli_register_command(cli
, port
, "destination", cmd_port_destination
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure packet's destination port number");
306 cli_register_command(cli
, NULL
, "end", cmd_packet_end
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "End packet configuration mode");
308 // ---------- Ethernet related (for all packets that have Ethernet or LLC/SNAP as link layer)
309 eth_frame
= cli_register_command(cli
, NULL
, "ethernet", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure frame's Ethernet, 802.2, 802.3, or SNAP settings");
310 macaddr
= cli_register_command(cli
, eth_frame
, "address", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure frame's source or destination MAC address");
311 cli_register_command(cli
, macaddr
, "source", cmd_packet_mac_address_source
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure frame's source MAC addresses");
312 cli_register_command(cli
, macaddr
, "destination", cmd_packet_mac_address_destination
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure frame's destination MAC addresses");
313 cli_register_command(cli
, eth_frame
, "type", cmd_eth_type
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure Ethernet's type field");
314 cli_register_command(cli
, eth_frame
, "length", cmd_eth_length
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure IEEE 802.3 length field");
315 cli_register_command(cli
, eth_frame
, "llc", cmd_eth_llc
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the IEEE 802.2 field");
316 cli_register_command(cli
, eth_frame
, "snap", cmd_eth_snap
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the IEEE 802.2 field");
318 // ---------- IP related (for all packets that have IPv4 as network layer)
319 ip_packet
= cli_register_command(cli
, NULL
, "ip", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure packet's IP settings");
320 address
= cli_register_command(cli
, ip_packet
, "address", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure packet's source or destination IP address");
321 cli_register_command(cli
, address
, "source", cmd_ip_address_source
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure packet's source IP address");
322 cli_register_command(cli
, address
, "destination", cmd_ip_address_destination
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure packet's destination IP address");
323 cli_register_command(cli
, ip_packet
, "version", cmd_ip_version
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure version field in IPv4 header");
324 cli_register_command(cli
, ip_packet
, "ttl", cmd_ip_ttl
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure TTL field in IPv4 header");
325 cli_register_command(cli
, ip_packet
, "protocol", cmd_ip_protocol
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure protocol field in IPv4 header");
326 cli_register_command(cli
, ip_packet
, "hlen", cmd_ip_hlen
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure header-length (aka IHL) field in IPv4 header");
327 cli_register_command(cli
, ip_packet
, "length", cmd_ip_len
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure length field in IPv4 header");
328 cli_register_command(cli
, ip_packet
, "identification", cmd_ip_id
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure identification field in IPv4 header");
329 cli_register_command(cli
, ip_packet
, "offset", cmd_ip_offset
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure fragment offset field in IPv4 header");
330 cli_register_command(cli
, ip_packet
, "checksum", cmd_ip_sum
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure checksum field in IPv4 header");
331 cli_register_command(cli
, ip_packet
, "tos", cmd_ip_tos
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure type-of-service (ToS) field in IPv4 header");
332 cli_register_command(cli
, ip_packet
, "dscp", cmd_ip_dscp
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the ToS as DSCP field in IPv4 header");
333 cli_register_command(cli
, ip_packet
, "reserved", cmd_ip_rsv
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the reserved flag in IPv4 header");
334 cli_register_command(cli
, ip_packet
, "dont-fragment", cmd_ip_df
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the don't fragment flag in IPv4 header");
335 cli_register_command(cli
, ip_packet
, "more-fragments", cmd_ip_mf
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the more fragments flag in IPv4 header");
336 cli_register_command(cli
, ip_packet
, "fragment-size", cmd_ip_fragsize
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the fragment size to enable fragmentation");
337 cli_register_command(cli
, ip_packet
, "fragment-overlap", cmd_ip_fragoverlap
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure a fragmentation overlap");
338 cli_register_command(cli
, ip_packet
, "option", cmd_ip_option
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure IPv4 options");
339 cli_register_command(cli
, ip_packet
, "auto-delivery", cmd_ip_delivery
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Enable or disable IP auto-delivery");
340 // --------- IP commands:
341 cli_register_command(cli
, NULL
, "version", cmd_ip_version
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Specify the IP version (default: 4)");
342 cli_register_command(cli
, NULL
, "ttl", cmd_ip_ttl
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Specify the TTL (default: 255)");
343 cli_register_command(cli
, NULL
, "source-address", cmd_ip_address_source
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Specify the source IP address");
344 cli_register_command(cli
, NULL
, "destination-address", cmd_ip_address_destination
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Specify the destination IP address");
345 cli_register_command(cli
, NULL
, "protocol", cmd_ip_protocol
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Specify the IP protocol");
346 cli_register_command(cli
, NULL
, "hlen", cmd_ip_hlen
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Specify the IP header length");
347 cli_register_command(cli
, NULL
, "len", cmd_ip_len
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Specify the IP packet length");
348 cli_register_command(cli
, NULL
, "identification", cmd_ip_id
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Specify the IP identification");
349 cli_register_command(cli
, NULL
, "offset", cmd_ip_offset
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Specify the fragment offset");
350 cli_register_command(cli
, NULL
, "sum", cmd_ip_sum
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Specify the IP header checksum");
351 cli_register_command(cli
, NULL
, "tos", cmd_ip_tos
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Specify the Type of Service");
352 cli_register_command(cli
, NULL
, "dscp", cmd_ip_dscp
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Specify the DSCP");
353 cli_register_command(cli
, NULL
, "reserved", cmd_ip_rsv
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Set or unset the reserved bit");
354 cli_register_command(cli
, NULL
, "df", cmd_ip_df
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Set or unset the Don't Fragment (DF) bit");
355 cli_register_command(cli
, NULL
, "mf", cmd_ip_mf
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Set or unset the More Fragments (MF) bit");
356 cli_register_command(cli
, NULL
, "fragment-size", cmd_ip_fragsize
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Configure the fragment size to enable fragmentation");
357 cli_register_command(cli
, NULL
, "fragment-overlap", cmd_ip_fragoverlap
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Configure a fragmentation overlap");
358 cli_register_command(cli
, NULL
, "option", cmd_ip_option
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Configure an IP option");
359 cli_register_command(cli
, NULL
, "auto-delivery", cmd_ip_delivery
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "Enable or disable IP auto-delivery");
360 cli_register_command(cli
, NULL
, "end", cmd_ip_end
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IP
, "End IP configuration mode");
362 // ---------- UDP related (for all packets that have UDP as transport layer)
363 udp_packet
= cli_register_command(cli
, NULL
, "udp", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure packet's UDP header parameters");
364 cli_register_command(cli
, udp_packet
, "checksum", cmd_udp_sum
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the UDP checksum");
365 cli_register_command(cli
, udp_packet
, "length", cmd_udp_len
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the UDP length field");
366 // ---------- UDP commands:
367 cli_register_command(cli
, NULL
, "checksum", cmd_udp_sum
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_UDP
, "Configure the UDP checksum");
368 cli_register_command(cli
, NULL
, "length", cmd_udp_len
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_UDP
, "Configure the UDP length field");
369 cli_register_command(cli
, NULL
, "end", cmd_udp_end
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_UDP
, "End UDP configuration mode");
371 // ---------- TCP related (for all packets that have TCP as transport layer)
372 tcp_packet
= cli_register_command(cli
, NULL
, "tcp", NULL
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure packet's TCP header parameters");
373 cli_register_command(cli
, tcp_packet
, "seqnr", cmd_tcp_seqnr
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the TCP sequence number");
374 cli_register_command(cli
, tcp_packet
, "acknr", cmd_tcp_acknr
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the TCP acknowledgement number");
375 cli_register_command(cli
, tcp_packet
, "hlen", cmd_tcp_offset
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the TCP header length");
376 cli_register_command(cli
, tcp_packet
, "reserved", cmd_tcp_res
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the TCP reserved field");
377 cli_register_command(cli
, tcp_packet
, "flags", cmd_tcp_flags
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure a combination of TCP flags at once");
378 cli_register_command(cli
, tcp_packet
, "cwr", cmd_tcp_cwr
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Set or unset the TCP CWR flag");
379 cli_register_command(cli
, tcp_packet
, "ece", cmd_tcp_ece
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Set or unset the TCP ECE flag");
380 cli_register_command(cli
, tcp_packet
, "urg", cmd_tcp_urg
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Set or unset the TCP URG flag");
381 cli_register_command(cli
, tcp_packet
, "ack", cmd_tcp_ack
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "set or unset the TCP ACK flag");
382 cli_register_command(cli
, tcp_packet
, "psh", cmd_tcp_psh
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "set or unset the TCP PSH flag");
383 cli_register_command(cli
, tcp_packet
, "rst", cmd_tcp_rst
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "set or unset the TCP RST flag");
384 cli_register_command(cli
, tcp_packet
, "syn", cmd_tcp_syn
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "set or unset the TCP SYN flag");
385 cli_register_command(cli
, tcp_packet
, "fin", cmd_tcp_fin
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "set or unset the TCP FIN flag");
386 cli_register_command(cli
, tcp_packet
, "window", cmd_tcp_window
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the TCP window size");
387 cli_register_command(cli
, tcp_packet
, "checksum", cmd_tcp_sum
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the TCP checksum");
388 cli_register_command(cli
, tcp_packet
, "urgent-pointer", cmd_tcp_urgptr
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure the TCP urgend pointer");
389 cli_register_command(cli
, tcp_packet
, "options", cmd_tcp_options
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET
, "Configure TCP options");
390 // ---------- TCP commands:
391 cli_register_command(cli
, NULL
, "seqnr", cmd_tcp_seqnr
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "Configure the TCP sequence number");
392 cli_register_command(cli
, NULL
, "acknr", cmd_tcp_acknr
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "Configure the TCP acknowledgement number");
393 cli_register_command(cli
, NULL
, "hlen", cmd_tcp_offset
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "Configure the TCP header length");
394 cli_register_command(cli
, NULL
, "reserved", cmd_tcp_res
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "Configure the TCP reserved field");
395 cli_register_command(cli
, NULL
, "flags", cmd_tcp_flags
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "Configure a combination of TCP flags at once");
396 cli_register_command(cli
, NULL
, "cwr", cmd_tcp_cwr
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "Set or unset the TCP CWR flag");
397 cli_register_command(cli
, NULL
, "ece", cmd_tcp_ece
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "Set or unset the TCP ECE flag");
398 cli_register_command(cli
, NULL
, "urg", cmd_tcp_urg
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "Set or unset the TCP URG flag");
399 cli_register_command(cli
, NULL
, "ack", cmd_tcp_ack
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "set or unset the TCP ACK flag");
400 cli_register_command(cli
, NULL
, "psh", cmd_tcp_psh
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "set or unset the TCP PSH flag");
401 cli_register_command(cli
, NULL
, "rst", cmd_tcp_rst
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "set or unset the TCP RST flag");
402 cli_register_command(cli
, NULL
, "syn", cmd_tcp_syn
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "set or unset the TCP SYN flag");
403 cli_register_command(cli
, NULL
, "fin", cmd_tcp_fin
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "set or unset the TCP FIN flag");
404 cli_register_command(cli
, NULL
, "window", cmd_tcp_window
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "Configure the TCP window size");
405 cli_register_command(cli
, NULL
, "checksum", cmd_tcp_sum
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "Configure the TCP checksum");
406 cli_register_command(cli
, NULL
, "urgent-pointer", cmd_tcp_urgptr
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "Configure the TCP urgend pointer");
407 cli_register_command(cli
, NULL
, "options", cmd_tcp_options
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "Configure TCP options");
408 cli_register_command(cli
, NULL
, "end", cmd_tcp_end
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_TCP
, "End TCP configuration mode");
410 // --------- ARP commands:
411 cli_register_command(cli
, NULL
, "hardware-type", cmd_arp_hwtype
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_ARP
, "Specify the hardware type");
412 cli_register_command(cli
, NULL
, "protocol-type", cmd_arp_prtype
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_ARP
, "Specify the protocol type");
413 cli_register_command(cli
, NULL
, "hw-addr-size", cmd_arp_hwaddrsize
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_ARP
, "Specify the hardware address size");
414 cli_register_command(cli
, NULL
, "pr-addr-size", cmd_arp_praddrsize
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_ARP
, "Specify the protocol address size");
415 cli_register_command(cli
, NULL
, "opcode", cmd_arp_opcode
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_ARP
, "Specify the ARP opcode");
416 cli_register_command(cli
, NULL
, "sender-mac", cmd_arp_smac
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_ARP
, "Specify the sender MAC address");
417 cli_register_command(cli
, NULL
, "sender-ip", cmd_arp_sip
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_ARP
, "Specify the sender IP address");
418 cli_register_command(cli
, NULL
, "target-mac", cmd_arp_tmac
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_ARP
, "Specify the target MAC address");
419 cli_register_command(cli
, NULL
, "target-ip", cmd_arp_tip
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_ARP
, "Specify the target IP address");
420 cli_register_command(cli
, NULL
, "trailer", cmd_arp_trailer
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_ARP
, "Specify the trailer length");
421 cli_register_command(cli
, NULL
, "end", cmd_arp_end
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_ARP
, "End ARP configuration mode");
423 // --------- BPDU commands:
424 cli_register_command(cli
, NULL
, "id", cmd_bpdu_id
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the BPDU identifier");
425 cli_register_command(cli
, NULL
, "version", cmd_bpdu_version
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the BPDU version");
426 cli_register_command(cli
, NULL
, "bpdutype", cmd_bpdu_type
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the BPDU type");
427 cli_register_command(cli
, NULL
, "flags", cmd_bpdu_flags
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the BPDU flags");
428 cli_register_command(cli
, NULL
, "root-id", cmd_bpdu_rid
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the BPDU root identifier");
429 cli_register_command(cli
, NULL
, "path-cost", cmd_bpdu_pc
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the BPDU root path cost");
430 cli_register_command(cli
, NULL
, "bridge-id", cmd_bpdu_bid
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the BPDU bridge identifier");
431 cli_register_command(cli
, NULL
, "port-id", cmd_bpdu_pid
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the BPDU port identifier");
432 cli_register_command(cli
, NULL
, "age", cmd_bpdu_age
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the BPDU age");
433 cli_register_command(cli
, NULL
, "maxage", cmd_bpdu_maxage
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the BPDU maxage");
434 cli_register_command(cli
, NULL
, "hello-interval", cmd_bpdu_hello
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the BPDU hello interval");
435 cli_register_command(cli
, NULL
, "forward-delay", cmd_bpdu_fwd
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the BPDU forward delay");
436 cli_register_command(cli
, NULL
, "mode", cmd_bpdu_mode
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the BPDU mode");
437 cli_register_command(cli
, NULL
, "vlan", cmd_bpdu_vlan
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "Specify the vlan for PVST+");
438 cli_register_command(cli
, NULL
, "end", cmd_bpdu_end
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_BPDU
, "End BPDU configuration mode");
440 // --------- IGMP commands:
441 cli_register_command(cli
, NULL
, "v2-general-query", cmd_igmpv2_genquery
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IGMP
, "Create an IGMPv2 general query");
442 cli_register_command(cli
, NULL
, "v2-group-specific-query", cmd_igmpv2_specquery
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IGMP
, "Create an IGMPv2 group-specific query");
443 cli_register_command(cli
, NULL
, "v2-report", cmd_igmpv2_report
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IGMP
, "Create an IGMPv2 membership report");
444 cli_register_command(cli
, NULL
, "v2-leave", cmd_igmpv2_leave
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IGMP
, "Create an IGMPv2 leave group message");
445 cli_register_command(cli
, NULL
, "v1-query", cmd_igmpv1_query
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IGMP
, "Create an IGMPv1 query");
446 cli_register_command(cli
, NULL
, "v1-report", cmd_igmpv1_report
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IGMP
, "Create an IGMPv1 membership report");
447 cli_register_command(cli
, NULL
, "end", cmd_ip_end
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_IGMP
, "End IGMP configuration mode"); // we reuse cmd_ip_end here!
449 cli_register_command(cli
, NULL
, "conformance", cmd_lldp_conformance
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_LLDP
, "Enable or disable LLDP standard conformance");
450 cli_register_command(cli
, NULL
, "chassis-id", cmd_lldp_chassis_id
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_LLDP
, "Configure the LLDP Chassis-ID");
451 cli_register_command(cli
, NULL
, "port-id", cmd_lldp_port_id
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_LLDP
, "Configure the LLDP Port-ID");
452 cli_register_command(cli
, NULL
, "ttl", cmd_lldp_ttl
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_LLDP
, "Configure the LLDP Time-to-Live");
453 cli_register_command(cli
, NULL
, "vlan", cmd_lldp_vlan
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_LLDP
, "Configure the LLDP Port VLAN-ID");
454 cli_register_command(cli
, NULL
, "generic-tlv", cmd_lldp_opt_tlv
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_LLDP
, "Configure a generic LLDP TLV");
455 cli_register_command(cli
, NULL
, "bad-tlv", cmd_lldp_opt_tlv_bad
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_LLDP
, "Configure a bad TLV for testing purposes");
456 cli_register_command(cli
, NULL
, "organisational-tlv", cmd_lldp_opt_org
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_LLDP
, "Configure an organisational LLDP TLV");
457 cli_register_command(cli
, NULL
, "early-end", cmd_lldp_endtlv
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_LLDP
, "Insert an 'early' End-of-LLDPU TLV");
458 cli_register_command(cli
, NULL
, "reset", cmd_lldp_reset
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_LLDP
, "Reset the LLDPU to defaults and clear all optional TLVs");
459 cli_register_command(cli
, NULL
, "end", cmd_ip_end
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_LLDP
, "End IGMP configuration mode"); // we reuse cmd_ip_end here!
461 // --------- RTP commands:
462 cli_register_command(cli
, NULL
, "version", cmd_rtp_version
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_RTP
, "Specify the RTP version (default: 2)");
463 cli_register_command(cli
, NULL
, "padding", cmd_rtp_padding
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_RTP
, "Set or unset the padding flag (default: 0)");
464 cli_register_command(cli
, NULL
, "xten", cmd_rtp_xten
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_RTP
, "Set or unset the eXtension flag (default: 0)");
465 cli_register_command(cli
, NULL
, "marker", cmd_rtp_marker
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_RTP
, "Set or unset the marker flag (default: 0)");
466 cli_register_command(cli
, NULL
, "csrc-count", cmd_rtp_cc
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_RTP
, "Configure the CSRC count (default: 0)");
467 cli_register_command(cli
, NULL
, "csrc-list", cmd_rtp_cclist
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_RTP
, "Configure the CSRC list (default: none)");
468 cli_register_command(cli
, NULL
, "payload-type", cmd_rtp_pt
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_RTP
, "Configure the payload type (default: G.711, A-law, 20 msec)");
469 cli_register_command(cli
, NULL
, "sequence-number", cmd_rtp_sqnr
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_RTP
, "Configure the sequence number");
470 cli_register_command(cli
, NULL
, "timestamp", cmd_rtp_time
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_RTP
, "Configure the timestamp");
471 cli_register_command(cli
, NULL
, "ssrc", cmd_rtp_ssrc
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_RTP
, "Configure the SSRC (source identifier)");
472 cli_register_command(cli
, NULL
, "extension", cmd_rtp_extension
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_RTP
, "Configure an extension header");
473 cli_register_command(cli
, NULL
, "source", cmd_rtp_source
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_RTP
, "Specify a media source");
474 cli_register_command(cli
, NULL
, "end", cmd_ip_end
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_RTP
, "End RTP configuration mode"); // we reuse cmd_ip_end here!
476 // --------- DNS commands:
477 cli_register_command(cli
, NULL
, "ttl", cmd_dns_ttl
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_DNS
, "Specify the TTL (default: 0)");
478 cli_register_command(cli
, NULL
, "query", cmd_dns_query
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_DNS
, "Specify the query");
479 cli_register_command(cli
, NULL
, "answer", cmd_dns_answer
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_DNS
, "Specify the answer");
480 cli_register_command(cli
, NULL
, "end", cmd_dns_end
, PRIVILEGE_PRIVILEGED
, MZ_MODE_PACKET_DNS
, "End DNS configuration mode");
483 // --------- SEQUENCE COMMANDS
484 cli_register_command(cli
, NULL
, "add", sequence_add
, PRIVILEGE_PRIVILEGED
, MZ_MODE_SEQUENCE
, "Add another packet to the current sequence");
485 cli_register_command(cli
, NULL
, "delay", sequence_delay
, PRIVILEGE_PRIVILEGED
, MZ_MODE_SEQUENCE
, "Add a delay to the current sequence");
486 cli_register_command(cli
, NULL
, "show", sequence_show
, PRIVILEGE_PRIVILEGED
, MZ_MODE_SEQUENCE
, "Show current sequence list");
487 cli_register_command(cli
, NULL
, "remove", sequence_remove
, PRIVILEGE_PRIVILEGED
, MZ_MODE_SEQUENCE
, "Remove a packet or delay from the current sequence");
488 cli_register_command(cli
, NULL
, "end", cmd_end_to_config
, PRIVILEGE_PRIVILEGED
, MZ_MODE_SEQUENCE
, "End sequence configuration mode");
489 // ---- BENCHMARK CONFIG MODE COMMANDS: ---
490 // ---- SCAN CONFIG MODE COMMANDS: ---
492 // ---- CONTROL COMMANDS: ----
493 cli_register_command(cli
, NULL
, "terminate", stop_mausezahn
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Terminate the Mausezahn server");
494 run
= cli_register_command(cli
, NULL
, "run", NULL
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Run previously configured mops instances or sequences");
495 cli_register_command(cli
, run
, "id", cmd_run_id
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Run mops packet(s) by specifying packet identifiers");
496 cli_register_command(cli
, run
, "name", cmd_run_name
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Run mops packet(s) by specifying packet names");
497 cli_register_command(cli
, run
, "sequence", cmd_run_sequence
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Run a packet sequence");
498 cli_register_command(cli
, run
, "all", cmd_run_all
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Run all currently configured mops packet(s)");
499 cli_register_command(cli
, NULL
, "tx", transmit
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Send inline configured packet (legacy mode; not recommended)");
500 cli_register_command(cli
, NULL
, "stop", cmd_stop
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Stop transmission");
501 cli_register_command(cli
, NULL
, "load", cmd_load
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Load commands from a file");
503 // ---- SET COMMANDS: -----
504 cli_register_command(cli
, NULL
, "set", cmd_set
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Set global Mausezahn parameters");
506 // ---- CLEAR COMMANDS: -----
507 clear
= cli_register_command(cli
, NULL
, "clear", NULL
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Clear something (use '?')");
508 cli_register_command(cli
, clear
, "all", clear_all
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Re-initialize Mausezahn");
509 cli_register_command(cli
, clear
, "packet", clear_packet
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Delete a packet (i. e. MOPS entry)");
511 // ---- SHOW COMMANDS: -----
512 show
= cli_register_command(cli
, NULL
, "show", NULL
, PRIVILEGE_UNPRIVILEGED
, MODE_EXEC
, "Show something (use '?')");
513 cli_register_command(cli
, show
, "packet", show_packets
, PRIVILEGE_UNPRIVILEGED
, MODE_EXEC
, "Show defined packets");
514 // cli_register_command(cli, show, "system", show_system, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show basic system settings");
515 cli_register_command(cli
, show
, "interfaces", show_interfaces
, PRIVILEGE_UNPRIVILEGED
, MODE_EXEC
, "Show detailed interface information");
516 cli_register_command(cli
, show
, "mops", show_mops
, PRIVILEGE_UNPRIVILEGED
, MODE_EXEC
, "Show MOPS details");
517 // cli_register_command(cli, show, "processes", cmd_test, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "List all Mausezahn processes");
518 cli_register_command(cli
, show
, "set", show_set
, PRIVILEGE_UNPRIVILEGED
, MODE_EXEC
, "List general packet parameters");
519 cli_register_command(cli
, show
, "arp", show_arp
, PRIVILEGE_UNPRIVILEGED
, MODE_EXEC
, "Show the advanced Mausezahn ARP table");
521 // cli_register_command(cli, show, "report", cmd_test, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Print reports");
523 // ---- PRIVILEGE (OTHER) ----
524 reset
= cli_register_command(cli
, NULL
, "reset", NULL
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Reset something...");
525 cli_register_command(cli
, reset
, "interface", cmd_reset_interface
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Reset interfaces");
526 cli_register_command(cli
, reset
, "packet", cmd_reset_packet
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Reset interfaces");
527 // ------- LAUNCH ------
528 launch
= cli_register_command(cli
, NULL
, "launch", NULL
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Launch a predefined MOPS process");
529 cli_register_command(cli
, launch
, "bpdu", launch_bpdu
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Launch a(nother) BPDU process");
530 cli_register_command(cli
, launch
, "synflood", launch_synflood
, PRIVILEGE_PRIVILEGED
, MODE_EXEC
, "Launch a(nother) SYN-Flood process");
531 // cli_register_command(cli, launch, "alot", launch_alot, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Launch lots of traffic");
532 // cli_register_command(cli, launch, "rtp", launch_rtp, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Launch rtp stream(s)");
533 // cli_register_command(cli, launch, "arp", launch_arp, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Launch a(nother) ARP process");
534 // cli_register_command(cli, launch, "lldp", launch_lldp, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Launch a(nother) LLDP process");
537 // *******************************************************
540 s
= socket(AF_INET
, SOCK_STREAM
, 0);
541 setsockopt(s
, SOL_SOCKET
, SO_REUSEADDR
, &on
, sizeof(on
));
543 // Should we bind the CLI session to a specific interface?
544 // TODO: This does nothing !?
545 for (i
=0; i
<device_list_entries
; i
++) {
546 if (device_list
[i
].cli
) {
547 setsockopt(s
, SOL_SOCKET
, SO_BINDTODEVICE
, device_list
[i
].dev
, strnlen(device_list
[i
].dev
, 16));
548 break; // can only be one interface
552 // Listen on port mz_port (default: 25542, towel day)
553 memset(&servaddr
, 0, sizeof(servaddr
));
554 servaddr
.sin_family
= AF_INET
;
555 inet_aton(mz_listen_addr
, &servaddr
.sin_addr
);
556 servaddr
.sin_port
= htons(mz_port
);
557 bind(s
, (struct sockaddr
*)&servaddr
, sizeof(servaddr
));
560 fprintf(stderr
, "Mausezahn accepts incoming Telnet connections on %s:%i.\n", mz_listen_addr
, mz_port
);
563 // Wait for a connection
566 while ((x
= accept(s
, NULL
, 0)))
571 timestamp_human(TimeStamp
, NULL
);
572 fprintf(stderr
, "Got incoming connection [%i] at %s.\n", cnt
, TimeStamp
);
576 // Pass the connection off to libcli
581 timestamp_human(TimeStamp
, NULL
);
582 fprintf(stderr
, "Connection [%i] left at %s.\n", cnt
, TimeStamp
);
588 // Free data structures