summaryrefslogtreecommitdiff
path: root/kernel/network
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/network')
-rw-r--r--kernel/network/arp.c1
-rw-r--r--kernel/network/ipv4.c6
-rw-r--r--kernel/network/tcp.c18
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);