Added a fillmeup syscall
[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 #ifdef __CONFIG_OSDI__
24 #define PACKETIZER_ETH_TYPE 0xabcd
25 #define PACKETIZER_MAX_PAYLOAD 1024
26 struct packetizer_packet
27 {
28     uint8_t dst_mac[6];
29     uint8_t src_mac[6];
30     uint16_t ethertype;
31     uint16_t seqno;
32     uint32_t payload_size;
33     char payload[PACKETIZER_MAX_PAYLOAD];
34 };
35
36 static void print_packetizer_packet(struct packetizer_packet *p)
37 {
38         printk("packetizer_packet:\n");
39         printk("  dst_mac: %02x:%02x:%02x:%02x:%02x:%02x\n", 
40                 p->dst_mac[0],p->dst_mac[1],p->dst_mac[2],
41                 p->dst_mac[3],p->dst_mac[4],p->dst_mac[5]);
42         printk("  src_mac: %02x:%02x:%02x:%02x:%02x:%02x\n", 
43                 p->src_mac[0],p->src_mac[1],p->src_mac[2],
44                 p->src_mac[3],p->src_mac[4],p->src_mac[5]);
45         printk("  ethertype: 0x%02x\n", ntohs(p->ethertype));
46         printk("  seqno: %u\n", ntohs(p->seqno));
47         printk("  payload_size: %u\n", ntohl(p->payload_size));
48 }
49
50 struct fillmeup {
51         struct proc *proc;
52         uint8_t *bufs;
53         uint16_t num_bufs;
54         int16_t *last_written;
55 };
56 extern struct fillmeup fillmeup_data;
57 #endif
58
59 // Packet sizes
60 #define MTU              1500
61 #define MAX_FRAME_SIZE   (MTU + 14)
62 #define MIN_FRAME_SIZE   60 // See the spec...
63
64 // Maximum packet buffers we can handle at any given time
65 #define MAX_PACKET_BUFFERS    32 //1024
66  
67 // Global send_frame function pointer
68 // Means we can only have one network card per system right now...
69 extern int (*send_frame)(const char *data, size_t len);
70
71 // Global variables for managing ethernet packets over a nic
72 // Again, since these are global for all network cards we are 
73 // limited to only one for now
74 extern unsigned char device_mac[6];
75 extern uint8_t eth_up;
76 extern uint32_t num_packet_buffers;
77 extern char* packet_buffers[MAX_PACKET_BUFFERS];
78 extern uint32_t packet_buffers_sizes[MAX_PACKET_BUFFERS];
79 extern uint32_t packet_buffers_head;
80 extern uint32_t packet_buffers_tail;
81 extern spinlock_t packet_buffers_lock; 
82
83 // Creates a new ethernet packet and puts the header on it
84 char* eth_wrap(const char* data, size_t len, char src_mac[6], 
85                char dest_mac[6], uint16_t eth_type);
86
87 struct ETH_Header {
88         char dest_mac[6];
89         char source_mac[6];
90         uint16_t eth_type;
91 };
92
93 struct eth_frame {
94         struct ETH_Header eth_head;
95         char data[MTU];
96 } __attribute__((packed));
97
98 #endif /* !ROS_INC_NIC_COMMON_H */