kos_sys/os/
netinet.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
// Rust for KallistiOS/Dreamcast
// Copyright (C) 2024 Eric Fradella
// https://dreamcast.rs/

use crate::prelude::*;
use super::socket::sa_family_t;

// in.h

pub type in_port_t = u16;
pub type in_addr_t = u32;

#[repr(C)]
pub struct in_addr {
    pub s_addr:         in_addr_t,
}

#[repr(C)]
pub union __s6_addr {
    pub __s6_addr8:     [u8; 16],
    pub __s6_addr16:    [u16; 8],
    pub __s6_addr32:    [u32; 4],
    pub __s6_addr64:    [u64; 2],
}

#[repr(C)]
pub struct in6_addr {
    pub __s6_addr:      __s6_addr,
}

#[repr(C)]
pub struct sockaddr_in {
    sin_family:         sa_family_t,
    sin_port:           in_port_t,
    sin_addr:           in_addr,
    sin_zero:           [c_uchar; 8],
}

#[repr(C)]
pub struct sockaddr_in6 {
    sin6_family:        sa_family_t,
    sin6_port:          in_port_t,
    sin6_flowinfo:      u32,
    sin6_addr:          in6_addr,
    sin6_scope_id:      u32,
}

pub const INADDR_ANY: in_addr               = in_addr { s_addr: 0x00000000 };
pub const INADDR_BROADCAST: in_addr         = in_addr { s_addr: 0xFFFFFFFF };
pub const INADDR_NONE: in_addr              = in_addr { s_addr: 0xFFFFFFFF };

pub const IN6ADDR_ANY_INIT: in6_addr        = in6_addr {
    __s6_addr: __s6_addr {
        __s6_addr8: [0u8; 16],
    },
};

pub const IN6ADDR_LOOPBACK_INIT: in6_addr   = in6_addr {
    __s6_addr: __s6_addr {
        __s6_addr8: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    },
};

extern "C" {
    pub static in6addr_any: in6_addr;
    pub static in6addr_loopback: in6_addr;
}

pub const INET_ADDRSTRLEN: usize            = 16;
pub const INET6_ADDRSTRLEN: usize           = 46;

pub const IPPROTO_IP: c_int                 = 0;
pub const IPPROTO_ICMP: c_int               = 1;
pub const IPPROTO_TCP: c_int                = 6;
pub const IPPROTO_UDP: c_int                = 17;
pub const IPPROTO_IPV6: c_int               = 41;
pub const IPPROTO_UDPLITE: c_int            = 136;

pub const IP_TTL: u8                        = 24;

pub const IPV6_JOIN_GROUP: u8               = 17;
pub const IPV6_LEAVE_GROUP: u8              = 18;
pub const IPV6_MULTICAST_HOPS: u8           = 19;
pub const IPV6_MULTICAST_IF: u8             = 20;
pub const IPV6_MULTICAST_LOOP: u8           = 21;
pub const IPV6_UNICAST_HOPS: u8             = 22;
pub const IPV6_V6ONLY: u8                   = 23;

#[inline]
pub const fn IN6_IS_ADDR_UNSPECIFIED(a: *const in6_addr) -> bool {
    unsafe {
        (*a).__s6_addr.__s6_addr32[0] == 0 &&
        (*a).__s6_addr.__s6_addr32[1] == 0 &&
        (*a).__s6_addr.__s6_addr32[2] == 0 &&
        (*a).__s6_addr.__s6_addr32[3] == 0
    }
}

#[inline]
pub const fn IN6_IS_ADDR_LOOPBACK(a: *const in6_addr) -> bool {
    unsafe {
        (*a).__s6_addr.__s6_addr32[0] == 0 &&
        (*a).__s6_addr.__s6_addr32[1] == 0 &&
        (*a).__s6_addr.__s6_addr32[2] == 0 &&
        (*a).__s6_addr.__s6_addr16[6] == 0 &&
        (*a).__s6_addr.__s6_addr8[14] == 0 &&
        (*a).__s6_addr.__s6_addr8[15] == 1
    }
}

