Fixes TCP drops due to ARP timeouts
[akaros.git] / kern / include / ip.h
index 8c802e1..523feb9 100644 (file)
@@ -2,12 +2,13 @@
 
 #ifndef ROS_KERN_IP_H
 #define ROS_KERN_IP_H
+#include <ns.h>
 
 enum {
        Addrlen = 64,
        Maxproto = 20,
        Nhash = 64,
-       Maxincall = 5,
+       Maxincall = 500,
        Nchans = 256,
        MAClen = 16,    /* longest mac address */
 
@@ -186,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 */
@@ -493,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 */
@@ -530,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];
@@ -609,6 +632,20 @@ extern void ip_init(struct Fs *);
 extern void update_mtucache(uint8_t * unused_uint8_p_t, uint32_t);
 extern uint32_t restrict_mtu(uint8_t * unused_uint8_p_t, uint32_t);
 
+static inline void ptclcsum_finalize(struct block *bp, unsigned int feat)
+{
+       unsigned int flag = bp->flag & BCKSUM_FLAGS;
+       uint8_t *csum_store;
+
+       if (flag && (flag & feat) != flag) {
+               csum_store = bp->rp + bp->checksum_start + bp->checksum_offset;
+               hnputs((uint16_t *)csum_store,
+                      ptclcsum(bp, bp->checksum_start,
+                               BLEN(bp) - bp->checksum_start));
+               bp->flag &= ~BCKSUM_FLAGS;
+       }
+}
+
 /*
  * bootp.c
  */
@@ -889,6 +926,21 @@ struct netaddr {
 };
 
 /*
+ * These flags overlap with block flags, to make detecting unsupported
+ * offloads efficient.
+ */
+#define NETF_BASE_SHIFT                (NS_SHIFT_MAX + 1)
+#define NETF_PADMIN_SHIFT      (NETF_BASE_SHIFT + 0)
+#define NETF_SG_SHIFT          (NETF_BASE_SHIFT + 1)
+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_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
  */
 struct netif {
@@ -904,6 +956,7 @@ struct netif {
        int alen;                                       /* address length */
        int mbps;                                       /* megabits per sec */
        int link;                                       /* link status */
+       unsigned int feat;                              /* dev features */
        uint8_t addr[Nmaxaddr];
        uint8_t bcast[Nmaxaddr];
        struct netaddr *maddr;          /* known multicast addresses */
@@ -961,7 +1014,7 @@ struct etherpkt {
 };
 // INFERNO
 enum {
-       MaxEther = 4,
+       MaxEther = 32,
        MaxFID = 16,
        Ntypes = 8,
 };
@@ -971,6 +1024,7 @@ struct ether {
        int ctlrno;
        char *type;
        int irq;
+       unsigned int tbdf;
        int port;
        int minmtu;
        int maxmtu;
@@ -981,7 +1035,6 @@ struct ether {
        void (*closed) (struct ether *);
        void (*detach) (struct ether *);
        void (*transmit) (struct ether *);
-       void (*interrupt) (struct hw_trapframe *, void *);
        long (*ifstat) (struct ether *, void *, long, uint32_t);
        long (*ctl) (struct ether *, void *, long);     /* custom ctl messages */
        void (*power) (struct ether *, int);    /* power on/off */