|  | #ifndef ROS_INC_NIC_COMMON_H | 
|  | #define ROS_INC_NIC_COMMON_H | 
|  |  | 
|  | #include <ros/common.h> | 
|  | #include <trap.h> | 
|  | #include <net.h> | 
|  | #include <pmap.h> | 
|  | #include <net/pbuf.h> | 
|  |  | 
|  | // Packet sizes | 
|  | #define MTU              1500 | 
|  | /* 14 for the header, 4 for something else.  It's either the CRC at the end | 
|  | * (which seems to be 0'd), or for the optional 802.1q tag. */ | 
|  | #define MAX_FRAME_SIZE   (MTU + 18) | 
|  | #define MIN_FRAME_SIZE   60 // See the spec... | 
|  |  | 
|  | // Maximum packet buffers we can handle at any given time | 
|  | #define MAX_PACKET_BUFFERS    32 //1024 | 
|  |  | 
|  | // Global send_frame function pointer | 
|  | // Means we can only have one network card per system right now... | 
|  | extern int (*send_frame)(const char *data, size_t len); | 
|  | extern int (*send_pbuf)(struct pbuf *p); | 
|  | extern struct pbuf* (*recv_pbuf)(void); | 
|  |  | 
|  | // Global variables for managing ethernet packets over a nic | 
|  | // Again, since these are global for all network cards we are | 
|  | // limited to only one for now | 
|  | extern unsigned char device_mac[6]; | 
|  | extern uint8_t eth_up; | 
|  | extern uint32_t num_packet_buffers; | 
|  | extern char* packet_buffers[MAX_PACKET_BUFFERS]; | 
|  | extern uint32_t packet_buffers_sizes[MAX_PACKET_BUFFERS]; | 
|  | extern uint32_t packet_buffers_head; | 
|  | extern uint32_t packet_buffers_tail; | 
|  | extern spinlock_t packet_buffers_lock; | 
|  |  | 
|  | // Creates a new ethernet packet and puts the header on it | 
|  | char* eth_wrap(const char* data, size_t len, char src_mac[6], | 
|  | char dest_mac[6], uint16_t eth_type); | 
|  |  | 
|  | struct ETH_Header { | 
|  | char dest_mac[6]; | 
|  | char source_mac[6]; | 
|  | uint16_t eth_type; | 
|  | }; | 
|  |  | 
|  | struct eth_frame { | 
|  | struct ETH_Header eth_head; | 
|  | char data[MTU]; | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | static inline void print_mac (uint8_t* mac_addr) { | 
|  | printk("%02x:%02x:%02x:%02x:%02x:%02x\n", 0xFF & mac_addr[0], 0xFF & mac_addr[1], | 
|  | 0xFF & mac_addr[2], 0xFF & mac_addr[3], | 
|  | 0xFF & mac_addr[4], 0xFF & mac_addr[5]); | 
|  | } | 
|  |  | 
|  | #endif /* !ROS_INC_NIC_COMMON_H */ |