eth_proto.c
changeset 88 a7f546938313
parent 87 be4ee314545c
--- a/eth_proto.c	Sun Feb 17 21:03:23 2008 +0100
+++ b/eth_proto.c	Sun Feb 17 22:27:55 2008 +0100
@@ -16,7 +16,7 @@
 enum {
     MAXPACKET = 1500,
     MAXSEQ = 100,
-    HEAD = 9
+    HEAD = 13
 };
 
 static struct
@@ -31,6 +31,7 @@
     unsigned int wrong_recv;
     char send_buffer[MAXPACKET];
     int send_buffer_size;
+    int port;
 } edata;
 
 enum Control {
@@ -48,17 +49,20 @@
 {
     *((unsigned int *) data) = htonl(seq);
     data[4] = (unsigned char) c;
-    *((unsigned int *)(data+5)) = htonl(size);
+    *((unsigned int *)(data+5)) = htonl(edata.port);
+    *((unsigned int *)(data+5+4)) = htonl(size);
     return HEAD;
 }
 
 static int parse_head(unsigned char *data, unsigned int *seq, enum Control *c,
-        int *size)
+        int *port, int *size)
 {
     *seq = ntohl( *((unsigned int*) data) );
     *c = data[4];
+    if (port)
+        *port = ntohl(*((unsigned int *)(data+5)));
     if (size)
-        *size = ntohl(*((unsigned int *)(data+5)));
+        *size = ntohl(*((unsigned int *)(data+5+4)));
     return HEAD;
 }
 
@@ -70,6 +74,7 @@
 void eth_proto_init()
 {
     edata.socket = -1;
+    edata.port = command_line.eth_port;
     edata.seq_send = 0;
     edata.seq_wait = 0;
     edata.send_acked = 1; /* Fine at the beginning, as if the last data was acked */
@@ -125,6 +130,7 @@
     int res;
     int seq;
     int data_length;
+    int port;
     enum Control c;
     char partner[6];
 
@@ -132,7 +138,10 @@
             res = eth_recv(eth_buffer, sizeof(eth_buffer), partner);
             edata.partner_set = 1;
     } while(res < HEAD);
-    parse_head(eth_buffer, &seq, &c, &data_length);
+    parse_head(eth_buffer, &seq, &c, &port, &data_length);
+    if (port != edata.port)
+        return -1; /* Nothing the parent should care about. Not a packet for us. */
+
     /* We admit any first connection */
     if (seq == 0 && c == INIT)
     {