PERFORCE change 125402 for review
Matus Harvan
mharvan at FreeBSD.org
Mon Aug 20 05:38:30 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=125402
Change 125402 by mharvan at 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);
More information about the p4-projects
mailing list