int i = 0;
for (i = 0; i < MAX_SOCKS; i++) {
- sockets[i].in_use = 0;
- init_queue(&(sockets[i].send_queue));
- init_queue(&(sockets[i].recv_queue));
+ sockets[i].in_use = 0;
+ init_ring_buffer(&(sockets[i].send_queue), 65535);
+ init_ring_buffer(&(sockets[i].recv_queue), 65535);
}
-
- //initiate uIP
- uip_init();
- uip_arp_init();
-
- // set up interrupt handler
- // set up device driver
-
- Init_Ne2k(&Packet_Received);
-
-
+
+ //initiate uIP
+ uip_init();
+ uip_arp_init();
+
+ // set up interrupt handler
+ // set up device driver
+
+ Init_Ne2k(&Packet_Received);
+
+
}
static int allocate_socket_fd() {
}
static int release_socket_fd(int sockfd){
- if (sockfd >= 0 && sockfd < MAX_SOCKS)
- sockets[sockfd].in_use = 0;
-
- return 0;
+ if ((sockfd >= 0) && (sockfd < MAX_SOCKS)) {
+ sockets[sockfd].in_use = 0;
+ }
+
+ return 0;
}
int connect(const uchar_t ip_addr[4], ushort_t port) {
int sockfd = -1;
- sockfd = allocate_socket_fd();
uip_ipaddr_t ipaddr;
-
+
+ sockfd = allocate_socket_fd();
if (sockfd == -1) {
return -1;
}
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;
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) {
+ NE2K_Transmit(uip_len);
+ }
+ }
+
+
+ for(i = 0; i < UIP_UDP_CONNS; i++) {
+ uip_udp_periodic(i);
+
+ if(uip_len > 0) {
+ NE2K_Transmit(uip_len);
+ }
+ }
}
// a series of utilities to handle conncetion states
}
// not finished yet
-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;
+static void senddata(int sockfd) {
+ struct socket * sock = get_socket_from_fd(sockfd);
+ int mss = uip_mss();
+ int pending_bytes = rb_data_len(&(sock->send_queue));
+ int len = (mss < pending_bytes) ? mss: pending_bytes;
+ int bytes_read = 0;
+ uchar_t * send_buf = uip_appdata;
- if(len < uip_mss()) {
- // memcpy(bufptr, data, len);
- } else {
+ bytes_read = rb_peek(&(sock->send_queue), send_buf, len);
- }*/
- //uip_send(uip_appdata,len);
+ if (bytes_read == 0) {
+ // no packet for send
+ return;
+ }
+
+ uip_send(send_buf, len);
}
//get the socket id by the local tcp port
-static int get_socket_from_port(ushort_t lport) {
+static int get_socket_from_port(ushort_t lport) {
int i;
- for (i = 0; i<MAX_SOCKS; i++){
- if (sockets[i].con->lport == lport)
- return i;
+ for (i = 0; i < MAX_SOCKS; i++){
+ if (sockets[i].con->lport == lport)
+ return i;
}
return -1;
sockfd = get_socket_from_port(uip_conn->lport);
- if (sockfd == -1) return;
-
+ if (sockfd == -1) {
+ return;
+ }
+
if(uip_connected()) {
- connected(sockfd);
+ connected(sockfd);
}
if(uip_closed() ||uip_aborted() ||uip_timedout()) {
-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;
+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) {
+ NE2K_Transmit(uip_len);
+ }
+
+ } else {
+
+ uip_arp_ipin();
+ uip_input();
+
+ if (uip_len > 0) {
+ uip_arp_out();
+ NE2K_Transmit(uip_len);
+ }
+ }
+ return 0;
}