XenevaOS
Loading...
Searching...
No Matches
ipv6.h
Go to the documentation of this file.
1
30#ifndef __IPV6_H__
31#define __IPV6_H__
32
33#include <stdint.h>
34#include <stddef.h>
35#include <Fs/vfs.h>
36
37#define IPV6_NEXT_HOPOPT 0
38#define IPV6_NEXT_TCP 6
39#define IPV6_NEXT_UDP 17
40#define IPV6_NEXT_ICMPV6 58
41
42#if defined(ARCH_X64) || defined(ARCH_ARM64)
43#pragma pack(push,1)
44#endif
45typedef struct _ip6_addr_ {
48
58#if defined(ARCH_X64) || defined(ARCH_ARM64)
59#pragma pack(pop)
60#endif
61
62static inline void ip6_addr_copy(ip6_addr* dst, const ip6_addr* src) {
63 int i;
64 for (i = 0; i < 16; i++)
65 dst->s6_addr[i] = src->s6_addr[i];
66}
67
68static inline int ip6_addr_equal(const ip6_addr* a, const ip6_addr* b) {
69 int i;
70 for (i = 0; i < 16; i++) {
71 if (a->s6_addr[i] != b->s6_addr[i])
72 return 0;
73 }
74 return 1;
75}
76
77static inline int ip6_addr_is_zero(const ip6_addr* a) {
78 int i;
79 for (i = 0; i < 16; i++) {
80 if (a->s6_addr[i] != 0)
81 return 0;
82 }
83 return 1;
84}
85
86static inline int ip6_is_multicast(const ip6_addr* a) {
87 return a->s6_addr[0] == 0xFF;
88}
89
90static inline int ip6_is_linklocal(const ip6_addr* a) {
91 return a->s6_addr[0] == 0xFE && (a->s6_addr[1] & 0xC0) == 0x80;
92}
93
94/* Solicited-node multicast MAC: 33:33:ff:XX:XX:XX from last 3 bytes of IPv6 */
95static inline void ip6_solicited_node_mac(const ip6_addr* addr, uint8_t* mac) {
96 mac[0] = 0x33;
97 mac[1] = 0x33;
98 mac[2] = 0xFF;
99 mac[3] = addr->s6_addr[13];
100 mac[4] = addr->s6_addr[14];
101 mac[5] = addr->s6_addr[15];
102}
103
104/* Build solicited-node multicast address ff02::1:ffXX:XXXX */
105static inline void ip6_solicited_node_addr(const ip6_addr* unicast, ip6_addr* out) {
106 int i;
107 for (i = 0; i < 16; i++)
108 out->s6_addr[i] = 0;
109 out->s6_addr[0] = 0xFF;
110 out->s6_addr[1] = 0x02;
111 out->s6_addr[11] = 0x01;
112 out->s6_addr[12] = 0xFF;
113 out->s6_addr[13] = unicast->s6_addr[13];
114 out->s6_addr[14] = unicast->s6_addr[14];
115 out->s6_addr[15] = unicast->s6_addr[15];
116}
117
118/*
119 * Prefix match: compare first prefixLen bits of a and b.
120 */
121static inline int ip6_prefix_equal(const ip6_addr* a, const ip6_addr* b, uint8_t prefixLen) {
122 int full;
123 int rem;
124 uint8_t mask;
125 int i;
126
127 if (prefixLen > 128)
128 prefixLen = 128;
129 full = prefixLen / 8;
130 rem = prefixLen % 8;
131 for (i = 0; i < full; i++) {
132 if (a->s6_addr[i] != b->s6_addr[i])
133 return 0;
134 }
135 if (rem) {
136 mask = (uint8_t)(0xFF << (8 - rem));
137 if ((a->s6_addr[full] & mask) != (b->s6_addr[full] & mask))
138 return 0;
139 }
140 return 1;
141}
142
143/* Local endian helpers — avoid depending on aunet.h from this header */
144static inline uint32_t ipv6_bswap32(uint32_t l) {
145 return ((l & 0xFFu) << 24) | ((l & 0xFF00u) << 8) |
146 ((l & 0xFF0000u) >> 8) | ((l & 0xFF000000u) >> 24);
147}
148
149static inline uint8_t IPv6GetVersion(const IPv6Header* h) {
150 return (uint8_t)((ipv6_bswap32(h->ver_tc_fl) >> 28) & 0xF);
151}
152
153static inline uint8_t IPv6GetTrafficClass(const IPv6Header* h) {
154 return (uint8_t)((ipv6_bswap32(h->ver_tc_fl) >> 20) & 0xFF);
155}
156
157static inline uint32_t IPv6GetFlowLabel(const IPv6Header* h) {
158 return ipv6_bswap32(h->ver_tc_fl) & 0xFFFFF;
159}
160
161static inline void IPv6SetVerTcFl(IPv6Header* h, uint8_t version, uint8_t tc, uint32_t fl) {
162 uint32_t v = ((uint32_t)(version & 0xF) << 28) |
163 ((uint32_t)tc << 20) |
164 (fl & 0xFFFFF);
165 h->ver_tc_fl = ipv6_bswap32(v);
166}
167
168/*
169 * IPv6 pseudo-header checksum for upper layers (UDP/TCP/ICMPv6).
170 * @param src -- source IPv6
171 * @param dst -- dest IPv6
172 * @param length -- upper-layer length (host order)
173 * @param nextHeader -- next header value
174 * @param data -- upper-layer header + payload
175 * @param dataLen -- length of data in bytes
176 */
177extern uint16_t IPv6PseudoChecksum(const ip6_addr* src, const ip6_addr* dst,
178 uint32_t length, uint8_t nextHeader, const void* data, size_t dataLen);
179
180/*
181 * CreateIPv6Socket -- create a new ipv6 socket
182 */
183extern int CreateIPv6Socket(int type, int protocol);
184
185/*
186 * IPv6HandlePacket -- receive and decode ipv6 packet
187 */
188extern void IPv6HandlePacket(void* data, AuVFSNode* nic);
189
190/*
191 * IPV6SendPacket -- sends a packet to next stage
192 */
193extern void IPV6SendPacket(IPv6Header* packet, AuVFSNode* nic);
194
195#endif
uint8_t mac[6]
Definition main.cpp:127
unsigned int uint32_t
Definition acefiex.h:163
unsigned char uint8_t
Definition acefiex.h:161
unsigned short int uint16_t
Definition acefiex.h:162
AuVFSNode * nic
Definition e1000.cpp:67
struct _ipv6_head_ IPv6Header
uint16_t IPv6PseudoChecksum(const ip6_addr *src, const ip6_addr *dst, uint32_t length, uint8_t nextHeader, const void *data, size_t dataLen)
Definition ipv6.cpp:42
void IPV6SendPacket(IPv6Header *packet, AuVFSNode *nic)
Definition ipv6.cpp:118
void IPv6HandlePacket(void *data, AuVFSNode *nic)
Definition ipv6.cpp:103
struct _ip6_addr_ ip6_addr
int CreateIPv6Socket(int type, int protocol)
Definition ipv6.cpp:112
Definition vfs.h:98
Definition ipv6.h:45
uint8_t s6_addr[16]
Definition ipv6.h:46
Definition ipv6.h:49
uint8_t nextHeader
Definition ipv6.h:52
uint8_t hopLimit
Definition ipv6.h:53
uint8_t payload[]
Definition ipv6.h:56
ip6_addr destIP
Definition ipv6.h:55
ip6_addr srcIP
Definition ipv6.h:54
uint32_t ver_tc_fl
Definition ipv6.h:50
uint16_t payloadLen
Definition ipv6.h:51