79e7cdd08b760f0d8c72c96ad349b60f32ec95b9
[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
9 // Basic packet sizing
10 // TODO handle jumbo packets
11 #define ETHERNET_ENCAP_SIZE     18
12 #define MTU                     1500    
13 #define MAX_FRAME_SIZE          ETHERNET_ENCAP_SIZE + MTU       
14         
15 // This is to make it simply compile when not in __NETWORK__ mode.
16 #ifndef USER_MAC_ADDRESS
17 #define USER_MAC_ADDRESS {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
18 #endif
19
20 // v----- Evil line ------v
21 // Hacky stuff for syscalls go away.
22
23 #define PACKET_BUFFER_SIZE 1024
24
25 struct ETH_Header
26 {
27         char dest_mac[6];
28         char source_mac[6];
29         uint16_t eth_type;
30 };
31
32
33 struct IP_Header
34 {
35         uint32_t ip_opts0;
36         uint32_t ip_opts1;
37         uint32_t ip_opts2;
38         uint32_t source_ip;
39         uint32_t dest_ip;
40 };
41
42 struct UDP_Header
43 {
44         uint16_t source_port;
45         uint16_t dest_port;
46         uint16_t length;
47         uint16_t checksum;
48 };      
49
50 #define MINIMUM_PACKET_SIZE 14 // kinda evil. probably evil.
51 #define MAX_PACKET_SIZE         MTU
52
53 #define PACKET_HEADER_SIZE  sizeof(struct packet_header) //IP UDP ETH
54 #define MAX_PACKET_DATA         MAX_FRAME_SIZE - PACKET_HEADER_SIZE
55 // This number needs verification! Also, this is a huge hack, as the driver shouldnt care about UDP/IP etc.
56
57 struct packet_header {
58         struct ETH_Header eth_head;
59         struct IP_Header ip_head;
60         struct UDP_Header udp_head;
61 } __attribute__((packed));
62
63 struct eth_packet {
64         struct packet_header eth_head;
65         char data[MTU-PACKET_HEADER_SIZE];
66 } __attribute__((packed));
67
68
69 // ^----- Evil line ------^
70
71 #endif /* !ROS_INC_NIC_COMMON_H */