Cleaned up NIC code for appserver
authorKevin Klues <klueska@ros-dev.(none)>
Wed, 24 Mar 2010 07:14:00 +0000 (00:14 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:37 +0000 (17:35 -0700)
kern/arch/i686/frontend.c
kern/arch/i686/ne2k.c
kern/arch/i686/nic_common.h

index f82ee4b..3b45abd 100644 (file)
@@ -3,8 +3,13 @@
 #include <arch/nic_common.h>
 #include <kmalloc.h>
 
+#define debug(...) printk(__VA_ARGS__)
+
 int handle_appserver_packet(const char* p, size_t size)
 {
+       // Subtract off the crc because we just don't care...
+       size-=4;
+
        appserver_packet_t* packet = (appserver_packet_t*)p;
 
        if(size < sizeof(packet->header))
@@ -28,7 +33,8 @@ int handle_appserver_packet(const char* p, size_t size)
                response_paysize = copy_size;
                paysize = 0;
        }
-       if(size != sizeof(packet->header) + paysize)
+       if(size != sizeof(packet->header) + paysize &&
+          !(size == MIN_FRAME_SIZE && sizeof(packet->header) + paysize <= MIN_FRAME_SIZE))
                goto fail;
 
        // construct response packet
@@ -40,7 +46,7 @@ int handle_appserver_packet(const char* p, size_t size)
        response_packet->header.ethertype = packet->header.ethertype;
        response_packet->header.cmd = APPSERVER_CMD_ACK;
        response_packet->header.seqno = packet->header.seqno;
-       response_packet->header.payload_size = packet->header.payload_size;
+       response_packet->header.payload_size = htonl(response_paysize);
        response_packet->header.addr = packet->header.addr;
        
        // determine src/dest for copy
index 09aa4ad..c4a429d 100644 (file)
@@ -382,11 +382,13 @@ void ne2k_handle_rx_packet() {
                return;
        }
 
+
        // Treat as a syscall frontend response packet if eth_type says so
        // Will eventually go away, so not too worried about elegance here...
        #include <frontend.h>
        #include <arch/frontend.h>
-       if((uint16_t)(rx_buffer[13]) == APPSERVER_ETH_TYPE) {
+       uint16_t eth_type = htons(*(uint16_t*)(rx_buffer + 12));
+       if(eth_type == APPSERVER_ETH_TYPE) {
                handle_appserver_packet(rx_buffer, packet_len);
                kfree(rx_buffer);
                return;
@@ -478,7 +480,7 @@ int ne2k_send_frame(const char *data, size_t len) {
 
        for (int i = 0; i<len; i = i + 1) {
                outb(ne2k_io_base_addr + 0x10, *(uint8_t*)(data + i));
-               //printk("sent: %x\n", *(uint8_t*)(data + i));
+               //ne2k_debug("sent: %x\n", *(uint8_t*)(data + i));
        }
        
        while(( inb(ne2k_io_base_addr + NE2K_PG0_RW_ISR) & 0x40) == 0);
index 23e9b8d..a7c279e 100644 (file)
@@ -38,7 +38,7 @@ static inline uint16_t htons(uint16_t x)
 
 static inline uint32_t htonl(uint32_t x)
 {
-       __asm__ ("bswapl %0" : "=r" (x) : "r" (x));
+       __asm__ ("bswapl %0" : "=r" (x) : "0" (x));
        return x;
 }
 #define ntohs htons