All qlocks are initialized
[akaros.git] / kern / include / net / 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 #include <net/pbuf.h>
9
10 // Packet sizes
11 #define MTU              1500
12 /* 14 for the header, 4 for something else.  It's either the CRC at the end
13  * (which seems to be 0'd), or for the optional 802.1q tag. */
14 #define MAX_FRAME_SIZE   (MTU + 18)
15 #define MIN_FRAME_SIZE   60 // See the spec...
16
17 // Maximum packet buffers we can handle at any given time
18 #define MAX_PACKET_BUFFERS    32 //1024
19  
20 // Global send_frame function pointer
21 // Means we can only have one network card per system right now...
22 extern int (*send_frame)(const char *data, size_t len);
23 extern int (*send_pbuf)(struct pbuf *p);
24 extern struct pbuf* (*recv_pbuf)(void);
25
26 // Global variables for managing ethernet packets over a nic
27 // Again, since these are global for all network cards we are 
28 // limited to only one for now
29 extern unsigned char device_mac[6];
30 extern uint8_t eth_up;
31 extern uint32_t num_packet_buffers;
32 extern char* packet_buffers[MAX_PACKET_BUFFERS];
33 extern uint32_t packet_buffers_sizes[MAX_PACKET_BUFFERS];
34 extern uint32_t packet_buffers_head;
35 extern uint32_t packet_buffers_tail;
36 extern spinlock_t packet_buffers_lock; 
37
38 // Creates a new ethernet packet and puts the header on it
39 char* eth_wrap(const char* data, size_t len, char src_mac[6], 
40                char dest_mac[6], uint16_t eth_type);
41
42 struct ETH_Header {
43         char dest_mac[6];
44         char source_mac[6];
45         uint16_t eth_type;
46 };
47
48 struct eth_frame {
49         struct ETH_Header eth_head;
50         char data[MTU];
51 } __attribute__((packed));
52
53 static inline void print_mac (uint8_t* mac_addr) {
54         printk("%02x:%02x:%02x:%02x:%02x:%02x\n", 0xFF & mac_addr[0], 0xFF & mac_addr[1],       
55                                                                  0xFF & mac_addr[2], 0xFF & mac_addr[3],        
56                                                            0xFF & mac_addr[4], 0xFF & mac_addr[5]);
57 }
58
59 #endif /* !ROS_INC_NIC_COMMON_H */