Implement transmit checksum offload.
[akaros.git] / kern / src / net / pktmedium.c
1 // INFERNO
2 #include <vfs.h>
3 #include <kfs.h>
4 #include <slab.h>
5 #include <kmalloc.h>
6 #include <kref.h>
7 #include <string.h>
8 #include <stdio.h>
9 #include <assert.h>
10 #include <error.h>
11 #include <cpio.h>
12 #include <pmap.h>
13 #include <smp.h>
14 #include <ip.h>
15
16 static void pktbind(struct Ipifc *i, int unused_int, char **unused_char_pp_t);
17 static void pktunbind(struct Ipifc *i);
18 static void pktbwrite(struct Ipifc *i, struct block *, int unused_int,
19                                           uint8_t * unused_uint8_p_t);
20 static void pktin(struct Fs *f, struct Ipifc *i, struct block *b);
21
22 struct medium pktmedium = {
23         .name = "pkt",
24         .hsize = 14,
25         .mintu = 40,
26         .maxtu = 4 * 1024,
27         .maclen = 6,
28         .bind = pktbind,
29         .unbind = pktunbind,
30         .bwrite = pktbwrite,
31         .pktin = pktin,
32         .unbindonclose = 1,
33 };
34
35 /*
36  *  called to bind an IP ifc to an ethernet device
37  *  called with ifc wlock'd
38  */
39 static void pktbind(struct Ipifc *i, int unused_int, char **unused_char_pp_t)
40 {
41 }
42
43 /*
44  *  called with ifc wlock'd
45  */
46 static void pktunbind(struct Ipifc *i)
47 {
48 }
49
50 /*
51  *  called by ipoput with a single packet to write
52  */
53 static void
54 pktbwrite(struct Ipifc *ifc, struct block *bp, int unused_int,
55                   uint8_t * unused_uint8_p_t)
56 {
57         /* enqueue onto the conversation's rq */
58         bp = concatblock(bp);
59         ptclcsum_finalize(bp, 0);
60         if (atomic_read(&ifc->conv->snoopers) > 0)
61                 qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
62         qpass(ifc->conv->rq, bp);
63 }
64
65 /*
66  *  called with ifc rlocked when someone write's to 'data'
67  */
68 static void pktin(struct Fs *f, struct Ipifc *ifc, struct block *bp)
69 {
70         if (ifc->lifc == NULL)
71                 freeb(bp);
72         else {
73                 if (atomic_read(&ifc->conv->snoopers) > 0)
74                         qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
75                 ipiput4(f, ifc, bp);
76         }
77 }
78
79 void pktmediumlink(void)
80 {
81         addipmedium(&pktmedium);
82 }