summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Lombardo <lomato@gmail.com>2016-09-09 16:33:55 +0200
committerMichael Mann <mmann78@netscape.net>2016-09-11 04:22:58 +0000
commit193e366a3f54ba08a16322add7da0a4089210897 (patch)
tree756b2f2214e7a86f691428a6924894da560baa1d
parente8f1d2abda939f37d99f272f8a76a191c9a752b4 (diff)
downloadwireshark-193e366a3f54ba08a16322add7da0a4089210897.tar.gz
remove unused mkcap.c.
mkcap.c is not used in any place. Change-Id: Ie29b2ed66bc304a5b6a19fc9128ead2958f8062a Reviewed-on: https://code.wireshark.org/review/17610 Reviewed-by: Richard Sharpe <realrichardsharpe@gmail.com> Reviewed-by: Michael Mann <mmann78@netscape.net>
-rw-r--r--.editorconfig2
-rw-r--r--mkcap.c704
2 files changed, 1 insertions, 705 deletions
diff --git a/.editorconfig b/.editorconfig
index d531f437e2..5553812b20 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -30,7 +30,7 @@ indent_size = 4
indent_style = space
indent_size = 4
-[{capinfos,captype,mergecap,mkcap,tfshark,tshark}.c]
+[{capinfos,captype,mergecap,tfshark,tshark}.c]
indent_size = 2
[{dftest,echld_test,randpkt,trigcap}.c]
diff --git a/mkcap.c b/mkcap.c
deleted file mode 100644
index 76cdcda150..0000000000
--- a/mkcap.c
+++ /dev/null
@@ -1,704 +0,0 @@
-/* mkcap.c
- * A small program to generate the ASCII form of a capture with TCP
- * segments of a reasonable nature. The payload is all zeros.
- *
- * By Ronnie Sahlberg and Richard Sharpe. From a program initially
- * written by Ronnie.
- * Copyright 2003 Ronnie Sahlberg and Richard Sharpe
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Using it to generate a capture file:
- * ./mkcap [some-flags] > some-file
- * text2pcap [some-other-flags] some-file some-file.cap
- * For example:
-
-./mkcap -a 2500 -s 15 -I "02 03 04 05" -i "45 45 45 45" -P "00 14" > ftp.cap.asci
-text2pcap -t "%Y/%m/%d%t%H:%M:%S." ftp.cap.asci ftp.cap
-
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#define ETH_1 "00 00 9c fa 1d 74"
-#define ETH_2 "00 1a b8 93 f6 71"
-#define IP_1 "0a 01 01 17"
-#define IP_2 "0a 01 01 ea"
-#define PORT_1 "01 00"
-#define PORT_2 "10 00"
-
-char *eth_1 = ETH_1;
-char *eth_2 = ETH_2;
-char *ip_1 = IP_1;
-char *ip_2 = IP_2;
-char *port_1 = PORT_1;
-char *port_2 = PORT_2;
-
-int verbose = 0;
-
-typedef enum {
- normal = 0,
- random_ack_drop = 1,
- random_data_drop = 2,
-} run_type_t;
-
-typedef struct {
- int drop_seg_start;
- int drop_seg_count;
-} seg_drop_t;
-
-/*
- * The array of which segments should be dropped ...
- */
-seg_drop_t *drops = NULL;
-int seg_drop_count = 0;
-/* The array of which ACKs should be dropped. This is complicated because
- * An ack might not be generated for a segment because of delayed ACKs.
- */
-seg_drop_t *ack_drops = NULL;
-int ack_drop_count = 0;
-
-int total_bytes = 32768;
-int run_type = 0;
-
-int seq_2=0;
-int seq_1=0;
-int ts=0;
-int jitter = 0;
-int send_spacing = 10;
-int ack_delay = 5000;
-int tcp_nodelay = 0;
-int tcp_delay_time = 1000; /* What is the real time here? */
-/*
- * If tcp_nodelay is set, then this is the amount of data left ...
- */
-int remaining_data = 0;
-int snap_len = 1500;
-int window = 32768;
-int ssthresh = 16384;
-int cwnd = 1460;
-int used_win = 0;
-int segment = 0;
-
-#define SEG_ACK_LOST 1
-#define SEG_SEG_LOST 2
-
-struct seg_hist_s {
- int seq_num; /* First sequence number in segment */
- int len; /* Number of bytes in segment */
- int ts; /* Timestamp when sent */
- int seg_num; /* Segment number sent. This can change */
- /* but a retransmit will have a new seg */
- int flags; /* Flags as above for ack and seg loss */
- int acks_first_seq; /* How many times we have seen an ack
- for the first seq number in this seg */
-};
-
-#define SEG_HIST_SIZE 128
-struct seg_hist_s seg_hist[128]; /* This should be dynamic */
-int next_slot = 0;
-int first_slot = 0;
-
-int delayed_ack = 1; /* Default is delayed ACKs in use ... */
-int delayed_ack_wait = 30000; /* 30 mS before an ACK is generated if */
- /* no other traffic */
-
-void
-makeseg(char *eth1, char *eth2, char *ip1, char *ip2, char *p1, char *p2, int *s1, int *s2, char *flags, int len)
-{
- int i;
-
- printf("2002/01/07 00:00:%02d.%06d\n", ts/1000000, ts%1000000);
- printf("0000 %s %s 08 00\n", eth1, eth2);
- printf("000e 45 00 %02x %02x 00 00 00 00 40 06 00 00 %s %s\n", (len+40)>>8, (len+40)&0xff, ip1, ip2);
- printf("0022 %s %s %02x %02x %02x %02x %02x %02x %02x %02x 50 %s 80 00 00 00 00 00", p1, p2,
- ((*s1)>>24)&0xff,
- ((*s1)>>16)&0xff,
- ((*s1)>>8)&0xff,
- ((*s1))&0xff,
- ((*s2)>>24)&0xff,
- ((*s2)>>16)&0xff,
- ((*s2)>>8)&0xff,
- ((*s2))&0xff,
- flags );
- for(i=0;i<(len<(snap_len-40)?len:snap_len-40);i++)printf(" 00");
- printf("\n");
- printf("\n");
- (*s1)+=len;
-}
-
-/*
- * Figure out when the next ack is due ... here we must skip the acks for
- * frames that are marked as ACKs dropped as well as the frames marked as
- * frames dropped. These will be marked by the routine that generates ACKs.
- * Returns a timestamp value. Returns 2^^31-1 if none are due at all
- */
-int next_ack_due()
-{
- int slot = next_slot;
- int ack_lost = 0, seg_lost = 0;
-
- if (next_slot == first_slot)
- return ((1U<<31) - 1);
-
- /*
- * Figure out if we need to issue an ACK. We skip all outstanding packets
- * that are marked as ack lost or packet lost.
- *
- * We would not usually come in here with a frame marked as lost or ack lost
- * rather, we will come in here and specify that the ack was due at a
- * certain time, and gen_next_ack would then determine that the ack
- * should be lost or the packet lost.
- */
-
- /*
- * Look for a seg slot that is not lost or dropped
- */
-
- while (seg_hist[slot].flags & (SEG_ACK_LOST || SEG_SEG_LOST)) {
- if (seg_hist[slot].flags & SEG_ACK_LOST)
- ack_lost++;
- if (seg_hist[slot].flags & SEG_SEG_LOST)
- seg_lost++;
- slot = (slot + 1) % SEG_HIST_SIZE;
- }
-
- if (slot == next_slot)
- return ((1U<<31) - 1);
-
- /*
- * If there is only one slot occupied, or a segment was lost then
- * an ACK is due after the last [good] segment left plus ack_delay
- */
-
- if (slot == first_slot && next_slot == ((first_slot + 1) % SEG_HIST_SIZE))
- return (seg_hist[first_slot].ts + ack_delay + jitter);
-
- if (seg_lost)
- return (seg_hist[slot].ts + ack_delay + jitter);
-
- /*
- * OK, now, either we have only seen lost acks, or there are more than
- * one outstanding segments, so figure out when the ACK is due.
- *
- * If delayed ACK is in force, ACK is due after every second seg, but
- * if we had a lost ack, then we must ignore 2*lost_ack segments. So,
- * if there has not been that many segments sent, we return infinity
- * as the next ACK time
- */
-
- if (ack_lost) {
- if (delayed_ack) {
- if (((first_slot + 1 + 2 * ack_lost) % SEG_HIST_SIZE) >= next_slot)
- /* XXX: FIXME, what about when the window is closed */
- /* XXX: FIXME, use the correct value for this */
- return ((1U<<31) - 1);
- else
- return seg_hist[(first_slot + 1 + 2 * ack_lost) % SEG_HIST_SIZE].ts +
- ack_delay + jitter;
- }
- else
- return seg_hist[slot].ts + ack_delay + jitter;
- }
- else {
- if (delayed_ack)
- return (seg_hist[(first_slot + 1)%SEG_HIST_SIZE].ts+ack_delay+jitter);
- else
- return (seg_hist[first_slot].ts+ack_delay+jitter);
- }
-}
-
-/*
- * Update the relevant info of the sent seg
- */
-add_seg_sent(int seq, int len)
-{
-
- /*
- * Should check we have not wrapped around and run into the unacked
- * stuff ...
- */
- /*if (next_slot == first_slot) ;*/
-
- segment++;
- seg_hist[next_slot].seq_num = seq;
- seg_hist[next_slot].len = len;
- seg_hist[next_slot].ts = ts;
- seg_hist[next_slot].seg_num = segment;
- seg_hist[next_slot].flags = 0;
- seg_hist[next_slot].acks_first_seq = 0;
- used_win = used_win + len; /* Update the window used */
-
- /*
- * Now, update next_slot ...
- */
-
- next_slot = (next_slot + 1) % SEG_HIST_SIZE;
-
-}
-
-/*
- * Generate the next ack based on the above reasoning ...
- */
-
-#define NO_FORCE_ACK 0
-#define FORCE_ACK 1
-
-/*
- * Generate the next ACK. If we did not generate an ACK, return 0,
- * else return 1.
- */
-int
-gen_next_ack(int force, int spacing)
-{
- int seq_to_ack, new_ts, data_acked;
-
- /*
- * We need to check if the segment that we are about to generate an
- * ack for is a segment that should be dropped ... or an ack that should
- * be dropped.
- *
- * Figure out what we are doing before freeing segments ...
- */
-
- seq_to_ack = seg_hist[first_slot].seq_num + seg_hist[first_slot].len;
- used_win = used_win - seg_hist[first_slot].len;
- data_acked = seg_hist[first_slot].len;
- new_ts = seg_hist[first_slot].ts + ack_delay;
- first_slot = (first_slot + 1) % SEG_HIST_SIZE;
-
- /*
- * If delayed ACK in force, then ACK the next segment if there is one
- */
- if (delayed_ack && (first_slot != next_slot)) {
- seq_to_ack += seg_hist[first_slot].len;
- used_win = used_win - seg_hist[first_slot].len;
- data_acked += seg_hist[first_slot].len;
- new_ts = seg_hist[first_slot].ts + ack_delay;
- first_slot = (first_slot + 1) % SEG_HIST_SIZE;
- }
-
- /*
- * We don't want time to go backward ...
- */
- if (new_ts + jitter <= ts)
- ts++;
- else
- ts = new_ts + jitter;
-
- jitter = (rand() % 10 - 5); /* Update jitter ... */
-
- makeseg(eth_2, eth_1, ip_2, ip_1, port_2, port_1, &seq_2, &seq_to_ack, "10", 0);
- /*
- * Do we want the exponential part or the linear part?
- */
- if (cwnd >= ssthresh)
- cwnd += (1460*data_acked)/cwnd; /* is this right? */
- else
- cwnd = cwnd + data_acked;
- if (verbose) fprintf(stderr, "Ack rcvd. ts: %d, data_acked: %d, cwnd: %d, window: %d\n",
- ts, data_acked, cwnd, window);
- if (cwnd > window) cwnd = window;
-}
-
-void
-makeackedrun(int len, int spacing, int ackdelay)
-{
- int next_ack_ts=0;
- if (verbose) fprintf(stderr, "makeackedrun: Len=%d, spacing=%d, ackdelay=%d\n",
- len, spacing, ackdelay);
- while(len>0){
-
- /*
- * Each time we output a segment, we should check to see if an
- * ack is due back before the next segment is due ...
- */
- int seglen, saved_seq;
- seglen=(len>1460)?1460:len;
- /*
- * Only output what is left in the cwnd.
- * We assume there is space in the congestion window here
- */
- if (seglen > (cwnd - used_win)) seglen = cwnd - used_win;
-
- len-=seglen;
- saved_seq = seq_1;
- if (verbose) fprintf(stderr, "Sending segment. ts: %d, jitter: %d\n", ts, jitter);
- if(len){
- makeseg(eth_1, eth_2, ip_1, ip_2, port_1, port_2, &seq_1, &seq_2, "10", seglen);
- } else {
- makeseg(eth_1, eth_2, ip_1, ip_2, port_1, port_2, &seq_1, &seq_2, "18", seglen);
- }
- add_seg_sent(saved_seq, seglen);
-
- /*
- * Now, if the window is closed, then we have to eject an
- * ack, otherwise we can eject more data.
- * Also, the other end will tend to ack two segments at
- * a time ... and that ack might fall between two
- * outgoing segments
- */
- jitter = (rand()%10) - 5; /* What if spacing too small */
-
- if (verbose) fprintf(stderr, "used win: %d, cwnd: %d\n", used_win, cwnd);
-
- if ((next_ack_ts = next_ack_due()) < ts + spacing + jitter) {
- int old_ts = ts;
-
- /*
- * Generate the ack and retire the segments
- * If delayed ACK in use, there should be two
- * or more outstanding segments ...
- */
- if (verbose) fprintf(stderr, "Non forced ACK ...ts + spacing + jitter:%d, jitter: %d\n", ts + spacing + jitter, jitter);
- gen_next_ack(NO_FORCE_ACK, spacing);
- /*
- * We don't want time to go backwards ...
- */
- if (old_ts + spacing + jitter <= ts)
- ts++;
- else
- ts = old_ts + spacing + jitter;
-
- } else if (used_win == cwnd) {
-
- /*
- * We need an ACK, so generate it and retire the
- * segments and advance the ts to the time of the ack
- */
-
- if (verbose) fprintf(stderr, "Forced ACK ... \n");
- gen_next_ack(FORCE_ACK, spacing);
-
- ts+=(spacing+jitter); /* Should not use spacing here */
-
- }
- else {
- ts+=(spacing+jitter);
- }
-
- if (verbose) fprintf(stderr, "Next Ack Due: %d\n", next_ack_ts);
- }
-
-}
-
-
-void
-makeackedrundroppedtail8kb(int len, int spacing, int ackdelay)
-{
- int old_seq1;
- int dropped_tail;
- int i;
- int num_dupes;
- if (verbose) fprintf(stderr, "makeackedrundroppedtail8kB: Len=%d, spacing=%d, ackdelay=%d\n",
- len, spacing, ackdelay);
- old_seq1=seq_1;
- while(len>0){
- int seglen;
- seglen=(len>1460)?1460:len;
- len-=seglen;
- if(seglen==1460){
- makeseg(eth_1, eth_2, ip_1, ip_2, port_1, port_2, &seq_1, &seq_2, "10", seglen);
- } else {
- makeseg(eth_1, eth_2, ip_1, ip_2, port_1, port_2, &seq_1, &seq_2, "18", seglen);
- }
- ts+=spacing;
- }
-
- ts+=ackdelay;
-
- i=0;
- num_dupes=-1;
- dropped_tail=0;
- while(old_seq1!=seq_1){
- int ack_len;
-
- ack_len=((seq_1-old_seq1)>2920)?2920:(seq_1-old_seq1);
-
- i++;
- if(i==6){
- dropped_tail=old_seq1;
- }
- old_seq1+=ack_len;
- if(i<6){
- makeseg(eth_2, eth_1, ip_2, ip_1, port_2, port_1, &seq_2, &old_seq1, "10", 0);
- } else if (i==6) {
- makeseg(eth_2, eth_1, ip_2, ip_1, port_2, port_1, &seq_2, &dropped_tail, "10", 0);
- num_dupes+=2;
- } else {
- makeseg(eth_2, eth_1, ip_2, ip_1, port_2, port_1, &seq_2, &dropped_tail, "10", 0);
- makeseg(eth_2, eth_1, ip_2, ip_1, port_2, port_1, &seq_2, &dropped_tail, "10", 0);
- num_dupes+=2;
- }
- ts+=spacing/2;
- }
-
- if(!dropped_tail){
- return;
- }
-
- if(num_dupes<3){
- int seglen;
- ts+=1000000;
- seglen=((seq_1-dropped_tail)>1460)?1460:(seq_1-dropped_tail);
- if(seglen==1460){
- makeseg(eth_1, eth_2, ip_1, ip_2, port_1, port_2, &dropped_tail, &seq_2, "10", seglen);
- } else {
- makeseg(eth_1, eth_2, ip_1, ip_2, port_1, port_2, &dropped_tail, &seq_2, "18", seglen);
- }
- ts+=ackdelay;
-
- makeseg(eth_2, eth_1, ip_2, ip_1, port_2, port_1, &seq_2, &seq_1, "10", 0);
- ts+=spacing;
- return;
- }
-
- while(dropped_tail!=seq_1){
- int seglen;
- int ack;
- seglen=((seq_1-dropped_tail)>1460)?1460:(seq_1-dropped_tail);
- if(seglen==1460){
- makeseg(eth_1, eth_2, ip_1, ip_2, port_1, port_2, &dropped_tail, &seq_2, "10", seglen);
- } else {
- makeseg(eth_1, eth_2, ip_1, ip_2, port_1, port_2, &dropped_tail, &seq_2, "18", seglen);
- }
- ts+=ackdelay;
-
- ack=dropped_tail;
- makeseg(eth_2, eth_1, ip_2, ip_1, port_2, port_1, &seq_2, &ack, "10", 0);
- ts+=spacing;
- }
-}
-
-void usage()
-{
- fprintf(stderr, "Usage: mkcap [OPTIONS], where\n");
- fprintf(stderr, "\t-a <ack-delay> is the delay to an ACK (SRT)\n");
- fprintf(stderr, "\t-b <bytes-to-send> is the bytes to send on connection\n");
- fprintf(stderr, "\t-i <ip-addr-hex> is the sender IP address in hex\n");
- fprintf(stderr, "\t-I <ip-addr-hex> is the recipient IP address in hex\n");
- fprintf(stderr, "\t-n <ISN> is almost the ISN for the sender\n");
- fprintf(stderr, "\t-N <ISN> is almost the ISN for the recipient\n");
- fprintf(stderr, "\t-p <port-number-hex> is the port number for sender\n");
- fprintf(stderr, "\t-P <port-number-hex> is the port number for recipient\n");
- fprintf(stderr, "\t-s <send-spacing> is the send spacing\n");
- fprintf(stderr, "\t-w <window-size> is the window size\n");
-}
-
-int
-all_digits(char *str)
-{
- int i;
- if (!str || !(*str)) {
- return 0;
- }
-
- for (i = 0; str[i]; i++) {
- if (!g_ascii_isdigit(str[i]))
- return 0;
- }
-
- return 1;
-}
-
-/*
- * Process a list of drops. These are of the form:
- *
- * first_seg,seg_count[,first_seg,seg_count]*
- */
-void
-process_drop_list(char *drop_list)
-{
- int commas=0;
- char *tok, *save;
-
- if (!drop_list || !(*drop_list)) {
- fprintf(stderr, "Strange drop list. NULL or an empty string. No drops!\n");
- return;
- }
- save = (char *)g_strdup(drop_list);
-
- for (tok=(char *)strtok(drop_list, ","); tok; tok=(char *)strtok(NULL, ",")) {
- commas++;
- }
-
- /* Now, we have commas, divide by two and round up */
-
- seg_drop_count = (commas+1)/2;
- drops = (seg_drop_t *)g_malloc(sizeof(seg_drop_t) * seg_drop_count);
- if (!drops) {
- fprintf(stderr, "Unable to allocate space for drops ... going without!\n");
- seg_drop_count = 0;
- g_free(save);
- return;
- }
-
- /* Now, go through the list again and build the drop list. Any errors and */
- /* we abort and print a usage message */
-
- commas = 0;
- for (tok=(char *)strtok(save, ","); tok; tok=(char *)strtok(NULL, ",")) {
- int num = atoi(tok);
-
- if (!all_digits(tok)) {
- fprintf(stderr, "Error in segment offset or count. Not all digits: %s\n",
- tok);
- fprintf(stderr, "No packet drops being performed!\n");
- g_free(save);
- g_free(drops);
- seg_drop_count = 0; drops = NULL;
- return;
- }
- if (num == 0) num = 1;
- if (commas % 2)
- drops[commas / 2].drop_seg_count = num;
- else
- drops[commas / 2].drop_seg_start = num;
- }
-
- g_free(save);
-
-}
-
-int
-main(int argc, char *argv[])
-{
- int i;
- int len;
- int type;
- int cnt;
- extern char *optarg;
- extern int optind;
- int opt;
-
- while ((opt = getopt(argc, argv, "a:b:d:Di:I:j:l:n:N:p:P:r:s:vw:")) != EOF) {
- switch (opt) {
- case 'a':
- ack_delay = atoi(optarg);
- break;
-
- case 'b': /* Bytes ... */
- total_bytes = atoi(optarg);
- break;
-
- case 'd': /* A list of drops to simulate */
- process_drop_list(optarg);
- break;
-
- case 'D': /* Toggle tcp_nodelay */
- tcp_nodelay = (tcp_nodelay + 1) % 1;
- break;
-
- case 'i':
- ip_1 = optarg;
- break;
-
- case 'I':
- ip_2 = optarg;
- break;
-
- case 'l':
- snap_len = atoi(optarg);
- break;
-
- case 'n': /* ISN for send dirn, ie, seq_1 */
- seq_1 = atoi(optarg);
- break;
-
- case 'N': /* ISN for recv dirn, ie, seq_2 */
- seq_2 = atoi(optarg);
- break;
-
- case 'p':
- port_1 = optarg;
- break;
-
- case 'P':
- port_2 = optarg;
- break;
-
- case 'r':
- run_type = atoi(optarg);
- break;
-
- case 's':
- send_spacing = atoi(optarg);
- break;
-
- case 'v':
- verbose++;
- break;
-
- case 'w': /* Window ... */
- window = atoi(optarg);
- ssthresh = window / 2; /* Have to recalc this ... */
- break;
-
- default:
- usage();
- break;
- }
- }
-
- if (verbose) fprintf(stderr, "IP1: %s, IP2: %s, P1: %s, P2: %s, Ack Delay: %d, Send Spacing: %d\n",
- ip_1, ip_2, port_1, port_2, ack_delay, send_spacing);
-
- /*return 0; */
-
- if (run_type == 0) {
- makeackedrun(total_bytes, send_spacing, ack_delay);
- }
- else {
- for(cnt=0;cnt<200;cnt++){
- type=rand()%150;
- if(type<75){
- int j;
- j=5+rand()%10;
- for(i=0;i<j;i++){
- makeackedrun(32768, send_spacing, ack_delay);
- }
- } else if(type<90) {
- int j;
- j=4+rand()%4;
- for(i=0;i<j;i++){
- len=100+rand()&0xfff;
- makeackedrun(len, send_spacing, ack_delay);
- }
- } else {
- for(i=0;i<5;i++){
- len=100+rand()&0x3fff+0x1fff;
- makeackedrun(len, send_spacing, ack_delay);
- /*makeackedrundroppedtail8kb(len, send_spacing, ack_delay);*/
- }
- }
- }
- }
- return 0;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */