net: Support connects to 0.0.0.0
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 23 May 2017 18:07:48 +0000 (14:07 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 23 May 2017 18:07:48 +0000 (14:07 -0400)
In Linux, 0.0.0.0 is translated to mean "this machine."  We can do the
same.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ip.h
kern/src/net/devip.c
kern/src/net/ipaux.c

index 2a73332..e0563aa 100644 (file)
@@ -599,6 +599,8 @@ static inline long ipcmp(unsigned char *x, unsigned char *y)
 }
 
 
+extern uint8_t IPv4_loopback[IPaddrlen];
+extern uint8_t IPv4_zeroes[IPaddrlen];
 extern uint8_t IPv4bcast[IPaddrlen];
 extern uint8_t IPv4bcastobs[IPaddrlen];
 extern uint8_t IPv4allsys[IPaddrlen];
index 717bd3e..0ede2b0 100644 (file)
@@ -1046,12 +1046,18 @@ void Fsstdconnect(struct conv *c, char *argv[], int argc)
                        break;
        }
 
+       /* TODO: why is an IPnoaddr (in v6 format, equivalent to v6Unspecified),
+        * a v4 format? */
        if ((memcmp(c->raddr, v4prefix, IPv4off) == 0 &&
                 memcmp(c->laddr, v4prefix, IPv4off) == 0)
                || ipcmp(c->raddr, IPnoaddr) == 0)
                c->ipversion = V4;
        else
                c->ipversion = V6;
+       /* Linux has taught people to use zeros for local interfaces.  TODO: We
+        * might need this for v6 in the future. */
+       if (!ipcmp(c->raddr, IPv4_zeroes))
+               ipmove(c->raddr, IPv4_loopback);
 }
 
 /*
index 26ad7b8..c466a84 100644 (file)
 /*
  *  well known IP addresses
  */
+uint8_t IPv4_loopback[IPaddrlen] = {
+       0, 0, 0, 0,
+       0, 0, 0, 0,
+       0, 0, 0xff, 0xff,
+       0x7f, 0x00, 0x00, 0x01
+};
+
+uint8_t IPv4_zeroes[IPaddrlen] = {
+       0, 0, 0, 0,
+       0, 0, 0, 0,
+       0, 0, 0xff, 0xff,
+       0x00, 0x00, 0x00, 0x00
+};
+
 uint8_t IPv4bcast[IPaddrlen] = {
        0, 0, 0, 0,
        0, 0, 0, 0,