diff options
Diffstat (limited to 'kernel/network')
-rw-r--r-- | kernel/network/arp.c | 1 | ||||
-rw-r--r-- | kernel/network/ipv4.c | 6 | ||||
-rw-r--r-- | kernel/network/tcp.c | 18 |
3 files changed, 13 insertions, 12 deletions
diff --git a/kernel/network/arp.c b/kernel/network/arp.c index b5825be..baff528 100644 --- a/kernel/network/arp.c +++ b/kernel/network/arp.c @@ -83,7 +83,6 @@ void send_arp_request(const u8 ip[4]) { } int get_mac_from_ip(const u8 ip[4], u8 mac[6]) { - print_ip("ARP GETTING MAC FROM IP: ", ip); for (int i = 0; i < 10; i++) { if (0 != memcmp(arp_table[i].ip, ip, sizeof(u8[4]))) continue; diff --git a/kernel/network/ipv4.c b/kernel/network/ipv4.c index e38ab9b..9565bb5 100644 --- a/kernel/network/ipv4.c +++ b/kernel/network/ipv4.c @@ -41,8 +41,7 @@ u16 ip_checksum(void *vdata, size_t length) { } extern u8 ip_address[4]; -void send_ipv4_packet(u32 ip, u8 protocol, const u8 *payload, - u16 length) { +void send_ipv4_packet(u32 ip, u8 protocol, const u8 *payload, u16 length) { u8 header[20] = {0}; header[0] = (4 /*version*/ << 4) | (5 /*IHL*/); *((u16 *)(header + 2)) = htons(length + 20); @@ -74,7 +73,8 @@ void handle_ipv4(const u8 *payload, u32 packet_length) { *(u16 *)(payload + 10) = 0; u16 calc_checksum = ip_checksum((u8 *)payload, 20); *(u16 *)(payload + 10) = saved_checksum; - assert(calc_checksum == saved_checksum); + if(calc_checksum != saved_checksum) + return; u8 version = (*payload & 0xF0) >> 4; u8 IHL = (*payload & 0xF); diff --git a/kernel/network/tcp.c b/kernel/network/tcp.c index 4b2c462..14bd0cb 100644 --- a/kernel/network/tcp.c +++ b/kernel/network/tcp.c @@ -15,6 +15,9 @@ extern u8 ip_address[4]; #define SYN (1 << 1) #define FIN (1 << 0) +// FIXME: This should be dynamic +#define WINDOW_SIZE 4096 + struct __attribute__((__packed__)) TCP_HEADER { u16 src_port; u16 dst_port; @@ -93,7 +96,7 @@ void tcp_close_connection(struct INCOMING_TCP_CONNECTION *inc) { header.data_offset = 5; header.reserved = 0; header.flags = FIN | ACK; - header.window_size = htons(512); + header.window_size = htons(WINDOW_SIZE); header.urgent_pointer = 0; u32 dst_ip; memcpy(&dst_ip, inc->ip, sizeof(dst_ip)); @@ -118,7 +121,7 @@ void send_tcp_packet(struct INCOMING_TCP_CONNECTION *inc, u8 *payload, header.data_offset = 5; header.reserved = 0; header.flags = PSH | ACK; - header.window_size = htons(512); + header.window_size = htons(WINDOW_SIZE); header.urgent_pointer = 0; u32 dst_ip; memcpy(&dst_ip, inc->ip, sizeof(dst_ip)); @@ -143,7 +146,7 @@ void send_empty_tcp_message(struct INCOMING_TCP_CONNECTION *inc, u8 flags, header.data_offset = 5; header.reserved = 0; header.flags = flags; - header.window_size = htons(512); // TODO: What does this actually mean? + header.window_size = htons(WINDOW_SIZE); header.urgent_pointer = 0; char payload[0]; tcp_calculate_checksum(ip_address, inc->ip, (const u8 *)payload, 0, &header); @@ -201,12 +204,11 @@ void handle_tcp(u8 src_ip[4], const u8 *payload, u32 payload_length) { // inc->seq_num = ack_num; } if (flags & PSH) { - kprintf("send ipv4 packet: %x\n", pit_num_ms()); u16 tcp_payload_length = payload_length - inc_header->data_offset * sizeof(u32); - fifo_object_write( - (u8 *)(payload + inc_header->data_offset * sizeof(u32)), 0, - tcp_payload_length, inc->data_file); + fifo_object_write((u8 *)(payload + inc_header->data_offset * sizeof(u32)), + 0, tcp_payload_length, inc->data_file); + *inc->has_data_ptr = 1; // Send back a ACK struct TCP_HEADER header = {0}; @@ -218,7 +220,7 @@ void handle_tcp(u8 src_ip[4], const u8 *payload, u32 payload_length) { header.data_offset = 5; header.reserved = 0; header.flags = ACK; - header.window_size = htons(512); // TODO: What does this actually mean? + header.window_size = htons(WINDOW_SIZE); header.urgent_pointer = 0; char payload[0]; tcp_calculate_checksum(ip_address, src_ip, (const u8 *)payload, 0, &header); |