Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 Aug 2007 11:10:22 GMT
From:      Matus Harvan <mharvan@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 125706 for review
Message-ID:  <200708261110.l7QBAMYm042092@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=125706

Change 125706 by mharvan@mharvan_bike-planet on 2007/08/26 11:10:14

	DNS plugin bugfixing

Affected files ...

.. //depot/projects/soc2007/mharvan-mtund/mtund.src/mtund.c#14 edit
.. //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_dns/dns.c#2 edit
.. //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_dns/plugin_dns.c#5 edit

Differences ...

==== //depot/projects/soc2007/mharvan-mtund/mtund.src/mtund.c#14 (text+ko) ====

@@ -826,7 +826,7 @@
 	case DISPATCH_ECHO_REQUEST:
 		debug("process_data_from_plugin(): ECHO_REQUEST\n");
 		debug("got echo request (plugin: %s)\n", pl->name);
-
+		debug("seq: %u\n", *(data+1));
 		/* pings are qualify for temporary connection status only */
 		*conn_flag = CONN_TEMP;
 		pl->conn_map(pl, *clid, CONN_TEMP);
@@ -858,7 +858,7 @@
 		if (server) {
 			if (*clid != 0)
 				set_client_pl(cl, pl);
-		} else
+		} else /* client */
 			free(data);
 
 		break;
@@ -904,7 +904,7 @@
 			return;
 		}
 		
-		/* TODO reqid = *(data+1); */
+		//TODO reqid = *((long*)(data+1));
 
 		/* assign a new client ID */
 		for (i = 1; i < MAXCLIENTS && clients[i].used != 0; i++);
@@ -941,7 +941,7 @@
 		}
 		
 		if (myclid != 0) {  /* ID already assigned */
-			pl->conn_map(pl, *clid, CONN_DISCARD);
+			//pl->conn_map(pl, *clid, CONN_DISCARD);
 			return;
 		}
 
@@ -1329,8 +1329,8 @@
 /* 		pl = load_plugin("./plugin_udp_catchall.so"); */
 /* 		pl->name = "udp_catchall"; */
 /* 	} else { /\* client *\/ */
-		pl = load_plugin("./plugin_udp.so");
-		pl->name = "udp_1234";
+/* 		pl = load_plugin("./plugin_udp.so"); */
+/* 		pl->name = "udp_1234"; */
 /* 		pl = load_plugin("./plugin_udp.so"); */
 /* 		pl->name = "udp_1235"; */
 /* /\* 		pl = load_plugin("./plugin_udp.so"); *\/ */
@@ -1340,8 +1340,8 @@
 /* 	pl->name = "tcp_1234"; */
 /* 	pl = load_plugin("./plugin_icmp.so"); */
 /* 	pl->name = "icmp"; */
-/* 	pl = load_plugin("./plugin_dns/plugin_dns.so"); */
-/* 	pl->name = "dns_53"; */
+	pl = load_plugin("./plugin_dns/plugin_dns.so");
+	pl->name = "dns_53";
 
 	if (server) {
 		/* initialize all plugins */

==== //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_dns/dns.c#2 (text+ko) ====

@@ -105,7 +105,7 @@
 	HEADER *header;
 	short qdcount;
 	short ancount;
-	char name[255];
+	char name[256];
 	uint32_t ttl;
 	short class;
 	short type;
@@ -167,8 +167,8 @@
 			return -1;
 		}
 
-		readname(packet, packetlen, &data, name, sizeof(name) -1);
-		name[256] = 0;
+		readname(packet, packetlen, &data, name, sizeof(name) - 2);
+		name[sizeof(name) - 1] = 0;
 		readshort(packet, &data, &type);
 		readshort(packet, &data, &class);
 
@@ -177,7 +177,7 @@
 			break;
 		}
 
-		strncpy(q->name, name, 257);
+		strncpy(q->name, name, sizeof(name));
 		q->type = type;
 		q->id = id;
 

==== //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_dns/plugin_dns.c#5 (text+ko) ====

@@ -65,7 +65,9 @@
  * how often should an empty request be sent to the server - This is
  * useful when the server has data to send but the client doesn't.
  */
-#define PLUGIN_DNS_KEEP_ALIVE 1
+#define PLUGIN_DNS_KEEP_ALIVE_SEC 0
+#define PLUGIN_DNS_KEEP_ALIVE_USEC 500000
+
 #define TOPDOMAIN "matustest.eecs.jacobs-university.de"
 
 struct conn {
@@ -111,7 +113,6 @@
     int n, fd = 0;
 
     memset(&hints, 0, sizeof(hints));
-    //hints.ai_family = AF_UNSPEC;
     hints.ai_family = AF_INET;
     hints.ai_socktype = SOCK_DGRAM;
 
@@ -159,7 +160,6 @@
 
     memset(&hints, 0, sizeof(hints));
     hints.ai_flags = AI_PASSIVE;
-    //hints.ai_family = AF_UNSPEC;
     hints.ai_family = AF_INET;
     hints.ai_socktype = SOCK_DGRAM;
 
@@ -192,24 +192,14 @@
     return fd;
 }
 
