Fixes TCP drops due to ARP timeouts
[akaros.git] / kern / include / ip.h
index 2bf7887..523feb9 100644 (file)
@@ -187,6 +187,7 @@ struct Ipifc {
        struct medium *m;                       /* Media pointer */
        int maxtu;                                      /* Maximum transfer unit */
        int mintu;                                      /* Minumum tranfer unit */
+       unsigned int feat;                              /* Offload features */
        int mbps;                                       /* megabits per second */
        void *arg;                                      /* medium specific */
        int reassemble;                         /* reassemble IP packets before forwarding */
@@ -494,11 +495,11 @@ struct arpent {
        struct arpent *hash;
        struct block *hold;
        struct block *last;
-       unsigned int ctime;                     /* time entry was created or refreshed */
-       unsigned int utime;                     /* time entry was last used */
+       uint64_t ctime;                 /* time entry was created or refreshed */
+       uint64_t utime;                 /* time entry was last used */
        uint8_t state;
        struct arpent *nextrxt;         /* re-transmit chain */
-       unsigned int rtime;                     /* time for next retransmission */
+       uint64_t rtime;                 /* time for next retransmission */
        uint8_t rxtsrem;
        struct Ipifc *ifc;
        uint8_t ifcid;                          /* must match ifc->id */
@@ -531,8 +532,29 @@ extern void v4tov6(uint8_t * v6, uint8_t * v4);
 extern int v6tov4(uint8_t * v4, uint8_t * v6);
 //extern int    eipfmt(Fmt*);
 
-#define        ipmove(x, y) memmove(x, y, IPaddrlen)
-#define        ipcmp(x, y) ( (x)[IPaddrlen-1] != (y)[IPaddrlen-1] || memcmp(x, y, IPaddrlen) )
+
+#ifdef CONFIG_RISCV
+#warning "Potentially unaligned IP addrs!"
+#endif
+static inline void ipmove(unsigned char *x, unsigned char *y)
+{
+       uint32_t *a = (uint32_t *)x;
+       uint32_t *b = (uint32_t *)y;
+
+       a[0] = b[0];
+       a[1] = b[1];
+       a[2] = b[2];
+       a[3] = b[3];
+}
+
+static inline long ipcmp(unsigned char *x, unsigned char *y)
+{
+       uint32_t *a = (uint32_t *)x;
+       uint32_t *b = (uint32_t *)y;
+       return (a[0] ^ b[0]) | (a[1] ^ b[1]) |
+               (a[2] ^ b[2]) | (a[3] ^ b[3]);
+}
+
 
 extern uint8_t IPv4bcast[IPaddrlen];
 extern uint8_t IPv4bcastobs[IPaddrlen];
@@ -914,8 +936,9 @@ enum {
        NETF_IPCK = (1 << NS_IPCK_SHIFT),       /* xmit ip checksum */
        NETF_UDPCK = (1 << NS_UDPCK_SHIFT),     /* xmit udp checksum */
        NETF_TCPCK = (1 << NS_TCPCK_SHIFT),     /* xmit tcp checksum */
-       NETF_PADMIN = (1 << NETF_SG_SHIFT),     /* device pads to mintu */
+       NETF_PADMIN = (1 << NETF_PADMIN_SHIFT), /* device pads to mintu */
        NETF_SG = (1 << NETF_SG_SHIFT),         /* device can do scatter/gather */
+       NETF_TSO = (1 << NS_TSO_SHIFT),         /* device can do TSO */
 };
 /*
  *  a network interface