diff options
author | Daniel Borkmann <dborkman@redhat.com> | 2013-05-13 13:53:27 +0200 |
---|---|---|
committer | Daniel Borkmann <dborkman@redhat.com> | 2013-05-13 15:10:16 +0200 |
commit | d0009856814c13d13770db5aadd7b2fabf947776 (patch) | |
tree | 6d18a94439f27f3c2685f05c57435116673f40cc /staging/send.c | |
parent | 2b100f7515dbd01032967c2d1b81d2f8d63bf9b5 (diff) |
staging: add mausezahn staging directory
After some back and forth, we decided that it is easier to maintain
mausezahn in a staging directory until it is fully reworked and
cleaned up to be ready to be fully integrated. This way, it is better
than having it in a separate branch, and we can also accept patches
from outside more easily. Also, while at it, fix up some function
mismatches with libcli.
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Diffstat (limited to 'staging/send.c')
-rw-r--r-- | staging/send.c | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/staging/send.c b/staging/send.c new file mode 100644 index 0000000..5ad1a20 --- /dev/null +++ b/staging/send.c @@ -0,0 +1,264 @@ +/* + * Mausezahn - A fast versatile traffic generator + * Copyright (C) 2008 Herbert Haas + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License version 2 as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, see http://www.gnu.org/licenses/gpl-2.0.html + * +*/ + + + + + +// *************************************************************************** +// +// This sections contains: +// +// - complexity() ... calculates and reports how many frames will +// be generated. +// - send_frame() ... the general and mighty SENDING FUNCTION. +// +// *************************************************************************** + +#include "mz.h" +#include "cli.h" + + +// Calculates the number of frames to be sent. +// Should be used as standard output except the +// 'quiet' option (-q) has been specified. +int complexity() +{ + unsigned long int + nr_sqnr = 1, + nr_dp = 1, + nr_sp = 1, + nr_da = 1, + nr_sa = 1; + + u_int32_t + sn1, + sn2, + delta; + + long double ref; + + if (tx.count==0) goto infinity; + + total_d = 1.0; + + // How many sequence numbers? + if (tx.tcp_seq_delta) + { + sn1 = tx.tcp_seq_start; + sn2 = tx.tcp_seq_stop; + delta = tx.tcp_seq_delta; + + if (sn1<sn2) // the easier case + { + nr_sqnr = (sn2-sn1)/delta; + } + else + { + nr_sqnr = (sn2 + (0xffffffff - sn1)) / delta; + } + //fprintf(stderr,"SQNR Range = %lu\n",nr_sqnr); + nr_sqnr +=1; + } + + if (tx.dp_isrange) + { + nr_dp = tx.dp_stop - tx.dp_start + 1; + //fprintf(stderr,"DP Range = %lu\n",nr_dp); + } + + if (tx.sp_isrange) + { + nr_sp = tx.sp_stop - tx.sp_start + 1; + //fprintf(stderr,"SP Range = %lu\n",nr_sp); + } + + if (tx.ip_dst_isrange) + { + nr_da = tx.ip_dst_stop - tx.ip_dst_start + 1; + //fprintf(stderr,"DA Range = %lu\n",nr_da); + } + + if (tx.ip_src_isrange) + { + nr_sa = tx.ip_src_stop - tx.ip_src_start + 1; + //fprintf(stderr,"SA Range = %lu\n",nr_sa); + } + + total_d *= tx.count; + total_d *= nr_sqnr; + total_d *= nr_dp; + total_d *= nr_sp; + total_d *= nr_da; + total_d *= nr_sa; + + + + + ref=0xffffffff; + + ref*=ref; + + if (total_d>ref) + { + fprintf(stderr, "You must be crazy...\n"); + } + else if (total_d>0xffffffff) + { + fprintf(stderr, "Do you REALLY know what you do?\n"); + } + else if (total_d>0xffffff) + { + fprintf(stderr, "Do you know what you do?\n"); + } + + if (mz_port) + { + cli_print(gcli, "Mausezahn will send %.Lf frames...\r", total_d); + } + else + { + fprintf(stderr, "Mausezahn will send %.Lf frames... ", total_d); + fflush(stderr); + if (verbose) fprintf(stderr,"\n"); + } + + + + mz_start = clock(); + + infinity: + + + if (tx.count==0) + { + if (mz_port) + { + cli_print(gcli, "Mausezahn will send frames infinitly...\n"); + } + else + { + fprintf(stderr, "Mausezahn will send frames infinitly...\n"); + } + } + + + return 0; +} + + + +/////////////////////////////////////////////////////////////////////// +// +// Send complete frame (layers 2, 3, 4) multiple times if required +// +// +int send_frame (libnet_t *l, libnet_ptag_t t3, libnet_ptag_t t4) +{ + int i=0, count; + + int // local vars are faster ;-) + tcp_seq_delta, + dp_isrange, + sp_isrange, + ip_dst_isrange, + ip_src_isrange, + rtp_mode=0; + + + count = tx.count; + tcp_seq_delta = tx.tcp_seq_delta; + dp_isrange = tx.dp_isrange; + sp_isrange = tx.sp_isrange; + ip_dst_isrange = tx.ip_dst_isrange; + ip_src_isrange = tx.ip_src_isrange | tx.ip_src_rand; + if (mode == RTP) rtp_mode = 1; + + if (count==0) goto AGAIN; + + for (i=0; i<count; i++) + { + + AGAIN: + + if (verbose) (void) print_frame_details(); + libnet_write(l); + if (mz_rand) tx.delay=(unsigned int) tx.delay*rand()/RAND_MAX; + if (tx.delay) SLEEP (tx.delay); + + // No layer-2 modifications done here + // (see create_eth_frame which does L2 modifications additionally) + + + if (tcp_seq_delta) + { + if (update_TCP_SQNR(l, t4)==0) // end of range not yet reached + { + goto AGAIN; + } + } + + if (dp_isrange) + { + if (update_DPORT(l, t4)==0) // end of range not yet reached + { + goto AGAIN; + } + } + + if (sp_isrange) + { + if (update_SPORT(l, t4)==0) // end of range not yet reached + { + goto AGAIN; + } + } + + + if (ip_dst_isrange) + { + if (update_IP_DA(l, t3)==0) // end of range not yet reached + { + goto AGAIN; + } + } + + if (ip_src_isrange) // also catches random SA (see above) + { + if (update_IP_SA(l, t3)==0) // end of range not yet reached + { + goto AGAIN; + } + } + + if (rtp_mode) // update SQNR and Timestamps in RTP header and payload + { + update_RTP(l, t4); + } + + + if (!count) goto AGAIN; + } + + + + libnet_destroy(l); + + return 0; +} + |