X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fsocket.c;h=8315a191a99f4021345f9b65ed610e9a7d71ab46;hb=b1a2026094d16135da97686e18fa99bfeeec70eb;hp=3554256027bcb7043b7d276fe648828aa13ba3e0;hpb=8b35b23a5b32158fcec29e6ada920b57adc169fa;p=palacios.releases.git diff --git a/palacios/src/geekos/socket.c b/palacios/src/geekos/socket.c index 3554256..8315a19 100644 --- a/palacios/src/geekos/socket.c +++ b/palacios/src/geekos/socket.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -7,29 +8,18 @@ #include #include - -// for some reason, there are compile warnings without these - #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) #define MAX_SOCKS 1024 struct socket sockets[MAX_SOCKS]; -struct gen_queue in_packets; - -struct sock_packet { - int size; - uchar_t *data; -}; int Packet_Received(struct NE2K_Packet_Info* info, uchar_t *pkt) ; void init_network() { int i = 0; - init_queue(&in_packets); - for (i = 0; i < MAX_SOCKS; i++) { sockets[i].in_use = 0; init_queue(&(sockets[i].send_queue)); @@ -62,8 +52,10 @@ static int allocate_socket_fd() { } static int release_socket_fd(int sockfd){ - sockets[sockfd].in_use = 0; - return 0; + if (sockfd >= 0 && sockfd < MAX_SOCKS) + sockets[sockfd].in_use = 0; + + return 0; } @@ -72,8 +64,6 @@ struct socket * get_socket_from_fd(int fd) { } - - int connect(const uchar_t ip_addr[4], ushort_t port) { int sockfd = -1; sockfd = allocate_socket_fd(); @@ -88,8 +78,8 @@ int connect(const uchar_t ip_addr[4], ushort_t port) { sockets[sockfd].con = uip_connect((uip_ipaddr_t *)&ip_addr, htons(port)); if (sockets[sockfd].con == NULL){ - release_socket_fd(sockfd); - return -1; + release_socket_fd(sockfd); + return -1; } return sockfd; @@ -97,22 +87,22 @@ int connect(const uchar_t ip_addr[4], ushort_t port) { void timer_int_Handler(struct Interrupt_State * state){ - int i; - //handle the periodic calls of uIP - for(i = 0; i < UIP_CONNS; ++i) { - uip_periodic(i); - if(uip_len > 0) { - //devicedriver_send(); - NE2K_Transmit(uip_len); - } - } - for(i = 0; i < UIP_UDP_CONNS; i++) { - uip_udp_periodic(i); - if(uip_len > 0) { - //devicedriver_send(); - NE2K_Transmit(uip_len); - } - } + int i; + //handle the periodic calls of uIP + for(i = 0; i < UIP_CONNS; ++i) { + uip_periodic(i); + if(uip_len > 0) { + //devicedriver_send(); + NE2K_Transmit(uip_len); + } + } + for(i = 0; i < UIP_UDP_CONNS; i++) { + uip_udp_periodic(i); + if(uip_len > 0) { + //devicedriver_send(); + NE2K_Transmit(uip_len); + } + } } // a series of utilities to handle conncetion states @@ -133,17 +123,25 @@ static void newdata(int sockfd){ } // not finished yet -static void senddata(int sockfd){ - uchar_t *bufptr; - int len = 0; - - bufptr = uip_appdata; +static void +senddata(int sockfd){ + /*uchar_t *bufptr; + int len = 0; + addr_t pkt; + + struct sockets *sock = get_socket_from_fd(sockfd); + + pkt = dequeue(sock->send_queue); + if (pkt == 0) // no packet for send + return; + + bufptr = uip_appdata; - if(len < uip_mss()) { - // memcpy(bufptr, data, len); - } else { - - } + if(len < uip_mss()) { + // memcpy(bufptr, data, len); + } else { + + }*/ //uip_send(uip_appdata,len); } @@ -154,9 +152,8 @@ static int get_socket_from_port(ushort_t lport) { int i; for (i = 0; ilport == lport) { - return i; - } + if (sockets[i].con->lport == lport) + return i; } return -1; @@ -165,9 +162,11 @@ static int get_socket_from_port(ushort_t lport) { -void socket_appcall(void) { +void +socket_appcall(void) +{ int sockfd; - + sockfd = get_socket_from_port(uip_conn->lport); if (sockfd == -1) return; @@ -200,75 +199,29 @@ void socket_appcall(void) { -int Packet_Received(struct NE2K_Packet_Info* info, uchar_t *pkt) { - struct sock_packet next; - int i; - - next.size = info->size; - next.data = (uchar_t *)Malloc(next.size); - - if (next.data == NULL) { - return 1; - } - - //uip_len = info->size; - - for(i = 0; i < info->size; i++) { - *((next.data) + i) = *(pkt + i); - } - Free(pkt); - - Disable_Interrupts(); - enqueue(&in_packets, &next); - Enable_Interrupts(); - - //triger_receiver_interrupt(); - - return 0; -} - - -void int_handler_packet_receive(struct Interrupt_State * state){ - //device driver got a incoming packet and enqueue that packet to the receive queue - struct sock_packet * next_packet; - void * pkt; - int i; - - while(1){ - //currently disable interrupt because no lock for the queue - Disable_Interrupts(); - pkt = dequeue(&in_packets); - Enable_Interrupts(); - - if (pkt == NULL) { - break; - } - - //there are new packets in the receiver queue - next_packet = (struct sock_packet *)pkt; - uip_len = next_packet->size; - - for(i = 0; i < uip_len; i++) { - uip_buf[i] = *((next_packet->data) + i); - } - - Free(next_packet->data); - Free(next_packet); - - if(BUF->type == htons(UIP_ETHTYPE_ARP)) { - uip_arp_arpin(); - if (uip_len > 0){ - //ethernet_devicedriver_send(); - NE2K_Transmit(uip_len); - } - } else { - uip_arp_ipin(); - uip_input(); - if(uip_len > 0) { - uip_arp_out(); - //ethernet_devicedriver_send(); - NE2K_Transmit(uip_len); - } - } - } +int Packet_Received(struct NE2K_Packet_Info* info, uchar_t *pkt) +{ + int i; + + uip_len = info->size; + for(i = 0; i < info->size; i++) { + uip_buf[i] = *(pkt+i); + } + Free(pkt); + if(BUF->type == htons(UIP_ETHTYPE_ARP)) { + uip_arp_arpin(); + if (uip_len > 0){ + //ethernet_devicedriver_send(); + NE2K_Transmit(uip_len); + } + } else { + uip_arp_ipin(); + uip_input(); + if(uip_len > 0) { + uip_arp_out(); + //ethernet_devicedriver_send(); + NE2K_Transmit(uip_len); + } + } + return 0; }