Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Oct 1999 18:51:10 +0200 (CEST)
From:      oddbjorn@tricknology.org
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   ports/14521: Update to net/bpft
Message-ID:  <199910251651.SAA22833@oddbjorn.bdc.no>

next in thread | raw e-mail | index | archive | help

>Number:         14521
>Category:       ports
>Synopsis:       New patch from Vladimir B. Grebenschikov
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Oct 25 09:50:00 PDT 1999
>Closed-Date:
>Last-Modified:
>Originator:     Oddbjorn Steffensen
>Release:        FreeBSD 3.3-STABLE i386
>Organization:
Funkjazztical Tricknology
>Environment:

>Description:

Patch from Vladimir B. Grebenschikov <vova@express.ru> adding the following
functionality to trafd: 

-D run in foregroud
-I don't distinguish ports/protocols (count only by IP)
-S count only IP from this range(s) (all other IP accounted AS 255.255.255.255)
-A aggregate IP-addresses in given network(s)


>How-To-Repeat:

>Fix:
	
--- /dev/null	Mon Oct 25 18:50:01 1999
+++ patches/patch-ag	Mon Oct 25 18:45:23 1999
@@ -0,0 +1,228 @@
+--- trafd.orig/main.c	Sun Jun  6 08:54:09 1999
++++ trafd/main.c	Sun Jun  6 08:53:33 1999
+@@ -53,6 +53,17 @@
+ int pflag;	/* don't put the interface into promiscuous mode */
+ int rflag;	/* attempt to resume data from safe file if exist */
+ 
++int Iflag = 0;  /* don't destinguish packets by port/protocol -> only by IP */
++int Dflag = 1;  /* do daemonize */
++
++#define MAX_ACC_ADDRESSES	256
++
++struct AccRecord AccAddr[MAX_ACC_ADDRESSES];
++int    		 AccRecNum = 0;
++
++struct AccRecord AggAddr[MAX_ACC_ADDRESSES];
++int    		 AggRecNum = 0;
++
+ /* Global interrupts flags */
+ int flag_hup;	/* SIGHUP - drop collected data to tempfile */
+ int flag_int;	/* SIGINT - append collected data to savefile */
+@@ -80,7 +91,52 @@
+ 
+ static int if_fd = -1;
+ 
+-void
++int getnet(char *s, struct AccRecord *ar)
++{
++  int rc;
++  char *r;
++  r = strchr(s, '/');
++  if (r) *r++ = '\0';
++  rc = inet_aton(s, (struct in_addr *)&ar->network);
++  if (rc != 1 || !r || !atoi(r)) {
++	fprintf(stderr, "Incorrect parametr '%s' must be in XXX.XXX.XXX.XXX/MASKLEN form\n", s);
++	exit(1);
++  }
++  ar->netmask = htonl(~(0xFFFFFFFF >> atoi(r)));
++  ar->network &= ar->netmask;
++  return(0);
++}
++
++void AccAdd(char *s, struct AccRecord *ar, int *ap) {
++  if (isdigit(*s)) { /* network */
++    if (*ap + 1 >= MAX_ACC_ADDRESSES) {
++      fprintf( stderr, "too many '-S/-A' flags, only %d allowed for each\n", MAX_ACC_ADDRESSES );
++      exit(1);
++    } 
++    getnet(optarg, &ar[(*ap)++]);
++  } else { /* file */
++    char buf[256];
++    FILE *f = fopen(s, "r");
++    if (!f) {
++    	perror("can't open file");
++    	exit(1);
++    }
++    while(fgets(buf, sizeof(buf)-1, f)) {
++	char *ent;
++	if (*ap + 1 >= MAX_ACC_ADDRESSES) {
++          fprintf(  stderr, "too many entries in %s, only %d allowed for each\n", s, MAX_ACC_ADDRESSES );
++          exit(1);
++	}    
++        ent = buf;
++	while(*ent && isspace(*ent)) ent++;
++	if (!*ent || *ent == '#') continue;
++    	getnet(buf, &ar[(*ap)++]);
++    }
++    fclose(f);
++  }
++}
++
++int
+ main(argc, argv)
+ 	int argc;
+ 	char **argv;
+@@ -100,7 +156,7 @@
+ 	program_name = stripdir(argv[0]);
+ 
+ 	opterr = 0;
+-	while ((op = getopt(argc, argv, "c:df:F:i:Opr")) != EOF)
++	while ((op = getopt(argc, argv, "c:df:F:i:OprIS:A:D")) != EOF)
+ 		switch (op) {
+ 		case 'c':
+ 			cnt = atoi(optarg);
+@@ -126,6 +182,18 @@
+ 		case 'r':
+ 			++rflag;
+ 			break;
++		case 'I':
++			Iflag = 1;
++			break;
++		case 'D':
++			Dflag = 0;
++			break; 
++		case 'S':
++			AccAdd(optarg, AccAddr, &AccRecNum);
++			break;
++		case 'A':
++			AccAdd(optarg, AggAddr, &AggRecNum);
++			break;
+ 		default:
+ 			usage();
+ 		}
+@@ -185,7 +253,9 @@
+ 		      device_name);
+ 
+ 	/* Jump to background */
+-	daemon(1, 0);
++	if (Dflag)
++		daemon(1, 0);
++		
+ 	if ((fd = fopen(file_pid, "w")) == NULL)
+ 		exit(1);
+ 
+@@ -207,6 +277,7 @@
+ 	(void)syslog(LOG_ERR, "(%s) traffic collector aborted: %m",
+ 		     device_name);
+ 	exit(1);
++	return(1);
+ }
+ 
+ /* make a clean exit on interrupts */
+@@ -284,6 +355,22 @@
+ 	fprintf(stderr, "trafd v%s - tcp/udp data traffic collector daemon\n",
+ 		version);
+ 	fprintf(stderr,
+-"Usage: %s [-dOpr] [-c count] [-i iface] [-f ext] [-F file | expr]\n", program_name);
++		"Usage: %s [<flags>] [-F file | expr]\n"
++		"flags:\n"
++		"\t-d\t\tdump packet-matching code\n"
++		"\t-O\t\tdon't run the packet-matching code optimizer\n"
++		"\t-p\t\tdon't put the interface into promiscuous mode\n"
++		"\t-r\t\tattempt to resume data from safe file if exist\n"
++		"\t-I\t\tdon't destinguish ports and protocols\n"
++		"\t-D\t\trun in foreground\n"
++		"\t-c <N>\t\taccount only <N> packets\n"
++		"\t-i <iface>\tlisten interface <iface>\n"
++		"\t-S <net/mlen>\tdo accounting only for this address range\n"
++		"\t-S <filename>\t--\"\"--, read address ranges from file\n"
++		"\t-A <net/mlen>\taggregate addreses from this range to one\n"
++		"\t-A <filename>\t--\"\"--, read address range from file\n"
++		"\t-f <ext>\tuse <ext> as interface name for data files\n"
++		"\n", 
++		program_name);
+ 	exit(-1);
+ }
+diff -u -N -r trafd.orig/trafd.h trafd/trafd.h
+--- trafd.orig/trafd.h	Sun Jun  6 08:54:09 1999
++++ trafd/trafd.h	Sun Jun  6 08:16:50 1999
+@@ -32,3 +32,15 @@
+ extern void traf_save();
+ extern void traf_pipe();
+ extern void traf_clear();
++
++struct AccRecord {
++  unsigned int network;
++  unsigned int netmask;
++};
++ 
++extern struct AccRecord AccAddr[];
++extern int    		AccRecNum;
++
++extern struct AccRecord AggAddr[];
++extern int    		AggRecNum;
++    
+\ No newline at end of file
+diff -u -N -r trafd.orig/traffic.c trafd/traffic.c
+--- trafd.orig/traffic.c	Sun Jun  6 08:54:09 1999
++++ trafd/traffic.c	Sun Jun  6 08:53:33 1999
+@@ -138,6 +138,9 @@
+ 	return -2;
+ }
+ 
++
++extern int Iflag;
++extern struct bpf_program *Scode;
+ /*
+  * Insert entry.
+  */
+@@ -146,8 +149,48 @@
+ 	register p_entry e;
+ /* return -1 if success digit if already in table or -2 if table full */ 
+ {
+-	register int ec = findentry(e);
++	register int ec;
+ 	register unsigned inx;
++	
++	if (Iflag) { /* don't match/store protocol&ports */
++		e->ip_protocol = 0;
++		e->who_srv = 0;
++		e->p_port  = 0;
++	}
++		
++	if (AccRecNum) {
++		int i;
++		int src = 0, dst = 0;
++		for(i = 0; i < AccRecNum; i++) {
++			if ((e->in_ip.s_addr & AccAddr[i].netmask) == 
++			    AccAddr[i].network) src = 1;
++			if ((e->out_ip.s_addr & AccAddr[i].netmask) == 
++			    AccAddr[i].network) dst = 1;
++		}
++		if (!src) e->in_ip.s_addr  = 0xFFFFFFFF;
++		if (!dst) e->out_ip.s_addr = 0xFFFFFFFF;
++	}
++
++	if (AggRecNum) {
++		int i;
++		int src = 0, dst = 0;
++		for(i = 0; i < AggRecNum; i++) {
++			if (!src &&
++			    (e->in_ip.s_addr & AggAddr[i].netmask) == 
++			    AggAddr[i].network) {
++			    	src = 1;
++			    	e->in_ip.s_addr = (e->in_ip.s_addr & AggAddr[i].netmask);
++			}
++			if (!dst && 
++			    (e->out_ip.s_addr & AggAddr[i].netmask) == 
++			    AggAddr[i].network) {
++			    	dst = 1;
++			    	e->out_ip.s_addr = (e->out_ip.s_addr & AggAddr[i].netmask);
++			}
++		}
++	}
++
++	ec = findentry(e);
+ 	if (ec != -1)
+ 		return ec;
+ 	inx = hash(e);

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-ports" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199910251651.SAA22833>