Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
socket.c
Go to the documentation of this file.
1#include "socket.h"
2#include "init/init.h"
3#include "ioforge/ioforge.h"
5#include "libk/serial.h"
6#include <str.h>
7#include "memory/slab.h"
8#include "ethernet.h"
9#include "arp.h"
10#include "icmp.h"
11#include "ipv4.h"
12#include "ip_type.h"
13#include "net/netbuff.h"
14#include "tcp.h"
15#include "netutils.h"
16#include "netdev.h"
17#include "type.h"
18
19static struct slab_cache* socket_cache = 0;
21
22static int socket_receive(socket_t* socket, void* buffer, size_t size);
23static int
25 const void* optval, uint32_t optlen);
27
34
36 socket_t** socket) {
37 // kalau belum ada cache buat dulu
38 if (!socket_cache)
39 vxCreateSlabCache(&socket_cache, "socket", sizeof(socket_t), 0,
40 0);
41
43 (*socket)->family = family;
44 (*socket)->type = type;
45 (*socket)->protocol = protocol;
46
47 if (!socket_ops)
48 LOG2_WARN("Socket", "socket ops not initialized");
49
50 (*socket)->ops = socket_ops;
51}
52
53// checksum
54
55// hardcode
56#define MYIP "192.168.100.80"
57
58static int socket_receive(socket_t* socket, void* buffer, size_t size) {
59 // auto family = socket->family;
60 // auto type = socket->type;
61
62 auto dev = socket->netdev;
63 if (!dev) {
64 return SOCK_ERR_NODEV;
65 }
66
67 auto nic = dev->nic;
68
69 // TODO: handle if devnet is virtual device
70 if (nic->pq_tail == nic->pq_head) {
71 return 0;
72 }
73
74 struct pending_rx rx;
75 if (ioforge_receive_pending_queue(nic, &rx) == -1) {
76 return 0;
77 }
78 // serial2_printf("pending rx buffer 0x%x\n", rx.data);
79
80 size_t n = (rx.len < size) ? rx.len : size;
81
82 struct ethernet_header* eth = (struct ethernet_header*) rx.data;
83
85
86 if (ethertype == ETHER_TYPE_IP) {
87 struct ipv4_header* ip =
88 (struct ipv4_header*) (rx.data
89 + sizeof(
90 struct ethernet_header));
91
92 char ip_buf[16];
93 vxInetNtoa(ip->src_ip, ip_buf);
94
95 if (ip->protocol == ICMP_PROTOCOL) {
96 handle_icmp(dev, ip, eth->src_mac);
97 }
98
99 if (ip->protocol == TCP_PROTOCOL) {
100 handle_tcp(dev, ip, eth->src_mac);
101 }
102 }
103
104 if (ethertype == ETHER_TYPE_ARP) {
105 struct arp_packet* arp =
106 (struct arp_packet*) (rx.data
107 + sizeof(struct ethernet_header));
108 char ip_buf[16];
109 vxInetNtoa(arp->sender_ip, ip_buf);
110 LOG2_INFO("Socket", "arp packet from %s", ip_buf);
111
112 auto target = arp->target_ip;
113 if (vxInetAddr(MYIP) == target) {
114 LOG2_INFO("ARP", "success targetting me");
115 arp_reply(dev, arp->sender_ip, eth->src_mac);
116 }
117 }
118
119 memcopy((void*) buffer, (void*) rx.data, n);
120
121 // clear rx
122 ioforge_clear_rx_queue(nic, &rx);
123 return 1;
124}
125
126static int
128 const void* optval, uint32_t optlen) {
129 UNUSED(optlen);
130
131 switch (level) {
132 case SOL_SOCKET: {
133 switch (optname) {
134 case SO_BINDTODEVICE: {
135 auto netdev = lookup_netdev((char*) optval);
137 if (!netdev) {
138 return SOCK_ERR_NODEV;
139 }
140 return SOCK_OK;
141 break;
142 }
143 }
144 }
145 }
146 return SOCK_ERR_NOTCONN;
147}
148
150 UNUSED(socket);
151 UNUSED(addr);
152 UNUSED(len);
153 return 0;
154}
void arp_reply(netdev_t *dev, uint32_t ip, uint8_t out_mac[6])
Definition arp.c:6
volatile uint64_t addr
Definition e1000.hpp:0
volatile uint32_t buffer[5]
Definition ehci.hpp:8
void handle_icmp(netdev_t *dev, struct ipv4_header *ip, uint8_t mac_dst[6])
Definition icmp.c:11
#define INIT(fn)
Definition init.h:26
void ioforge_clear_rx_queue(struct ioforge_nic_service *nic, struct pending_rx *rx)
Definition ioforge_nic.c:74
int ioforge_receive_pending_queue(struct ioforge_nic_service *nic, struct pending_rx *rx)
Definition ioforge_nic.c:55
#define TCP_PROTOCOL
Definition ip_type.h:7
#define ICMP_PROTOCOL
Definition ip_type.h:6
uint8_t protocol
Definition ipv4.h:6
void * kalloc(size_t size)
#define ETHER_TYPE_ARP
Definition ethernet.h:17
#define ETHER_TYPE_IP
Definition ethernet.h:18
uint16_t ethertype
Definition ethernet.h:2
netdev_t * lookup_netdev(char *name)
Definition netdev.c:70
char * vxInetNtoa(uint32_t ip, char *buffer)
Definition netutils.c:78
uint32_t vxInetAddr(const char *addr)
Definition netutils.c:3
static uint16_t vxHtons(uint16_t value)
Definition netutils.h:6
size_t len
Definition oct2bin.h:7
#define LOG2_WARN(mod, fmt,...)
Definition serial.h:40
#define LOG2_INFO(mod, fmt,...)
Definition serial.h:33
void * vxSlabAlloc(struct slab_cache *cache)
Definition slab.c:93
void vxCreateSlabCache(struct slab_cache **cache, const char *name, const size_t obj_size, size_t alignment, const uintptr_t virt_addr)
Definition slab.c:44
static int socket_bind(socket_t *socket, sockaddr_in_t *addr, uint32_t len)
Definition socket.c:149
void vxSocket(sock_family_t family, sock_type_t type, uint16_t protocol, socket_t **socket)
Definition socket.c:35
static int socket_set_sockopt(socket_t *socket, uint32_t level, uint32_t optname, const void *optval, uint32_t optlen)
Definition socket.c:127
static struct slab_cache * socket_cache
Definition socket.c:19
static int socket_receive(socket_t *socket, void *buffer, size_t size)
Definition socket.c:58
#define MYIP
Definition socket.c:56
#define SOCK_ERR_NOTCONN
Definition socket.h:103
#define SOCK_OK
Definition socket.h:97
struct socket socket_t
Definition socket.h:31
struct sockaddr_in sockaddr_in_t
sock_family_t
Definition socket.h:42
#define SOL_SOCKET
Definition socket.h:84
sock_type_t
Definition socket.h:49
struct socket_ops socket_ops_t
#define SO_BINDTODEVICE
Definition socket.h:89
#define SOCK_ERR_NODEV
Definition socket.h:100
void memcopy(void *dest, void *src, size_t size)
uint32_t target_ip
Definition arp.h:18
uint32_t sender_ip
Definition arp.h:15
uint8_t src_mac[6]
Definition ethernet.h:10
uint16_t ethertype
Definition ethernet.h:11
uint32_t src_ip
Definition ipv4.h:17
uint8_t protocol
Definition ipv4.h:15
struct ioforge_nic_service * nic
Definition netdev.h:38
size_t len
Definition ioforge_nic.h:42
uint8_t * data
Definition ioforge_nic.h:41
int(* recv)(socket_t *socket, void *buffer, size_t size)
Definition socket.h:33
int(* set_sockopt)(socket_t *socket, uint32_t level, uint32_t optname, const void *optval, uint32_t optlen)
Definition socket.h:38
int(* bind)(socket_t *socket, sockaddr_in_t *addr, uint32_t len)
Definition socket.h:37
sock_family_t family
Definition socket.h:56
netdev_t * netdev
Definition socket.h:61
void handle_tcp(netdev_t *dev, struct ipv4_header *ip, uint8_t mac_dst[6])
Definition tcp.c:18
unsigned short uint16_t
Definition type.h:13
unsigned int uint32_t
Definition type.h:19
#define UNUSED(x)
Definition type.h:100
uint8_t type
Definition vnode.h:2
size_t size
Definition vnode.h:3