x86: allows panic earlier in the boot process
[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 // Packet sizes
9 #define MTU              1500
10 #define MAX_FRAME_SIZE   (MTU + 14)
11 #define MIN_FRAME_SIZE   60 // See the spec...
12
13 // Maximum packet buffers we can handle at any given time
14 #define MAX_PACKET_BUFFERS    1024
15  
16 // Global send_frame function pointer
17 // Means we can only have one network card per system right now...
18 extern int (*send_frame)(const char *data, size_t len);
19
20 // Global variables for managing ethernet packets over a nic
21 // Again, since these are global for all network cards we are 
22 // limited to only one for now
23 extern char device_mac[6];
24 extern uint8_t eth_up;
25 extern uint32_t num_packet_buffers;
26 extern char* packet_buffers[MAX_PACKET_BUFFERS];
27 extern uint32_t packet_buffers_sizes[MAX_PACKET_BUFFERS];
28 extern uint32_t packet_buffers_head;
29 extern uint32_t packet_buffers_tail;
30 extern spinlock_t packet_buffers_lock; 
31
32 // Host to network format conversions and vice-versa
33 static inline uint16_t htons(uint16_t x)
34 {
35         __asm__ ("xchgb %%al,%%ah" : "=a" (x) : "a" (x));
36         return x;
37 }
38
39 static inline uint32_t htonl(uint32_t x)
40 {
41         __asm__ ("bswapl %0" : "=r" (x) : "0" (x));
42         return x;
43 }
44 #define ntohs htons
45 #define ntohl htonl
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 */