[netfilter-cvslog] r3471 - in trunk/nfsim: core core/ipv4 kernelenv kernelenv/include tools

rusty at netfilter.org rusty at netfilter.org
Mon Dec 20 06:30:56 CET 2004


Author: rusty at netfilter.org
Date: 2004-12-20 06:30:55 +0100 (Mon, 20 Dec 2004)
New Revision: 3471

Modified:
   trunk/nfsim/core/field.c
   trunk/nfsim/core/field.h
   trunk/nfsim/core/ipv4/ipv4.c
   trunk/nfsim/kernelenv/include/kernelenv.h
   trunk/nfsim/kernelenv/kernelenv.c
   trunk/nfsim/tools/gen_err.c
   trunk/nfsim/tools/gen_ip.c
   trunk/nfsim/tools/gen_ip.h
Log:
Use "field" ops to attach dump information to skb, rather than __dump_data.


Modified: trunk/nfsim/core/field.c
===================================================================
--- trunk/nfsim/core/field.c	2004-12-20 05:29:52 UTC (rev 3470)
+++ trunk/nfsim/core/field.c	2004-12-20 05:30:55 UTC (rev 3471)
@@ -44,17 +44,31 @@
 	return 0;
 }
 
-void field_attach(const void *strct, const char *name, void *val)
+static void __field_attach(void *ctx, const void *strct, 
+			   const char *name, void *val)
 {
-	struct field *field = talloc(field_ctx, struct field);
+	struct field *field = talloc(ctx, struct field);
 
 	field->strct = strct;
 	field->name = name;
 	field->val = val;
 	list_add(&field->list, &fields);
 	talloc_set_destructor(field, field_destroy);
+	talloc_steal(field, val);
 }
 
+/* strct is talloc'ed: field destroyed when strct is. */
+void field_attach(const void *strct, const char *name, void *val)
+{
+	return __field_attach((void *)strct, strct, name, val);
+}
+
+/* strct is not talloc'ed: field destroyed manually.  */
+void field_attach_static(const void *strct, const char *name, void *val)
+{
+	return __field_attach(field_ctx, strct, name, val);
+}
+
 static struct field *__field_find(const void *strct, const char *name)
 {
 	struct field *i;
@@ -73,7 +87,11 @@
 
 void *field_value(const void *strct, const char *name)
 {
-	return __field_find(strct, name)->val;
+	struct field *f = __field_find(strct, name);
+
+	if (!f)
+		return NULL;
+	return f->val;
 }
 
 void field_detach(const void *strct, const char *name)

Modified: trunk/nfsim/core/field.h
===================================================================
--- trunk/nfsim/core/field.h	2004-12-20 05:29:52 UTC (rev 3470)
+++ trunk/nfsim/core/field.h	2004-12-20 05:30:55 UTC (rev 3471)
@@ -6,7 +6,10 @@
  */
 #include <stdbool.h>
 
+/* strct is talloc'ed: field destroyed when strct is.  val is talloc_stealed */
 void field_attach(const void *strct, const char *name, void *val);
+/* strct is not talloc'ed: field destroyed manually.  */
+void field_attach_static(const void *strct, const char *name, void *val);
 bool field_exists(const void *strct, const char *name);
 void *field_value(const void *strct, const char *name);
 void field_detach(const void *strct, const char *name);

Modified: trunk/nfsim/core/ipv4/ipv4.c
===================================================================
--- trunk/nfsim/core/ipv4/ipv4.c	2004-12-20 05:29:52 UTC (rev 3470)
+++ trunk/nfsim/core/ipv4/ipv4.c	2004-12-20 05:30:55 UTC (rev 3471)
@@ -22,6 +22,7 @@
 #include "ipv4.h"
 #include "utils.h"
 #include <core.h>
+#include <field.h>
 
 #include <linux/netfilter_ipv4.h>
 
@@ -684,7 +685,7 @@
 	return ptr;
 }
 
