| #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 */ |