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 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394
// Copyright (c) 2020 Xu Shaohua <shaohua@biofan.org>. All rights reserved.
// Use of this source is governed by Apache-2.0 License that can be found
// in the LICENSE file.
//! From `include/linux/socket.h`
use crate::{iovec_t, kernel_sa_family_t, kernel_sockaddr_storage_t, size_t, timespec64_t};
pub type sa_family_t = kernel_sa_family_t;
/// 1003.1g requires `sa_family_t` and that `sa_data` is char.
#[repr(C)]
#[derive(Debug, Default, Clone)]
pub struct sockaddr_t {
/// address family, `AF_xxx`
pub sa_family: sa_family_t,
/// 14 bytes of protocol address
pub sa_data: [u8; 14],
}
#[repr(C)]
#[derive(Debug, Default, Clone)]
pub struct linger_t {
/// Linger active
pub l_onoff: i32,
/// How long to linger for
pub l_linger: i32,
}
pub type sockaddr_storage_t = kernel_sockaddr_storage_t;
/// As we do 4.4BSD message passing we use a 4.4BSD message passing
/// system, not 4.3. Thus `msg_accrights(len)` are now missing. They
/// belong in an obscure libc emulation or the bin.
// Comment kernel msg header
//#[repr(C)]
//struct msghdr_t {
// /// ptr to socket address structure
// pub msg_name: usize,
// /// size of socket address structure
// pub msg_namelen: i32,
// /// data
// //pub msg_iter: iov_iter_t,
// pub msg_iter: usize,
// /// ancillary data
// pub msg_control: usize,
// /// ancillary data buffer length
// pub msg_controllen: size_t,
// /// flags on received message
// pub msg_flags: u32,
// /// ptr to iocb for async requests
// pub msg_iocb: *mut kiocb_t,
//}
#[repr(C)]
#[derive(Debug, Clone)]
pub struct msghdr_t {
/// ptr to socket address structure
pub msg_name: usize,
/// size of socket address structure
pub msg_namelen: i32,
/// scatter/gather array
pub msg_iov: *mut iovec_t,
/// # elements in `msg_iov`
pub msg_iovlen: size_t,
/// ancillary data
pub msg_control: usize,
/// ancillary data buffer length
pub msg_controllen: size_t,
/// flags on received message
pub msg_flags: u32,
}
pub type user_msghdr_t = msghdr_t;
/// For recvmmsg/sendmmsg
#[repr(C)]
#[derive(Debug, Clone)]
pub struct mmsghdr_t {
pub msg_hdr: msghdr_t,
pub msg_len: u32,
}
/// POSIX 1003.1g - ancillary data object information
/// Ancillary data consits of a sequence of pairs of
/// (`cmsghdr, cmsg_data[]`)
#[repr(C)]
#[derive(Debug, Default, Clone)]
pub struct cmsghdr_t {
/// data byte count, including hdr
pub cmsg_len: size_t,
/// originating protocol
pub cmsg_level: i32,
/// protocol-specific type
pub cmsg_type: i32,
}
/// Ancillary data object information MACROS
/// Table 5-14 of POSIX 1003.1g
//#define __CMSG_NXTHDR(ctl, len, cmsg) __cmsg_nxthdr((ctl),(len),(cmsg))
//#define CMSG_NXTHDR(mhdr, cmsg) cmsg_nxthdr((mhdr), (cmsg))
//#define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
//#define CMSG_DATA(cmsg) ((void *)((char *)(cmsg) + sizeof(struct cmsghdr)))
//#define CMSG_SPACE(len) (sizeof(struct cmsghdr) + CMSG_ALIGN(len))
//#define CMSG_LEN(len) (sizeof(struct cmsghdr) + (len))
//#define __CMSG_FIRSTHDR(ctl,len) ((len) >= sizeof(struct cmsghdr) ? \
// (struct cmsghdr *)(ctl) : \
// (struct cmsghdr *)NULL)
//#define CMSG_FIRSTHDR(msg) __CMSG_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen)
//#define CMSG_OK(mhdr, cmsg) ((cmsg)->cmsg_len >= sizeof(struct cmsghdr) && \
// (cmsg)->cmsg_len <= (unsigned long) \
// ((mhdr)->msg_controllen - \
// ((char *)(cmsg) - (char *)(mhdr)->msg_control)))
//#define for_each_cmsghdr(cmsg, msg) \
// for (cmsg = CMSG_FIRSTHDR(msg); \
// cmsg; \
// cmsg = CMSG_NXTHDR(msg, cmsg))
/// "Socket"-level control message types:
/// rw: access rights (array of int)
pub const SCM_RIGHTS: i32 = 0x01;
/// rw: struct ucred
pub const SCM_CREDENTIALS: i32 = 0x02;
/// rw: security label
pub const SCM_SECURITY: i32 = 0x03;
#[repr(C)]
#[derive(Debug, Default, Clone)]
pub struct ucred_t {
pub pid: u32,
pub uid: u32,
pub gid: u32,
}
/// Supported address families.
pub const AF_UNSPEC: i32 = 0;
/// Unix domain sockets
pub const AF_UNIX: i32 = 1;
/// POSIX name for `AF_UNIX`
pub const AF_LOCAL: i32 = 1;
/// Internet IP Protocol
pub const AF_INET: i32 = 2;
/// Amateur Radio AX.25
pub const AF_AX25: i32 = 3;
/// Novell IPX
pub const AF_IPX: i32 = 4;
/// `AppleTalk` DDP
pub const AF_APPLETALK: i32 = 5;
/// Amateur Radio NET/ROM
pub const AF_NETROM: i32 = 6;
/// Multiprotocol bridge
pub const AF_BRIDGE: i32 = 7;
/// ATM PVCs
pub const AF_ATMPVC: i32 = 8;
/// Reserved for X.25 project
pub const AF_X25: i32 = 9;
/// IP version 6
pub const AF_INET6: i32 = 10;
/// Amateur Radio X.25 PLP
pub const AF_ROSE: i32 = 11;
/// Reserved for `DECnet` project
pub const AF_DECNET: i32 = 12;
/// Reserved for 802.2LLC project
pub const AF_NETBEUI: i32 = 13;
/// Security callback pseudo AF
pub const AF_SECURITY: i32 = 14;
/// `PF_KEY` key management API
pub const AF_KEY: i32 = 15;
pub const AF_NETLINK: i32 = 16;
/// Alias to emulate 4.4BSD
pub const AF_ROUTE: i32 = AF_NETLINK;
/// Packet family
pub const AF_PACKET: i32 = 17;
/// Ash
pub const AF_ASH: i32 = 18;
/// Acorn Econet
pub const AF_ECONET: i32 = 19;
/// ATM SVCs
pub const AF_ATMSVC: i32 = 20;
/// RDS sockets
pub const AF_RDS: i32 = 21;
/// Linux SNA Project (nutters!)
pub const AF_SNA: i32 = 22;
/// IRDA sockets
pub const AF_IRDA: i32 = 23;
/// `PPPoX` sockets
pub const AF_PPPOX: i32 = 24;
/// Wanpipe API Sockets
pub const AF_WANPIPE: i32 = 25;
/// Linux LLC
pub const AF_LLC: i32 = 26;
/// `Native InfiniBand` address
pub const AF_IB: i32 = 27;
/// MPLS
pub const AF_MPLS: i32 = 28;
/// Controller Area Network
pub const AF_CAN: i32 = 29;
/// TIPC sockets
pub const AF_TIPC: i32 = 30;
/// Bluetooth sockets
pub const AF_BLUETOOTH: i32 = 31;
/// IUCV sockets
pub const AF_IUCV: i32 = 32;
/// `RxRPC` sockets
pub const AF_RXRPC: i32 = 33;
/// `mISDN` sockets
pub const AF_ISDN: i32 = 34;
/// Phonet sockets
pub const AF_PHONET: i32 = 35;
/// IEEE802154 sockets
pub const AF_IEEE802154: i32 = 36;
/// CAIF sockets
pub const AF_CAIF: i32 = 37;
/// Algorithm sockets
pub const AF_ALG: i32 = 38;
/// NFC sockets
pub const AF_NFC: i32 = 39;
/// vSockets
pub const AF_VSOCK: i32 = 40;
/// Kernel Connection Multiplexor
pub const AF_KCM: i32 = 41;
/// Qualcomm IPC Router
pub const AF_QIPCRTR: i32 = 42;
/// smc sockets: reserve number for `PF_SMC` protocol family that reuses
/// `AF_INET` address family
pub const AF_SMC: i32 = 43;
/// XDP sockets
pub const AF_XDP: i32 = 44;
/// For now..
pub const AF_MAX: i32 = 45;
/// Protocol families, same as address families.
pub const PF_UNSPEC: i32 = AF_UNSPEC;
pub const PF_UNIX: i32 = AF_UNIX;
pub const PF_LOCAL: i32 = AF_LOCAL;
pub const PF_INET: i32 = AF_INET;
pub const PF_AX25: i32 = AF_AX25;
pub const PF_IPX: i32 = AF_IPX;
pub const PF_APPLETALK: i32 = AF_APPLETALK;
pub const PF_NETROM: i32 = AF_NETROM;
pub const PF_BRIDGE: i32 = AF_BRIDGE;
pub const PF_ATMPVC: i32 = AF_ATMPVC;
pub const PF_X25: i32 = AF_X25;
pub const PF_INET6: i32 = AF_INET6;
pub const PF_ROSE: i32 = AF_ROSE;
pub const PF_DECNET: i32 = AF_DECNET;
pub const PF_NETBEUI: i32 = AF_NETBEUI;
pub const PF_SECURITY: i32 = AF_SECURITY;
pub const PF_KEY: i32 = AF_KEY;
pub const PF_NETLINK: i32 = AF_NETLINK;
pub const PF_ROUTE: i32 = AF_ROUTE;
pub const PF_PACKET: i32 = AF_PACKET;
pub const PF_ASH: i32 = AF_ASH;
pub const PF_ECONET: i32 = AF_ECONET;
pub const PF_ATMSVC: i32 = AF_ATMSVC;
pub const PF_RDS: i32 = AF_RDS;
pub const PF_SNA: i32 = AF_SNA;
pub const PF_IRDA: i32 = AF_IRDA;
pub const PF_PPPOX: i32 = AF_PPPOX;
pub const PF_WANPIPE: i32 = AF_WANPIPE;
pub const PF_LLC: i32 = AF_LLC;
pub const PF_IB: i32 = AF_IB;
pub const PF_MPLS: i32 = AF_MPLS;
pub const PF_CAN: i32 = AF_CAN;
pub const PF_TIPC: i32 = AF_TIPC;
pub const PF_BLUETOOTH: i32 = AF_BLUETOOTH;
pub const PF_IUCV: i32 = AF_IUCV;
pub const PF_RXRPC: i32 = AF_RXRPC;
pub const PF_ISDN: i32 = AF_ISDN;
pub const PF_PHONET: i32 = AF_PHONET;
pub const PF_IEEE802154: i32 = AF_IEEE802154;
pub const PF_CAIF: i32 = AF_CAIF;
pub const PF_ALG: i32 = AF_ALG;
pub const PF_NFC: i32 = AF_NFC;
pub const PF_VSOCK: i32 = AF_VSOCK;
pub const PF_KCM: i32 = AF_KCM;
pub const PF_QIPCRTR: i32 = AF_QIPCRTR;
pub const PF_SMC: i32 = AF_SMC;
pub const PF_XDP: i32 = AF_XDP;
pub const PF_MAX: i32 = AF_MAX;
/// Maximum queue length specifiable by listen.
pub const SOMAXCONN: i32 = 128;
/// Flags we can use with send/ and recv.
/// Added those for 1003.1g not all are supported yet
pub const MSG_OOB: i32 = 1;
pub const MSG_PEEK: i32 = 2;
pub const MSG_DONTROUTE: i32 = 4;
/// Synonym for `MSG_DONTROUTE` for `DECnet`
pub const MSG_TRYHARD: i32 = 4;
pub const MSG_CTRUNC: i32 = 8;
/// Do not send. Only probe path f.e. for MTU
pub const MSG_PROBE: i32 = 0x10;
pub const MSG_TRUNC: i32 = 0x20;
/// Nonblocking io
pub const MSG_DONTWAIT: i32 = 0x40;
/// End of record
pub const MSG_EOR: i32 = 0x80;
/// Wait for a full request
pub const MSG_WAITALL: i32 = 0x100;
pub const MSG_FIN: i32 = 0x200;
pub const MSG_SYN: i32 = 0x400;
/// Confirm path validity
pub const MSG_CONFIRM: i32 = 0x800;
pub const MSG_RST: i32 = 0x1000;
/// Fetch message from error queue
pub const MSG_ERRQUEUE: i32 = 0x2000;
/// Do not generate SIGPIPE
pub const MSG_NOSIGNAL: i32 = 0x4000;
/// Sender will send more
pub const MSG_MORE: i32 = 0x8000;
/// `recvmmsg()`: block until 1+ packets avail
pub const MSG_WAITFORONE: i32 = 0x10000;
/// `sendpage()` internal : do no apply policy
pub const MSG_SENDPAGE_NOPOLICY: i32 = 0x10000;
/// `sendpage()` internal : not the last page
pub const MSG_SENDPAGE_NOTLAST: i32 = 0x20000;
/// `sendmmsg()`: more messages coming
pub const MSG_BATCH: i32 = 0x40000;
pub const MSG_EOF: i32 = MSG_FIN;
/// `sendpage()` internal : page frags are not shared
pub const MSG_NO_SHARED_FRAGS: i32 = 0x80000;
/// `sendpage()` internal : page may carry plain text and require encryption
pub const MSG_SENDPAGE_DECRYPTED: i32 = 0x0010_0000;
/// Use user data in kernel path
pub const MSG_ZEROCOPY: i32 = 0x0400_0000;
/// Send data in TCP SYN
pub const MSG_FASTOPEN: i32 = 0x2000_0000;
/// Set `close_on_exec` for file descriptor received through `SCM_RIGHTS`
pub const MSG_CMSG_CLOEXEC: i32 = 0x4000_0000;
// TODO(Shaohua): Support compat
//#if defined(CONFIG_COMPAT)
// This message needs 32 bit fixups
//pub const MSG_CMSG_COMPAT: i32 = 0x80000000;
/// We never have 32 bit fixups
pub const MSG_CMSG_COMPAT: i32 = 0;
/// `setsockoptions(2)` level. Thanks to BSD these must match `IPPROTO_xxx`
pub const SOL_IP: i32 = 0;
/// #define `SOL_ICMP` 1 No-no-no! Due to Linux :-) we cannot use `SOL_ICMP=1`
pub const SOL_TCP: i32 = 6;
pub const SOL_UDP: i32 = 17;
pub const SOL_IPV6: i32 = 41;
pub const SOL_ICMPV6: i32 = 58;
pub const SOL_SCTP: i32 = 132;
/// UDP-Lite (RFC 3828)
pub const SOL_UDPLITE: i32 = 136;
pub const SOL_RAW: i32 = 255;
pub const SOL_IPX: i32 = 256;
pub const SOL_AX25: i32 = 257;
pub const SOL_ATALK: i32 = 258;
pub const SOL_NETROM: i32 = 259;
pub const SOL_ROSE: i32 = 260;
pub const SOL_DECNET: i32 = 261;
pub const SOL_X25: i32 = 262;
pub const SOL_PACKET: i32 = 263;
/// ATM layer (cell level)
pub const SOL_ATM: i32 = 264;
/// ATM Adaption Layer (packet level)
pub const SOL_AAL: i32 = 265;
pub const SOL_IRDA: i32 = 266;
pub const SOL_NETBEUI: i32 = 267;
pub const SOL_LLC: i32 = 268;
pub const SOL_DCCP: i32 = 269;
pub const SOL_NETLINK: i32 = 270;
pub const SOL_TIPC: i32 = 271;
pub const SOL_RXRPC: i32 = 272;
pub const SOL_PPPOL2TP: i32 = 273;
pub const SOL_BLUETOOTH: i32 = 274;
pub const SOL_PNPIPE: i32 = 275;
pub const SOL_RDS: i32 = 276;
pub const SOL_IUCV: i32 = 277;
pub const SOL_CAIF: i32 = 278;
pub const SOL_ALG: i32 = 279;
pub const SOL_NFC: i32 = 280;
pub const SOL_KCM: i32 = 281;
pub const SOL_TLS: i32 = 282;
pub const SOL_XDP: i32 = 283;
/// IPX options
pub const IPX_TYPE: i32 = 1;
#[repr(C)]
#[derive(Debug, Default, Clone)]
pub struct scm_timestamping_internal_t {
pub ts: [timespec64_t; 3],
}