x86: interrupt return path checks kmsgs
[akaros.git] / kern / arch / i686 / nic_common.h
1 #ifndef ROS_INC_NIC_COMMON_H
2 #define ROS_INC_NIC_COMMON_H
3
4 #include <ros/common.h>
5 #include <trap.h>
6 #include <pmap.h>
7
8 // Host to network format conversions and vice-versa
9 static inline uint16_t htons(uint16_t x)
10 {
11         __asm__ ("xchgb %%al,%%ah" : "=a" (x) : "a" (x));
12         return x;
13 }
14
15 static inline uint32_t htonl(uint32_t x)
16 {
17         __asm__ ("bswapl %0" : "=r" (x) : "0" (x));
18         return x;
19 }
20 #define ntohs htons
21 #define ntohl htonl
22
23 // Packet sizes
24 #define MTU              1500
25 #define MAX_FRAME_SIZE   (MTU + 14)
26 #define MIN_FRAME_SIZE   60 // See the spec...
27
28 // Maximum packet buffers we can handle at any given time
29 #define MAX_PACKET_BUFFERS    32 //1024
30  
31 // Global send_frame function pointer
32 // Means we can only have one network card per system right now...
33 extern int (*send_frame)(const char *data, size_t len);
34
35 // Global variables for managing ethernet packets over a nic
36 // Again, since these are global for all network cards we are 
37 // limited to only one for now
38 extern unsigned char device_mac[6];
39 extern uint8_t eth_up;
40 extern uint32_t num_packet_buffers;
41 extern char* packet_buffers[MAX_PACKET_BUFFERS];
42 extern uint32_t packet_buffers_sizes[MAX_PACKET_BUFFERS];
43 extern uint32_t packet_buffers_head;
44 extern uint32_t packet_buffers_tail;
45 extern spinlock_t packet_buffers_lock; 
46
47 // Creates a new ethernet packet and puts the header on it
48 char* eth_wrap(const char* data, size_t len, char src_mac[6], 
49                char dest_mac[6], uint16_t eth_type);
50
51 struct ETH_Header {
52         char dest_mac[6];
53         char source_mac[6];
54         uint16_t eth_type;
55 };
56
57 struct eth_frame {
58         struct ETH_Header eth_head;
59         char data[MTU];
60 } __attribute__((packed));
61
62 #endif /* !ROS_INC_NIC_COMMON_H */