Avoids nehalem keyboard issues, better monitors
[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 <net.h>
7 #include <pmap.h>
8
9 // Packet sizes
10 #define MTU              1500
11 /* 14 for the header, 4 for something else.  It's either the CRC at the end
12  * (which seems to be 0'd), or for the optional 802.1q tag. */
13 #define MAX_FRAME_SIZE   (MTU + 18)
14 #define MIN_FRAME_SIZE   60 // See the spec...
15
16 // Maximum packet buffers we can handle at any given time
17 #define MAX_PACKET_BUFFERS    32 //1024
18  
19 // Global send_frame function pointer
20 // Means we can only have one network card per system right now...
21 extern int (*send_frame)(const char *data, size_t len);
22
23 // Global variables for managing ethernet packets over a nic
24 // Again, since these are global for all network cards we are 
25 // limited to only one for now
26 extern unsigned char device_mac[6];
27 extern uint8_t eth_up;
28 extern uint32_t num_packet_buffers;
29 extern char* packet_buffers[MAX_PACKET_BUFFERS];
30 extern uint32_t packet_buffers_sizes[MAX_PACKET_BUFFERS];
31 extern uint32_t packet_buffers_head;
32 extern uint32_t packet_buffers_tail;
33 extern spinlock_t packet_buffers_lock; 
34
35 // Creates a new ethernet packet and puts the header on it
36 char* eth_wrap(const char* data, size_t len, char src_mac[6], 
37                char dest_mac[6], uint16_t eth_type);
38
39 struct ETH_Header {
40         char dest_mac[6];
41         char source_mac[6];
42         uint16_t eth_type;
43 };
44
45 struct eth_frame {
46         struct ETH_Header eth_head;
47         char data[MTU];
48 } __attribute__((packed));
49
50 #endif /* !ROS_INC_NIC_COMMON_H */