Skip to content

Commit 8cc5061

Browse files
committed
icpm echo
1 parent dec4474 commit 8cc5061

File tree

7 files changed

+101
-20
lines changed

7 files changed

+101
-20
lines changed

kernel/kernel.c

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,27 +36,20 @@ void kernel_main(void) {
3636
arp_init();
3737
serial_debug("arp done...");
3838

39-
uint8_t mac_addr[6];
40-
mac_addr[0] = 0xAA;
41-
mac_addr[1] = 0xBB;
42-
mac_addr[2] = 0xCC;
43-
mac_addr[3] = 0xDD;
44-
mac_addr[4] = 0xEE;
45-
mac_addr[5] = 0xFF;
39+
uint8_t mac_addr[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};
4640
get_mac_addr(mac_addr);
4741

48-
uint8_t ip_addr[6];
49-
ip_addr[0] = 10;
50-
ip_addr[1] = 0;
51-
ip_addr[2] = 2;
52-
ip_addr[3] = 15;
42+
uint8_t ip_addr[] = {10, 0, 2, 15};
5343
char *str = "this is a message sent from the OS";
5444

5545
/*
5646
ethernet_send_packet(mac_addr, (void *)str, strlen(str), 0x0021);
5747
ip_send_packet(ip_addr, (void *)str, strlen(str));
5848
*/
5949

50+
uint8_t host_ip[] = {10, 0, 2, 2};
51+
icmp_send_echo_request(host_ip, 1234, 1, "Test ping to host", 16);
52+
6053
// this does not work i cant seem to set up the network on wsl2 qemu
6154
// the packet looks okay, but i cant reach the dhcp server
6255
/*

net/icmp.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include "icmp.h"
2+
#include "drivers/serial.h"
3+
#include "libc/heap.h"
4+
#include "libc/mem.h"
5+
#include "network.h"
6+
7+
void icmp_send_packet(uint8_t *dst_ip, uint8_t type, uint8_t code, uint16_t id,
8+
uint16_t sequence, void *data, uint32_t data_len) {
9+
serial_debug("sending icmp packet %d to %d.%d.%d.%d", type, dst_ip[0],
10+
dst_ip[1], dst_ip[2], dst_ip[3]);
11+
12+
uint32_t icmp_size = sizeof(icmp_packet_t) + data_len;
13+
14+
icmp_packet_t *packet = (icmp_packet_t *)kmalloc(icmp_size);
15+
if (!packet) {
16+
serial_debug("failed to allocate memory for ICMP packet");
17+
return;
18+
}
19+
20+
packet->type = type;
21+
packet->code = code;
22+
packet->checksum = 0;
23+
packet->id = htons(id);
24+
packet->sequence = htons(sequence);
25+
26+
if (data && data_len > 0) {
27+
memcpy(packet->data, data, data_len);
28+
}
29+
30+
packet->checksum = _ip_calculate_checksum((ip_packet_t *)packet, icmp_size);
31+
32+
_ip_send_packet(dst_ip, packet, icmp_size, PROTOCOL_ICMP);
33+
34+
kfree(packet);
35+
}
36+
37+
void icmp_send_echo_request(uint8_t *dst_ip, uint16_t id, uint16_t sequence,
38+
void *data, uint32_t data_len) {
39+
icmp_send_packet(dst_ip, ICMP_ECHO_REQUEST, 0, id, sequence, data, data_len);
40+
}

net/icmp.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#pragma once
2+
#include "ip.h"
3+
4+
#define ICMP_ECHO_REPLY 0
5+
#define ICMP_DEST_UNREACHABLE 3
6+
#define ICMP_SOURCE_QUENCH 4
7+
#define ICMP_REDIRECT 5
8+
#define ICMP_ECHO_REQUEST 8
9+
#define ICMP_TIME_EXCEEDED 11
10+
#define ICMP_PARAMETER_PROBLEM 12
11+
12+
typedef struct icmp_packet {
13+
uint8_t type;
14+
uint8_t code;
15+
uint16_t checksum;
16+
uint16_t id;
17+
uint16_t sequence;
18+
uint8_t data[];
19+
} __attribute__((packed)) icmp_packet_t;
20+
21+
void icmp_send_packet(uint8_t *dst_ip, uint8_t type, uint8_t code, uint16_t id,
22+
uint16_t sequence, void *data, uint32_t data_len);
23+
24+
void icmp_handle_packet(icmp_packet_t *packet, uint16_t length,
25+
uint8_t *src_ip);
26+
27+
void icmp_send_echo_request(uint8_t *dst_ip, uint16_t id, uint16_t sequence,
28+
void *data, uint32_t data_len);

net/ip.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,18 @@ void get_ip_str(char *ip_str, uint8_t *ip) {
2424
}
2525
}
2626

27-
uint16_t ip_calculate_checksum(ip_packet_t *packet) {
27+
uint16_t _ip_calculate_checksum(ip_packet_t *packet, int size) {
2828
// treat the packet header as a 2-byte-integer array
2929
// sum all integers up and flip all bits
30-
int array_size = sizeof(ip_packet_t) / 2;
30+
if (size == 0) {
31+
size = sizeof(ip_packet_t) / 2;
32+
}
3133
uint32_t sum = 0;
3234
uint16_t value;
3335

3436
uint8_t *byte_ptr = (uint8_t *)packet;
3537

36-
for (int i = 0; i < array_size; i++) {
38+
for (int i = 0; i < size; i++) {
3739
memcpy(&value, &byte_ptr[i * 2], sizeof(uint16_t));
3840
sum += flip_short(value);
3941
}
@@ -45,7 +47,16 @@ uint16_t ip_calculate_checksum(ip_packet_t *packet) {
4547
return ret;
4648
}
4749

50+
uint16_t ip_calculate_checksum(ip_packet_t *packet) {
51+
return _ip_calculate_checksum(packet, 0);
52+
}
53+
4854
void ip_send_packet(uint8_t *dst_ip, void *data, uint32_t len) {
55+
_ip_send_packet(dst_ip, data, len, PROTOCOL_UDP); // Assuming UDP for DHCP
56+
}
57+
58+
void _ip_send_packet(uint8_t *dst_ip, void *data, uint32_t len,
59+
uint8_t protocol) {
4960
serial_debug("sending ip packet to %d.%d.%d.%d with data length %d",
5061
dst_ip[0], dst_ip[1], dst_ip[2], dst_ip[3], len);
5162

@@ -69,16 +80,15 @@ void ip_send_packet(uint8_t *dst_ip, void *data, uint32_t len) {
6980

7081
// TTL and protocol
7182
packet->ttl = 64;
72-
packet->protocol = PROTOCOL_UDP; // Assuming UDP for DHCP
83+
packet->protocol = protocol;
7384

7485
uint8_t my_ip_address[4] = {0, 0, 0, 0};
7586

7687
memcpy(packet->src_ip, my_ip_address, 4);
7788
memcpy(packet->dst_ip, dst_ip, 4);
7889

7990
packet->header_checksum = 0;
80-
packet->header_checksum =
81-
ip_calculate_checksum(packet);
91+
packet->header_checksum = ip_calculate_checksum(packet);
8292
serial_debug("ip checksum = %x", ntohs(packet->header_checksum));
8393

8494
memcpy(packet->data, data, len);

net/ip.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
#define IP_PACKET_NO_FRAGMENT 2
88
#define IP_IS_LAST_FRAGMENT 4
99

10-
#define PROTOCOL_UDP 17
10+
#define PROTOCOL_ICMP 1
1111
#define PROTOCOL_TCP 6
12+
#define PROTOCOL_UDP 17
1213

1314
typedef struct ip_packet {
1415
uint8_t version_ihl; // version (4 bits) + IHL (4 bits)
@@ -26,5 +27,8 @@ typedef struct ip_packet {
2627

2728
void get_ip_str(char *ip_str, uint8_t *ip);
2829
uint16_t ip_calculate_checksum(ip_packet_t *packet);
30+
uint16_t _ip_calculate_checksum(ip_packet_t *packet, int size);
2931
void ip_send_packet(uint8_t *dst_ip, void *data, uint32_t len);
32+
void _ip_send_packet(uint8_t *dst_ip, void *data, uint32_t len,
33+
uint8_t protocol);
3034
void ip_handle_packet(ip_packet_t *packet);

setup_network.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
ip tuntap add dev tap0 mode tap
22
ip link set dev tap0 up
3-
ip addr add 192.168.100.1/24 dev tap0
3+
#ip addr add 192.168.100.1/24 dev tap0

start_9p_fs.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# install u9fs, and c9
2+
3+
sudo socat TCP-LISTEN:564,fork EXEC:"u9fs -a none -D -l u9fs.log -u nobody ./disk/root"
4+
5+
# dial tcp!127.0.0.1!564 in c9 with fs9pc:191 nobody, or none
6+
# fstat "/"

0 commit comments

Comments
 (0)