diff options
author | dzwdz | 2022-08-21 22:33:09 +0200 |
---|---|---|
committer | dzwdz | 2022-08-21 22:33:09 +0200 |
commit | e35d6a4fde9a0671bc7d2527ff6b55b0ce1b4b1e (patch) | |
tree | beb45a1ea334c18a29297684c009e9fb479bebeb /src/user/app/netstack/proto.h | |
parent | dc5098f83ac55722744a97d2950f50ef2a221f1a (diff) |
user: rename ethdump to netstack
Diffstat (limited to 'src/user/app/netstack/proto.h')
-rw-r--r-- | src/user/app/netstack/proto.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/user/app/netstack/proto.h b/src/user/app/netstack/proto.h new file mode 100644 index 0000000..106f286 --- /dev/null +++ b/src/user/app/netstack/proto.h @@ -0,0 +1,70 @@ +#pragma once +#include <camellia/types.h> +#include <stdbool.h> +#include <stdint.h> + +typedef uint8_t mac_t[6]; +static const mac_t MAC_BROADCAST = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + +extern struct net_state { + mac_t mac; + uint32_t ip; + + handle_t raw_h; +} state; + +enum { /* ethertype */ + ET_IPv4 = 0x800, + ET_ARP = 0x806, +}; + +struct ethernet { + const mac_t *src, *dst; + uint16_t type; +}; + +struct ipv4 { + struct ethernet e; + uint32_t src, dst; + uint16_t id, fraginfo; + uint8_t proto; + const uint8_t *header; size_t hlen; +}; + +struct icmp { + struct ipv4 ip; + uint8_t type, code; +}; + + +/* NOT THREADSAFE, YET USED FROM CONCURRENT THREADS + * will break if i implement a scheduler*/ +struct ethq { + struct ethq *next; + handle_t h; +}; +extern struct ethq *ether_queue; + +void arp_parse(const uint8_t *buf, size_t len); + +void icmp_parse(const uint8_t *buf, size_t len, struct ipv4 ip); +void icmp_send(const void *payload, size_t len, struct icmp i); + +void ipv4_parse(const uint8_t *buf, size_t len, struct ethernet ether); +void ipv4_send(const void *payload, size_t len, struct ipv4 ip); + +void ether_parse(const uint8_t *buf, size_t len); +uint8_t *ether_start(size_t len, struct ethernet ether); +void ether_finish(uint8_t *pkt); + +struct udp_conn; +void udp_parse(const uint8_t *buf, size_t len, struct ipv4 ip); +/* calls callback once, after a client connects. */ +void udp_listen(uint16_t port, + void (*on_conn)(struct udp_conn *, void *carg), + void (*on_recv)(const void *, size_t, void *carg), + void *carg); +// TODO udp_onclosed +void udpc_send(struct udp_conn *, const void *buf, size_t len); +/* frees */ +void udpc_close(struct udp_conn *); |