Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Aug 2007 12:38:29 GMT
From:      Matus Harvan <mharvan@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 125402 for review
Message-ID:  <200708201238.l7KCcTHh058221@repoman.freebsd.org>

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

Change 125402 by mharvan@mharvan_bike-planet on 2007/08/20 12:38:13

	plugin_send() reports the number of bytes consumed - used in the DNS plugin

Affected files ...

.. //depot/projects/soc2007/mharvan-mtund/mtund.src/mtund.c#9 edit
.. //depot/projects/soc2007/mharvan-mtund/mtund.src/mtund.h#4 edit
.. //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin.h#8 edit
.. //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_dns/plugin_dns.c#2 edit
.. //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_icmp.c#11 edit
.. //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_tcp.c#15 edit
.. //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_udp.c#11 edit
.. //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin_udp_catchall.c#4 edit

Differences ...

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

@@ -433,6 +433,7 @@
 	char data[10];
 	char *datap = data;
 	int len=0;
+	int consumed;
 
 	cl->ping_counter++;
 
@@ -453,7 +454,7 @@
 		len++;
 		
 		nwrite =  cl->pl->send(cl->pl, cl->clid,
-				      data, len, NORMAL_DATA);
+				      data, len, NORMAL_DATA, &consumed);
 		printf("send_echo_request(): nwrite: 0x%x\n", nwrite);
 	}
 }
@@ -468,6 +469,8 @@
 	int nwrite = 0;
 	char data[10];
 	char *pdata = data;
+	int consumed;
+
 	if (cl->pl != NULL) {
 		/* client ID */
 		*pdata = 0;
@@ -482,7 +485,8 @@
 		pdata += sizeof(cl->reqid);
 		
 		nwrite =  cl->pl->send(cl->pl, cl->clid,
-				       data, pdata - data, NORMAL_DATA);
+				      data, pdata - data, NORMAL_DATA,
+				      &consumed);
 		//pl->ping_counter--;
 		printf("send_id_request(): nwrite: 0x%x\n", nwrite);
 	}
@@ -557,6 +561,7 @@
 	u_int8_t dispatch;
 	int i;
 	int nwrite;
+	int consumed;
 	struct client *cl = NULL;
 
 	/* fragment reassembly */
@@ -750,7 +755,7 @@
 			*data = myclid;
 		}
 		
