[netfilter-cvslog] r3417 - trunk/nfsim/tools

rusty at netfilter.org rusty at netfilter.org
Thu Dec 16 14:15:11 CET 2004


Author: rusty at netfilter.org
Date: 2004-12-16 14:15:11 +0100 (Thu, 16 Dec 2004)
New Revision: 3417

Modified:
   trunk/nfsim/tools/gen_ip.c
Log:
Catch case where FRAG= doesn't have comma.
Add DATA support for UDP (will be needed for SNMP for example)
Add \xNN support to DATA escapes (for SNMP, IRC).


Modified: trunk/nfsim/tools/gen_ip.c
===================================================================
--- trunk/nfsim/tools/gen_ip.c	2004-12-16 13:12:44 UTC (rev 3416)
+++ trunk/nfsim/tools/gen_ip.c	2004-12-16 13:15:11 UTC (rev 3417)
@@ -132,6 +132,43 @@
 	return &addr;
 }
 
+static bool hexchar(char *dst, const char *str)
+{
+	int c;
+
+	if (sscanf(str, "%02x", &c) != 1)
+		return false;
+	*dst = c;
+	return true;
+}
+
+/* Collapse simple control characters. */
+static char *
+copy_printable(char *dst, const char *str)
+{
+	unsigned int i;
+
+	for (i = 0; str[i]; i++, dst++) {
+		if (str[i] == '\\') {
+			i++;
+			switch (str[i]) {
+			case 'n': *dst = '\n'; break;
+			case 'r': *dst = '\r'; break;
+			case 't': *dst = '\t'; break;
+			case '0': *dst = '\0'; break;
+			case '\\': *dst = '\\'; break;
+			case 'x': 
+				if (!hexchar(dst, str+i+1)) return NULL;
+				i += 2;
+				break;
+			default: return NULL;
+			}
+		} else
+			*dst = str[i];
+	}
+	return dst;
+}
+
 static int parse_header(struct packet *packet,
 			const char *srcip, const char *dstip,
 			const char *lenstr, const char *protocol,
@@ -229,9 +266,9 @@
 	return sizeof(packet->u.icmph) + datalen;
 }
 
-/* SRCPT DSTPT */
+/* SRCPT DSTPT [DATA] */
 static int
-parse_udp(struct packet *packet, int datalen, char *args[])
+parse_udp(struct packet *packet, int datalen, char *args[], int *dump_flags)
 {
 	int spt, dpt;
 	u_int16_t udplen = sizeof(packet->u.udph) + datalen;
@@ -251,7 +288,24 @@
 		return -1;
 	}
 
-	if (args[2]) {
+	if (args[2] && streq(args[2], "DATA")) {
+		/* Remaining args are  DATA for packet. */
+		char *data, **arg;
+
+		*dump_flags |= __NFSIM_DUMP_DATA;
+		data = (void *)&packet->u.udph + sizeof(packet->u.udph);
+		for (arg = args+4; *arg; arg++) {
+			data = copy_printable(data, *arg);
+			if (!data)
+				return -1;
+			if (arg[1]) {
+				*data = ' ';
+				data++;
+			}
+		}
+		*data = '\0';
+		args++;
+	} else if (args[2]) {
 		nfsim_log(LOG_UI, "Extra argument: `%s'", args[3]);
 		return -1;
 	}
@@ -335,29 +389,6 @@
 	return 0;
 }
 
-/* Collapse simple control characters. */
-static char *
-copy_printable(char *dst, const char *str)
-{
-	unsigned int i;
-
-	for (i = 0; str[i]; i++, dst++) {
-		if (str[i] == '\\') {
-			i++;
-			switch (str[i]) {
-			case 'n': *dst = '\n'; break;
-			case 'r': *dst = '\r'; break;
-			case 't': *dst = '\t'; break;
-			case '0': *dst = '\0'; break;
-			case '\\': *dst = '\\'; break;
-			default: return NULL;
-			}
-		} else
-			*dst = str[i];
-	}
-	return dst;
-}
-
 /* SRCPT DSTPT FLAGS [SEQ=] [ACK=] [WIN=] [OPT=] [DATA] */
 static int
 parse_tcp(struct packet *packet, int datalen, char *args[], int *dump_flags)
@@ -619,6 +650,11 @@
 			return false;
 		}
 
+		if (!comma) {
+			nfsim_log(LOG_UI, "Need FRAG=<offset>,<length>");
+			return false;
+		}
+
 		fraglen = atoi(comma+1);
 		if (fraglen < 1) {
 			nfsim_log(LOG_UI, "`%s' bad fraglen",
@@ -690,7 +726,7 @@
 		len = parse_tcp(packet, datalen, argv + 5, dump_flags);
 		break;
 	case IPPROTO_UDP:
-		len = parse_udp(packet, datalen, argv + 5);
+		len = parse_udp(packet, datalen, argv + 5, dump_flags);
 		break;
 	default:
 		if (argc != 5) {




More information about the netfilter-cvslog mailing list