diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/features/net.c | 28 | ||||
-rw-r--r-- | kernel/features/syscall.c | 13 | ||||
-rw-r--r-- | kernel/inc/net.h | 1 |
3 files changed, 10 insertions, 32 deletions
diff --git a/kernel/features/net.c b/kernel/features/net.c index d2fa4b9..3fa28c9 100644 --- a/kernel/features/net.c +++ b/kernel/features/net.c @@ -504,6 +504,8 @@ static void tcp_handle_packet(struct tcp_packet *packet, u32 dst, int len) tcp->ack_no = recv_seq; tcp->seq_no = recv_ack; + proc_from_pid(socket->pid)->state = PROC_RUNNING; + socket->state = S_CONNECTED; tcp->state++; return; @@ -523,7 +525,6 @@ static void tcp_handle_packet(struct tcp_packet *packet, u32 dst, int len) // TODO: How many segments are going to be sent?! if ((flags & 0xff) == (TCP_FLAG_ACK | TCP_FLAG_PSH)) { - proc_from_pid(socket->pid)->state = PROC_RUNNING; tcp_send_packet(socket, TCP_FLAG_ACK, NULL, 0); tcp_send_packet(socket, TCP_FLAG_FIN | TCP_FLAG_ACK, NULL, 0); tcp->state++; @@ -764,22 +765,8 @@ int net_connect(struct socket *socket, u32 ip_addr, u16 dst_port) socket->prot.tcp.ack_no = 0; socket->prot.tcp.state = 0; socket->state = S_CONNECTING; - // TODO: Don't block kernel tcp_send_packet(socket, TCP_FLAG_SYN, NULL, 0); - scheduler_disable(); - sti(); - u32 time = timer_get(); - while ((socket->state != S_CONNECTED && timer_get() - time < 1000)) { - if (socket->state == S_FAILED) - break; - } - cli(); - scheduler_enable(); - if (socket->state != S_CONNECTED) { - socket->state = S_FAILED; - return 0; - } - return 1; + return 0; } else if (socket->type == S_UDP) { socket->state = S_CONNECTED; return 1; @@ -804,15 +791,6 @@ void net_send(struct socket *socket, void *data, u32 len) } } -int net_data_available(struct socket *socket) -{ - if (net_installed() && socket && socket->packets && socket->packets->head && - ((struct socket_data *)socket->packets->head->data)->length > 0) - return 1; - else - return 0; -} - int net_receive(struct socket *socket, void *buf, u32 len) { if (!net_installed() || !socket || !socket->packets) diff --git a/kernel/features/syscall.c b/kernel/features/syscall.c index 3d70dbb..01720c5 100644 --- a/kernel/features/syscall.c +++ b/kernel/features/syscall.c @@ -111,7 +111,13 @@ void syscall_handler(struct regs *r) break; } case SYS_NET_CONNECT: { - r->eax = net_connect((void *)r->ebx, r->ecx, r->edx); + struct socket *s = (void *)r->ebx; + if (s->state == S_CONNECTED) + r->eax = 1; + else if (s->state == S_FAILED || s->state == S_CLOSED) + r->eax = 0; + else if (s->state == S_OPEN) + r->eax = net_connect(s, r->ecx, r->edx); break; } case SYS_NET_SEND: { @@ -119,11 +125,6 @@ void syscall_handler(struct regs *r) break; } case SYS_NET_RECEIVE: { - if (!net_data_available((void *)r->ebx)) { - proc_current()->state = PROC_SLEEPING; - proc_yield(r); - return; - } r->eax = net_receive((void *)r->ebx, (void *)r->ecx, r->edx); break; } diff --git a/kernel/inc/net.h b/kernel/inc/net.h index 2ad3d65..2852328 100644 --- a/kernel/inc/net.h +++ b/kernel/inc/net.h @@ -161,7 +161,6 @@ int net_close(struct socket *socket); int net_connect(struct socket *socket, u32 ip_addr, u16 dst_port); void net_send(struct socket *socket, void *data, u32 len); int net_receive(struct socket *socket, void *buf, u32 len); -int net_data_available(struct socket *socket); int net_installed(void); void net_install(void); |