-		nwrite = pl->send(pl, 0, data, len, URGENT_DATA);
+		nwrite = pl->send(pl, 0, data, len, URGENT_DATA, &consumed);
 		printf("sending reply, returned 0x%x\n", nwrite);
 
 		if (server) {
@@ -819,7 +824,7 @@
 
 		*(data) = DISPATCH_ID_OFFER;
 		*(data+1) = *clid;
-		nwrite = pl->send(pl, *clid, data, 2, URGENT_DATA);
+		nwrite = pl->send(pl, *clid, data, 2, URGENT_DATA, &consumed);
 		fprintf(stderr, "got ID request (plugin: %s)\n",
 			pl->name);
 		printf("sending an offer, returned 0x%x\n", nwrite);
@@ -868,6 +873,7 @@
 process_data_from_tun(struct client *cl, struct plugin *pl, uint8_t dispatch,
     char *data, int len)
 {
+	int consumed;
 	char ldata[MTU+3];
 
 	if (pl == NULL)
@@ -887,13 +893,15 @@
 			*(ldata) = dispatch;
 			memcpy(ldata + 1, data, min(sizeof(ldata)-1, len));
 			return (pl->send(pl, cl->clid, ldata,
-			    min(sizeof(ldata), len + 1), NORMAL_DATA));
+			    min(sizeof(ldata), len + 1), NORMAL_DATA,
+			    &consumed));
 		} else { /* client */
 			*ldata = myclid;
 			*(ldata + 1) = dispatch;
 			memcpy(ldata+2, data, min(sizeof(ldata)-2, len));
 			return (pl->send(pl, myclid, ldata,
-			    min(sizeof(ldata), len + 2), NORMAL_DATA));
+			    min(sizeof(ldata), len + 2), NORMAL_DATA,
+			    &consumed));
 		}
 	/* add the fragmentation header */
 	} else {
@@ -935,6 +943,7 @@
 send_next_frag(struct client *cl)
 {
 	int nwrite = SEND_PKT_SENT;
+	int consumed;
 	int n;
 
 	if (server) {
@@ -955,16 +964,20 @@
 			/* send it */
 			//TODO: maybe we should check how much data
 			//      was actually sent
-			n = min(cl->pl->mtu, cl->frag_data_len);
+			if (cl->pl->mtu > 0)
+				n = min(cl->pl->mtu, cl->frag_data_len);
+			else
+				n = cl->frag_data_len;
 			nwrite = cl->pl->send(cl->pl, cl->clid,
-			    cl->frag_datap, n, NORMAL_DATA);
+			    cl->frag_datap, n, NORMAL_DATA, &consumed);
+			printf("send_next_frag: consumed: %d\n", consumed);
 			switch (nwrite) {
 			case SEND_PKT_SENT:
 			case SEND_PKT_QUEUED:
-				n -= sizeof(cl->frag_hdr);
-				cl->frag_datap += n;
-				cl->frag_hdr.offset += n;
-				cl->frag_data_len -= n;
+				consumed -= sizeof(cl->frag_hdr);
+				cl->frag_datap += consumed;
+				cl->frag_hdr.offset += consumed;
+				cl->frag_data_len -= consumed;
 				break;
 			default:
 				//plugin_report(current_pl, REPORT_ERROR_SEND);
@@ -994,16 +1007,19 @@
 			/* send it */
 			//TODO: maybe we should check how much data
 			//      was actually sent
-			n = min(cl->pl->mtu, cl->frag_data_len);
+			if (cl->pl->mtu > 0)
+				n = min(cl->pl->mtu, cl->frag_data_len);
+			else
+				n = cl->frag_data_len;
 			nwrite = cl->pl->send(cl->pl, cl->clid,
-			    cl->frag_datap, n, NORMAL_DATA);
+			    cl->frag_datap, n, NORMAL_DATA, &consumed);
 			switch (nwrite) {
 			case SEND_PKT_SENT:
 			case SEND_PKT_QUEUED:
-				n -= sizeof(cl->frag_hdr) + 1;
-				cl->frag_datap += n;
-				cl->frag_hdr.offset += n;
-				cl->frag_data_len -= n;
+				consumed -= sizeof(cl->frag_hdr) + 1;
+				cl->frag_datap += consumed;
+				cl->frag_hdr.offset += consumed;
+				cl->frag_data_len -= consumed;
 				break;
 			default:
 				//plugin_report(current_pl, REPORT_ERROR_SEND);
@@ -1187,6 +1203,8 @@
 	signal(SIGTERM, sigcb);
 	
 	/* load the plugins */ 
+/* 	pl = load_plugin("./plugin_udp.so"); */
+/* 	pl->name = "udp_1234"; */
 /* 	if (server) { */
 /* 		pl = load_plugin("./plugin_udp_catchall.so"); */
 /* 		pl->name = "udp_catchall"; */

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

@@ -28,7 +28,7 @@
 	int (*initialize)(struct plugin*, int, char*, char*);
 	void (*deinitialize)(struct plugin*);
 	void (*receive)(int fd, short ev_type, void *arg); /* select fired on some fd - check for data */
-	int (*send)(struct plugin*, uint8_t, char*, int, int);
+	int (*send)(struct plugin*, uint8_t, char*, int, int, int*);
 	int (*is_ready_to_send)(struct plugin*, uint8_t);
 	void (*conn_close)(struct plugin*, uint8_t);
 	void (*conn_map)(struct plugin*, uint8_t, int);

==== //depot/projects/soc2007/mharvan-mtund/mtund.src/plugin.h#8 (text+ko) ====

@@ -79,10 +79,10 @@
 
 /*
  * Send the data.
- * Return: number of bytes sent, -1 on error. 
+ * consumed: number of bytes sent 
  */
 int plugin_send(struct plugin *pl, uint8_t clid,
-    char *data, int len, int data_type);
+    char *data, int len, int data_type, int *consumed);
 
 /*
  * Data for the plugin from plugin to plugin communication.

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

@@ -224,6 +224,7 @@
 		
 		/* the client has to reset the timer for keep-alive requests */
 		register_timer_ev(&pldata->timer_ev);
+		printf("dns_send(): consumed: %d\n", consumed);
 		return consumed;
 	}
 }
@@ -255,8 +256,11 @@
 plugin_register(struct plugin* pl)
 {
     pl->name = "dns";
-    //pl->mtu = 1024;
-    pl->mtu = 512;
+    if (server) 
+	    //pl->mtu = 1024;
+	    pl->mtu = 512;
+    else
+	    pl->mtu = 0;
     pl->initialize = plugin_initialize;
     pl->deinitialize = plugin_deinitialize;
     pl->is_ready_to_send = plugin_is_ready_to_send;
@@ -312,8 +316,6 @@
 	struct plugin_dns_data *data = (struct plugin_dns_data*) pl->data;
 	int fd_flags;
 
-	fprintf(stderr, "starting plugin_initialize...\n");
-	
 	conn_init(data->conns);
 	data->conn = data->conns;
 	if (server) {
@@ -586,10 +588,10 @@
 }
 
 int
-plugin_send(struct plugin *pl, clientid_t clid, char *data, int len, int data_type)
+plugin_send(struct plugin *pl, clientid_t clid,
+   char *data, int len, int data_type, int *consumed)
 {
 	struct plugin_dns_data *pldata = pl->data;
-	int n = 0;
 	char **queued_data;
 	int *queued_data_len;
 	struct conn *conn;
@@ -620,8 +622,10 @@
 				}
 				memcpy(*queued_data, data, len);
 				*queued_data_len = len;
+				*consumed = len;
 				return SEND_PKT_QUEUED;
 			} else {
+				*consumed = 0;
 				return SEND_ERROR_QUEUE_FULL;
 			}
 			