#[inline]
pub const fn IN6_IS_ADDR_V4MAPPED(a: *const in6_addr) -> bool {
    unsafe {
        (*a).__s6_addr.__s6_addr32[0] == 0 &&
        (*a).__s6_addr.__s6_addr32[1] == 0 &&
        (*a).__s6_addr.__s6_addr16[4] == 0 &&
        (*a).__s6_addr.__s6_addr16[5] == 0xFFFF
    }
}

#[inline]
pub const fn IN6_IS_ADDR_V4COMPAT(a: *const in6_addr) -> bool {
    unsafe {
        (*a).__s6_addr.__s6_addr32[0] == 0 &&
        (*a).__s6_addr.__s6_addr32[1] == 0 &&
        (*a).__s6_addr.__s6_addr32[2] == 0 &&
        (*a).__s6_addr.__s6_addr32[3] != 0 &&
        (*a).__s6_addr.__s6_addr8[15] != 1
    }
}

#[inline]
pub const fn IN6_IS_ADDR_LINKLOCAL(a: *const in6_addr) -> bool {
    unsafe {
        ((*a).__s6_addr.__s6_addr8[0] == 0xFE) &&
        (((*a).__s6_addr.__s6_addr8[1] & 0xC0) == 0x80)
    }
}

#[inline]
pub const fn IN6_IS_ADDR_SITELOCAL(a: *const in6_addr) -> bool {
    unsafe {
        ((*a).__s6_addr.__s6_addr8[0] == 0xFE) &&
        (((*a).__s6_addr.__s6_addr8[1] & 0xC0) == 0xC0)
    }
}

#[inline]
pub const fn IN6_IS_ADDR_MULTICAST(a: *const in6_addr) -> bool {
    unsafe {
        (*a).__s6_addr.__s6_addr8[0] == 0xFF
    }
}

#[inline]
pub const fn IN6_IS_ADDR_MC_NODELOCAL(a: *const in6_addr) -> bool {
    unsafe {
        IN6_IS_ADDR_MULTICAST(a) &&
        (((*a).__s6_addr.__s6_addr8[1] & 0x0F) == 0x01)
    }
}

#[inline]
pub const fn IN6_IS_ADDR_MC_LINKLOCAL(a: *const in6_addr) -> bool {
    unsafe {
        IN6_IS_ADDR_MULTICAST(a) &&
        (((*a).__s6_addr.__s6_addr8[1] & 0x0F) == 0x02)
    }
}

#[inline]
pub const fn IN6_IS_ADDR_MC_SITELOCAL(a: *const in6_addr) -> bool {
    unsafe {
        IN6_IS_ADDR_MULTICAST(a) &&
        (((*a).__s6_addr.__s6_addr8[1] & 0x0F) == 0x05)
    }
}

#[inline]
pub const fn IN6_IS_ADDR_MC_ORGLOCAL(a: *const in6_addr) -> bool {
    unsafe {
        IN6_IS_ADDR_MULTICAST(a) &&
        (((*a).__s6_addr.__s6_addr8[1] & 0x0F) == 0x08)
    }
}

#[inline]
pub const fn IN6_IS_ADDR_MC_GLOBAL(a: *const in6_addr) -> bool {
    unsafe {
        IN6_IS_ADDR_MULTICAST(a) &&
        (((*a).__s6_addr.__s6_addr8[1] & 0x0F) == 0x0E)
    }
}

// tcp.h

pub const TCP_NODELAY: c_int                = 1;

// udp.h

pub const UDP_NOCHECKSUM: c_int             = 25;

// udplite.h

pub const UDPLITE_SEND_CSCOV: c_int         = 26;
pub const UDPLITE_RECV_CSCOV: c_int         = 27;