-static void
-dump_data(char *data, int len)
-{
-	int i;
-	printf("(%d bytes) ", len);
-	for(i = 0; i < len; i++)
-		printf("%02hhx ", *(data+i));
-	printf("\n");
-}
-
 /* register a timer event */
 static void
 register_timer_ev(struct event *ev)
 {
     struct timeval tv;
     
-    tv.tv_sec=PLUGIN_DNS_KEEP_ALIVE;
-    tv.tv_usec=0;
+    tv.tv_sec=PLUGIN_DNS_KEEP_ALIVE_SEC;
+    tv.tv_usec=PLUGIN_DNS_KEEP_ALIVE_USEC;
     evtimer_del(ev);
     evtimer_add(ev, &tv);
 }
@@ -226,7 +216,7 @@
 	char tmpdata[4];
 	
 	
-	/* DNS encoding/decoding seems broken for shorter payloads */
+	/* DNS encoding/decoding seems to be broken for too short payloads */
 	if (datalen < 3) {
 		memset(tmpdata, 0, sizeof(tmpdata));
 		memcpy(tmpdata, data, datalen);
@@ -234,8 +224,6 @@
 		datalen=sizeof(tmpdata);
 	}
 
-/* 	printf("dns_send(): datalen: %d\n", datalen); */
-/* 	dump_data(data, datalen); */
 	if (server) {
 		len = dns_encode(buf, sizeof(buf), &pldata->q, QR_ANSWER,
 				 data, datalen);
@@ -264,6 +252,7 @@
 conn_init(struct conn *conn)
 {
 	conn->used = 0;
+	conn->clid = 0;
 
 	conn->queued_normal_data = NULL;
 	conn->queued_normal_data_len = 0;
@@ -290,8 +279,8 @@
     if (server) 
 	    //pl->mtu = 1024;
 	    pl->mtu = 512;
-    else
-	    pl->mtu = 0;
+    else /* client */
+	    pl->mtu = 0; /* always prepend the fragment header */
     pl->initialize = plugin_initialize;
     pl->deinitialize = plugin_deinitialize;
     pl->is_ready_to_send = plugin_is_ready_to_send;
@@ -338,10 +327,12 @@
 plugin_initialize(struct plugin *pl, char *host, char *port)
 {
 	struct plugin_dns_data *data = (struct plugin_dns_data*) pl->data;
-	int fd_flags;
+	int i;
 
-	conn_init(data->conns);
+	for (i = 0; i < MAXCLIENTS; i++)
+		conn_init(&data->conns[i]);
 	data->conn = data->conns;
+	memset(&data->q, 0, sizeof(data->q));
 	if (server) {
 		data->fd = udp_open(port);
 	} else {
@@ -351,13 +342,6 @@
 	if (data->fd == -1) 
 		return -1;
 
-	/* non-blocking i/o */
-	fd_flags = fcntl(data->fd, F_GETFL, 0);
-	if (fd_flags == -1)
-		errx(EX_OSFILE,
-		    "Failed to get flags from the dns socket fd\n");
-	fcntl(data->fd, F_SETFL, fd_flags|O_NONBLOCK);
-
 	event_set(&data->ev, data->fd, EV_PERSIST | EV_READ,
 		  plugin_receive, pl);
 	event_add(&data->ev, NULL);
@@ -366,8 +350,6 @@
 		data->state = PLUGIN_STATE_INITIALIZED;
 	} else { /* client */
 		data->state = PLUGIN_STATE_CONNECTED;
-		event_set(&data->ev, data->fd, EV_PERSIST | EV_READ,
-			  plugin_receive, pl);
 		
 		/* the client should send keep-alive request to the server */
 		evtimer_set(&data->timer_ev, plugin_dns_timer_ev_handler, pl);
@@ -392,31 +374,6 @@
 	data->state = PLUGIN_STATE_UNINITIALIZED;
 }
 
-/* static int */
-/* send_dns_pkt(struct plugin *pl, struct conn *conn, char *data, int len) */
-/* { */
-/* 	struct plugin_dns_data *pldata = pl->data; */
-/* 	int n = 0; */
-	
-/* 	printf("send_dns_pkt(): len: %d\n", len); */
-	
-/* 	//[...] */
-
-/* 	if (server) */
-/* 		n = sendto(pldata->fd, data, len, 0, */
-/* 			(struct sockaddr*)&pldata->addr, pldata->addrlen); */
-/* 	else  */
-/* 		n = send(pldata->fd, data, len, 0); */
-/* 	fprintf(stderr, "plugin_send: send returned %d\n", n); */
-	
-/* 	/\* the client has to reset the timer for keep-alive requests *\/ */
-/* 	if (!server) { /\* client *\/ */
-/* 		register_timer_ev(&pldata->timer_ev); */
-/* 	} */
-	
-/* 	return n; */
-/* } */
-
 void
 plugin_receive(int fd, short ev_type, void *arg)
 {
@@ -433,8 +390,6 @@
 	int r;
 	char *domain;
 	
-	printf("plugin_receive(ev_type: 0x%x)\n", ev_type);
-	
 	memset(&data->q, 0, sizeof(data->q));
 
 	/* read data from the socket */
@@ -442,8 +397,6 @@
 	r = recvfrom(data->fd, packet, sizeof(packet), 0,
 		     (struct sockaddr *) &from, &fromlen);
 	if (r == -1) {
-		if (errno == EAGAIN && !server)
-			goto send_request;
 		warn("plugin_dns: plugin_receive: recvfrom() returned %d", r);
 		plugin_report(pl, 0, REPORT_ERROR_RECEIVE);
 		return;
@@ -457,7 +410,6 @@
 		dns_decode(buf, buflen, &data->q, QR_QUERY, packet, r);
 		domain = strstr(data->q.name, data->topdomain);
 		n = decode_data(buf, buflen, data->q.name, domain);
-		printf("domain: %s, decoded: %s\n", domain, buf);
 
 		if (n <= 0)
 			return;
@@ -468,7 +420,7 @@
 		    (struct sockaddr*)&from, fromlen);
 
 		/* use connection 0 as a temporary connection */
-		data->conn = data->conns;
+		data->conn = &data->conns[0];
 		plugin_conn_close(pl, data->conn->clid);
 		conn_init(data->conn);
 		
@@ -493,7 +445,7 @@
 		buflen = dns_decode(buf, sizeof(buf), &data->q, QR_ANSWER,
 			     packet, r);
 		process_data_from_plugin(pl, buf, buflen, &clid, &conn_flag);
-	send_request:
+
 		/* 
 		 * The client should send back an empty request if there was no
 		 * data to send. This allows the server to send more data back.
@@ -533,14 +485,14 @@
 	/* send the queued data */
 	if (conn->queued_urgent_data != NULL ||
 	    conn->queued_normal_data != NULL) {
-		if (conn->queued_urgent_data != NULL) {
+		if (conn->queued_urgent_data != NULL) { /* urgent data */
 			dns_send(pl->data, conn,
 			    conn->queued_urgent_data,
 			    conn->queued_urgent_data_len);
 			free(conn->queued_urgent_data);
 			conn->queued_urgent_data = NULL;
 			conn->queued_urgent_data_len = 0;
-		} else {
+		} else { /* normal data */
 			dns_send(pl->data, conn,
 			    conn->queued_normal_data,
 			    conn->queued_normal_data_len);
@@ -622,50 +574,48 @@
 
 	conn = conn_by_clid(pldata, clid);
 
-	printf("plugin_dns: plugin_send(): clid: %hhu, data_type: %d\n",
-	       clid, data_type);
-	printf("plugin_send(): urgent_data: %d, normal_data: %d\n",
-	       conn->queued_urgent_data_len, conn->queued_normal_data_len);
-	
 	if (server) { /* server  - queue the data */
+		/* locate the queue corresponding to the data type */
 		switch (data_type) {
 		case NORMAL_DATA:
 			queued_data = &conn->queued_normal_data;
 			queued_data_len = &conn->queued_normal_data_len;
-			goto process_queued_data;
+			break;
 			
 		case URGENT_DATA:
 			queued_data = &conn->queued_urgent_data;
 			queued_data_len = &conn->queued_urgent_data_len;
-
-		process_queued_data:
-			if (*queued_data == NULL) {
-				*queued_data = malloc(len);
-				if (*queued_data == NULL) {
-					return SEND_ERROR_MALLOC;
-				}
-				memcpy(*queued_data, data, len);
-				*queued_data_len = len;
-				*consumed = len;
-				return SEND_PKT_QUEUED;
-			} else {
-				*consumed = 0;
-				return SEND_ERROR_QUEUE_FULL;
-			}
+			break;
 			
 		default:
 			errx(EX_SOFTWARE, "plugin_dns: plugin_send(): "
 			     "invalid data_type 0x%x\n", data_type);
+			return (SEND_ERROR);
 		}
+		
+		/* queue the data */
+		if (*queued_data == NULL) {
+			*queued_data = malloc(len);
+			if (*queued_data == NULL) {
+				return (SEND_ERROR_MALLOC);
+			}
+			memcpy(*queued_data, data, len);
+			*queued_data_len = len;
+			*consumed = len;
+			return (SEND_PKT_QUEUED);
+		} else {
+			*consumed = 0;
+			return (SEND_ERROR_QUEUE_FULL);
+		}
 
 	} else { /* client - send the data straight away */
 		pldata->q.id++;
 		*consumed = dns_send(pldata, pldata->conns, data, len);
 		if (*consumed > 0) {
 			conn->data_sent_after_last_receive = 1;
-			return SEND_PKT_SENT;
+			return (SEND_PKT_SENT);
 		} else
-			return SEND_ERROR;
+			return (SEND_ERROR);
 	}
 }
 



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