@@ -631,8 +635,8 @@
 		}
 
 	} else { /* client - send the data straight away */
-		n = dns_send(pldata, pldata->conns, data, len);
-		if (n > 0) {
+		*consumed = dns_send(pldata, pldata->conns, data, len);
+		if (*consumed > 0) {
 			conn->data_sent_after_last_receive = 1;
 			return SEND_PKT_SENT;
 		} else

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

@@ -37,7 +37,7 @@
  * 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_ICMP_KEEP_ALIVE 2
+#define PLUGIN_ICMP_KEEP_ALIVE 1
 
 struct conn {
 	clientid_t clid;
@@ -215,7 +215,6 @@
 	int fd_flags;
 	
 	struct plugin_icmp_data *data = (struct plugin_icmp_data*) pl->data;
-	fprintf(stderr, "starting plugin_initialize...\n");
 	
 	conn_init(data->conns);
 	data->conn = data->conns;
@@ -567,7 +566,8 @@
 }
 
 int
-plugin_send(struct plugin *pl, clientid_t clid, char *data, int len, int data_type)
+plugin_send(struct plugin *pl, clientid_t clid,
+    char *data, int len, int data_type, int *consumed)
 {
 	struct plugin_icmp_data *pldata = pl->data;
 	int n = 0;
@@ -606,8 +606,10 @@
 				}
 				memcpy(*queued_data, data, len);
 				*queued_data_len = len;
+				*consumed = len;
 				return SEND_PKT_QUEUED;
 			} else {
+				*consumed = 0;
 				return SEND_ERROR_QUEUE_FULL;
 			}
 			
@@ -620,9 +622,11 @@
 		n = send_icmp_pkt(pl, pldata->conns, data, len);
 		fprintf(stderr, "send_icmp_pkt: send returned %d\n", n);
 		if (n > 0) {
+			*consumed = n;
 			conn->data_sent_after_last_receive = 1;
 			return SEND_PKT_SENT;
 		} else
+			*consumed = 0;
 			return SEND_ERROR;
 	}
 }

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

@@ -512,7 +512,7 @@
  */
 int
 plugin_send(struct plugin *pl, uint8_t clid,
-    char *data, int len, int data_type)
+    char *data, int len, int data_type, int* consumed)
 {
 	struct plugin_tcp_data *pldata = (struct plugin_tcp_data*) pl->data;
 	int n = 0;
@@ -548,9 +548,11 @@
 	n = write(conn->fd, ldata, sizeof(l) + l);
 	free(ldata);
 	
-	if (n < 0)
+	if (n < 0) {
+		*consumed = 0;
 		warn("plugin_tcp: write failed");
-
+	} else
+		*consumed = n;
 	if (n < 0 || (l != 0 && n == 0) ) {
 		plugin_report(pl, clid, REPORT_ERROR_SEND);
 		return SEND_ERROR;

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

@@ -162,7 +162,7 @@
 
 int plugin_register(struct plugin* pl) {
     pl->name = "udp";
-    pl->mtu = 145;
+    pl->mtu = 1400;
     pl->initialize = plugin_initialize;
     pl->deinitialize = plugin_deinitialize;
     pl->is_ready_to_send = plugin_is_ready_to_send;
@@ -203,7 +203,7 @@
 {
 	//int n = 0;
 	struct plugin_udp_data *data = (struct plugin_udp_data*)pl->data;
-	fprintf(stderr, "starting plugin_initialize...\n");
+
 	if (server == 1) {
 		data->fd = udp_open(port);
 		if (data->fd != -1)
@@ -306,7 +306,7 @@
 
 int
 plugin_send(struct plugin *pl, uint8_t clid,
-    char *data, int len, int data_type)
+    char *data, int len, int data_type, int* consumed)
 {
 	struct plugin_udp_data *datapl = (struct plugin_udp_data*) pl->data;
 	int nwrite = 0;
@@ -317,9 +317,10 @@
 		nwrite = sendto(datapl->fd, data, len, 0,
 			     (struct sockaddr*)&conn->addr,
 			     conn->addrlen);
-		if (nwrite == len)
+		if (nwrite == len) {
+			*consumed = nwrite;
 			return (SEND_PKT_SENT);
-		else {
+		} else {
 			warn("plugin_send: send returned %d", nwrite);
 			return (SEND_ERROR);
 		}
@@ -329,6 +330,7 @@
 				"discarding data\n");
 			return (SEND_ERROR);
 		} else {
+			*consumed = nwrite;
 			nwrite = send(datapl->fd, data, len, 0);
 			fprintf(stderr, "plugin_send: send returned %d\n",
 			    nwrite);

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

@@ -443,7 +443,7 @@
 
 int
 plugin_send(struct plugin *pl, uint8_t clid,
-    char *data, int len, int data_type)
+    char *data, int len, int data_type, int* consumed)
 {
 	struct plugin_udpall_data *pldata = pl->data;
 	struct conn *conn ;
@@ -458,6 +458,11 @@
 	/* send the data */
 	nwrite = send(conn->fd, data, len, 0);
 
+	if (nwrite >= 0)
+		*consumed = nwrite;
+	else
+		*consumed = 0;
+
 	/* error checking */
 	if (nwrite == len)
 		return (SEND_PKT_SENT);



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