Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
ipv4.c
Go to the documentation of this file.
1#include "ipv4.h"
2#include "ethernet.h"
3#include "libk/serial.h"
4#include <str.h>
5#include "net/netdev.h"
6#include "net/netutils.h"
7#include "type.h"
8
9static void fill_ip_header(struct ipv4_header* ip_hdr, uint16_t total_length,
12 UNUSED(id);
14 ip_hdr->version_ihl = 0x45; // Version 4, IHL 5 (20 bytes)
15 ip_hdr->tos = 0;
17
18 // sementara belum butuh fragmentasi
19 ip_hdr->id = 0;
20 ip_hdr->flags_fragment = 0;
21 ip_hdr->ttl = 64;
22 ip_hdr->protocol = protocol;
23 // sementara hardcode
24 ip_hdr->src_ip = src_ip;
25 ip_hdr->dst_ip = dst_ip;
26
27 ip_hdr->checksum = 0;
28 ip_hdr->checksum = checksum16_adc((uint16_t*) (void*) ip_hdr,
29 sizeof(struct ipv4_header));
30}
31
32void ipv4_send(netdev_t* dev, struct netbuff* nb, uint32_t dst_ip,
33 uint8_t protocol, uint8_t mac_dest[6]) {
34
35 uint16_t mtu = dev->mtu;
36 uint16_t max_ip_payload = mtu - sizeof(struct ipv4_header);
37 uint16_t total_payload_len = nb->length;
38 uint16_t sent = 0;
39 uint16_t ip_id = get_next_ip_id(dev);
40
41 // hardcode
42 auto ip_addr = vxInetAddr("192.168.100.80");
43 // serial2_printf("ipv4\n");
44
45 if (total_payload_len <= max_ip_payload) {
46 struct ipv4_header* ip_hdr = (struct ipv4_header*) netbuff_push(
47 nb, sizeof(struct ipv4_header));
48 fill_ip_header(ip_hdr,
49 total_payload_len + sizeof(struct ipv4_header),
50 ip_id, 0, protocol, ip_addr, dst_ip);
51 ethernet_send_frame(dev, nb, vxHtons(ETHER_TYPE_IP), mac_dest);
52 return;
53 }
54
55 while (sent < total_payload_len) {
56 uint16_t chunk_size =
57 (total_payload_len - sent > max_ip_payload)
58 ? max_ip_payload
59 : (total_payload_len - sent);
60
61 // Buat netbuff baru untuk fragmen ini
62 auto frag_nb = create_netbuff();
63 uint8_t* dest = netbuff_put(frag_nb, chunk_size);
64
65 // Copy potongan data dari netbuff utama ke netbuff fragmen
66 memcopy(dest, nb->data + sent, chunk_size);
67
68 // Tempel Header IP
69 struct ipv4_header* ip_hdr = (struct ipv4_header*) netbuff_push(
70 frag_nb, sizeof(struct ipv4_header));
71
72 // Hitung Flags & Offset
73 uint16_t offset = sent / 8;
74 uint16_t flags_offset = offset & 0x1FFF;
75 if (sent + chunk_size < total_payload_len) {
76 flags_offset |= 0x2000; // More Fragments (MF) = 1
77 }
78
79 fill_ip_header(ip_hdr, frag_nb->length, ip_id, flags_offset,
80 protocol, ip_addr, dst_ip);
81
83 mac_dest);
84
85 sent += chunk_size;
86 free_netbuff(frag_nb); // Hapus fragmen setelah dikirim
87 }
88}
void ethernet_send_frame(netdev_t *dev, struct netbuff *netbuff, uint16_t ethertype, const uint8_t dst_mac[6])
Definition ethernet.c:9
static void fill_ip_header(struct ipv4_header *ip_hdr, uint16_t total_length, uint16_t id, uint16_t flags_fragment, uint8_t protocol, uint32_t src_ip, uint32_t dst_ip)
Definition ipv4.c:9
void ipv4_send(netdev_t *dev, struct netbuff *nb, uint32_t dst_ip, uint8_t protocol, uint8_t mac_dest[6])
Definition ipv4.c:32
uint16_t flags_fragment
Definition ipv4.h:4
uint32_t dst_ip
Definition ipv4.h:9
uint16_t total_length
Definition ipv4.h:2
uint32_t src_ip
Definition ipv4.h:8
uint8_t protocol
Definition ipv4.h:6
#define ETHER_TYPE_IP
Definition ethernet.h:18
void free_netbuff(struct netbuff *netbuff)
Definition netbuff.c:56
void * netbuff_put(struct netbuff *nb, size_t len)
Definition netbuff.c:42
void * netbuff_push(struct netbuff *nb, size_t len)
Definition netbuff.c:50
struct netbuff * create_netbuff()
Definition netbuff.c:19
uint16_t get_next_ip_id(netdev_t *dev)
Definition netdev.c:100
struct netdev netdev_t
Definition netdev.h:19
uint16_t checksum16_adc(const uint16_t *data, size_t length)
Definition netutils.c:26
uint32_t vxInetAddr(const char *addr)
Definition netutils.c:3
static uint16_t vxHtons(uint16_t value)
Definition netutils.h:6
void memcopy(void *dest, void *src, size_t size)
uint16_t id
Definition ipv4.h:12
uint16_t total_length
Definition ipv4.h:11
uint32_t src_ip
Definition ipv4.h:17
uint16_t flags_fragment
Definition ipv4.h:13
uint8_t ttl
Definition ipv4.h:14
uint8_t version_ihl
Definition ipv4.h:9
uint8_t tos
Definition ipv4.h:10
uint32_t dst_ip
Definition ipv4.h:18
uint16_t checksum
Definition ipv4.h:16
uint8_t protocol
Definition ipv4.h:15
uint8_t * data
Definition netbuff.h:15
uint16_t length
Definition netbuff.h:18
uint16_t mtu
Definition netdev.h:36
unsigned short uint16_t
Definition type.h:13
unsigned int uint32_t
Definition type.h:19
#define UNUSED(x)
Definition type.h:100
unsigned char uint8_t
Definition type.h:7
uint32_t offset
Definition virtio.h:6