-static char *describe(char *ptr, int len, struct iphdr *iph, int dump_flags)
+static char *describe(char *ptr, int len, struct iphdr *iph, char *dump_flags)
 {
 	/* the length of the packet reported by the ipv4 header */
 	int iplen;
@@ -715,9 +716,9 @@
 		ptr += sprintf(ptr, "MF ");
 	if (ntohs(iph->frag_off) & IP_CE)
 		ptr += sprintf(ptr, "CE ");
-	if (dump_flags & __NFSIM_DUMP_TTL)
+	if (dump_flags && strstr(dump_flags, "ttl"))
 		ptr += sprintf(ptr, "TTL=%i ", iph->ttl);
-	if (dump_flags & __NFSIM_DUMP_TOS)
+	if (dump_flags && strstr(dump_flags, "tos"))
 		ptr += sprintf(ptr, "TOS=%i ", iph->tos);
 
 	ptr += sprintf(ptr, "%u.%u.%u.%u %u.%u.%u.%u ",
@@ -867,7 +868,7 @@
 			goto out;
 		}
 
-		if (dump_flags & __NFSIM_DUMP_DATA)
+		if (dump_flags && strstr(dump_flags, "data"))
 			ptr = print_data(ptr, (char *)tcph + tcph->doff*4,
 					 iplen - tcph->doff*4);
 		break;
@@ -888,6 +889,7 @@
 {
 	static char ipv4_pbuf[1024];
 
-	describe(ipv4_pbuf, skb->len, skb->nh.iph, skb->__dump_flags);
+	describe(ipv4_pbuf, skb->len, skb->nh.iph,
+		 field_value(skb, "dump_flags"));
 	return ipv4_pbuf;
 }

Modified: trunk/nfsim/kernelenv/include/kernelenv.h
===================================================================
--- trunk/nfsim/kernelenv/include/kernelenv.h	2004-12-20 05:29:52 UTC (rev 3470)
+++ trunk/nfsim/kernelenv/include/kernelenv.h	2004-12-20 05:30:55 UTC (rev 3471)
@@ -422,10 +422,6 @@
 				*data,
 				*tail,
 				*end;
-
-
-	/* What fields to we print for this packet? */
-	int			__dump_flags;
 };
 
 struct skb_shared_info {

Modified: trunk/nfsim/kernelenv/kernelenv.c
===================================================================
--- trunk/nfsim/kernelenv/kernelenv.c	2004-12-20 05:29:52 UTC (rev 3470)
+++ trunk/nfsim/kernelenv/kernelenv.c	2004-12-20 05:30:55 UTC (rev 3471)
@@ -22,6 +22,7 @@
 #include <kernelenv.h>
 #include "utils.h"
 #include "tui.h"
+#include "field.h"
 
 /* Root of talloc trees for different allocators */
 void *__skb_ctx, *__vmalloc_ctx, *__kmalloc_ctx, *__kmalloc_atomic_ctx, *__kmem_cache_ctx;
@@ -182,7 +183,10 @@
 	new->h.raw  = old->h.raw  + offset;
 	new->nh.raw = old->nh.raw + offset;
 
-	__copy(__dump_flags);
+	if (field_exists(old, "dump_flags"))
+		field_attach(new, "dump_flags",
+			     talloc_strdup(NULL,
+					   field_value(old, "dump_flags")));
 }
 
 #undef __copy

Modified: trunk/nfsim/tools/gen_err.c
===================================================================
--- trunk/nfsim/tools/gen_err.c	2004-12-20 05:29:52 UTC (rev 3470)
+++ trunk/nfsim/tools/gen_err.c	2004-12-20 05:30:55 UTC (rev 3471)
@@ -116,7 +116,7 @@
 	struct packet orig, packet;
 	int len = 28;
 	char *interface = NULL;
-	int dump_flags = 0;
+	char *dump_flags = NULL;
 
 	if (argc > 1 && strncmp(argv[1], "IF=", 3) == 0) {
 		interface = argv[1] + 3;

Modified: trunk/nfsim/tools/gen_ip.c
===================================================================
--- trunk/nfsim/tools/gen_ip.c	2004-12-20 05:29:52 UTC (rev 3470)
+++ trunk/nfsim/tools/gen_ip.c	2004-12-20 05:30:55 UTC (rev 3471)
@@ -30,6 +30,7 @@
 #include <tui.h>
 #include <log.h>
 #include <utils.h>
+#include <field.h>
 #include "gen_ip.h"
 
 struct protoent *getprotobyname(const char *name);
@@ -277,7 +278,7 @@
 
 /* SRCPT DSTPT [DATA] */
 static int
-parse_udp(struct packet *packet, int datalen, char *args[], int *dump_flags)
+parse_udp(struct packet *packet, int datalen, char *args[], char **dump_flags)
 {
 	int spt, dpt;
 	u_int16_t udplen = sizeof(packet->u.udph) + datalen;
@@ -301,7 +302,7 @@
 		/* Remaining args are  DATA for packet. */
 		char *data, **arg;
 
-		*dump_flags |= __NFSIM_DUMP_DATA;
+		*dump_flags = talloc_asprintf_append(*dump_flags, "data");
 		data = (void *)&packet->u.udph + sizeof(packet->u.udph);
 		for (arg = args+4; *arg; arg++) {
 			data = copy_printable(data, *arg);
@@ -409,7 +410,7 @@
 
 /* SRCPT DSTPT FLAGS [SEQ=] [ACK=] [WIN=] [OPT=] [DATA] */
 static int
-parse_tcp(struct packet *packet, int datalen, char *args[], int *dump_flags)
+parse_tcp(struct packet *packet, int datalen, char *args[], char **dump_flags)
 {
 	int spt, dpt, window = 0;
 	u_int16_t tcplen;
@@ -471,7 +472,7 @@
 		/* Remaining args are  DATA for packet. */
 		char *data, **arg;
 
-		*dump_flags |= __NFSIM_DUMP_DATA;
+		*dump_flags = talloc_asprintf_append(*dump_flags, "data");
 		data = (void *)&packet->u.tcph + packet->u.tcph.doff * 4;
 		for (arg = args+4; *arg; arg++) {
 			data = copy_printable(data, *arg);
@@ -529,7 +530,7 @@
 }
 
 bool send_packet(const struct packet *packet, const char *interface,
-		 int dump_flags)
+		 char *dump_flags)
 {
 	struct sk_buff *skb;
 	int len;
@@ -549,7 +550,8 @@
 
 	skb->protocol = skb->mac.ethernet->h_proto;
 
-	skb->__dump_flags = dump_flags;
+	if (dump_flags)
+		field_attach(skb, "dump_flags", dump_flags);
 
 	if (interface) {
 		struct net_device *dev;
@@ -652,7 +654,7 @@
 
 /* SRCIP DSTIP DATALEN PROTOCOL ... */
 bool parse_packet(struct packet *packet, int argc, char *argv[],
-		  int *dump_flags)
+		  char **dump_flags)
 {
 	int tos = 0, mf = 0, df = 0, ce = 0, ttl = 255, len, datalen;
 	u_int16_t fragoff = 0, fraglen = 0;
@@ -723,7 +725,7 @@
 				argv[1]+4);
 			return false;
 		}
-		*dump_flags |= __NFSIM_DUMP_TOS;
+		*dump_flags = talloc_asprintf_append(*dump_flags, "tos");
 		argc--;
 		argv++;
 	}
@@ -736,7 +738,7 @@
 				argv[1]+4);
 			return false;
 		}
-		*dump_flags |= __NFSIM_DUMP_TTL;
+		*dump_flags = talloc_asprintf_append(*dump_flags, "ttl");
 		argc--;
 		argv++;
 	}
@@ -792,7 +794,7 @@
 static bool gen_ip(int argc, char *argv[])
 {
 	struct packet packet;
-	int dump_flags = 0;
+	char *dump_flags = NULL;
 	char *interface = NULL;
 
 	if (argc > 5 && strncmp(argv[1], "IF=", 3) == 0) {

Modified: trunk/nfsim/tools/gen_ip.h
===================================================================
--- trunk/nfsim/tools/gen_ip.h	2004-12-20 05:29:52 UTC (rev 3470)
+++ trunk/nfsim/tools/gen_ip.h	2004-12-20 05:30:55 UTC (rev 3471)
@@ -18,11 +18,11 @@
 
 /* Fill in packet, given arguments. */
 bool parse_packet(struct packet *packet, int argc, char *argv[],
-		  int *dump_flags);
+		  char **dump_flags);
 
 /* Send filled in packet. */
 bool send_packet(const struct packet *packet, const char *interface,
-		 int dump_flags);
+		 char *dump_flags);
 
 /* Convert string to number in this range: -1 for fail. */
 int string_to_number(const char *s, int min, int max);




More information about the netfilter-cvslog mailing list