1 #ifndef ULINUX_SOCKET_MSG_H
2 #define ULINUX_SOCKET_MSG_H
3 //******************************************************************************
4 //*this code is protected by the GNU affero GPLv3
5 //*author:Sylvain BERTRAND <sylvain.bertrand AT gmail dot com>
6 //* <digital.ragnarok AT gmail dot com>
7 //******************************************************************************
10 struct k_io_vec
{//will probably go somewhere else
11 void *base
;//BSD uses caddr_t (1003.1g requires void *)
12 k_sz len
; //Must be size_t (1003.1g)
16 void *name
;//socket name
17 k_i name_len
;//length of name
18 struct k_io_vec
*iov
;//data blocks
19 k_sz iov_len
;//number of blocks
20 void *control
;//per protocol magic (eg BSD file descriptor passing)
21 k_sz control_len
;//length of cmsg list
25 //the c prefix stands for access *c*ontrol message (other name ancillary data)
27 k_sz len
;//data byte count, including hdr
28 k_i lvl
;//originating protocol
29 k_i type
;//protocol-specific type
32 #define __K_CMSG_NXTHDR(ctl,len,cmsg) __k_cmsg_nxthdr((ctl),(len),(cmsg))
33 #define K_CMSG_NXTHDR(mhdr,cmsg) __k_cmsg_nxthdr((mhdr),(cmsg))
35 #define K_CMSG_ALIGN(len) (((len)+sizeof(k_l)-1)&~(sizeof(k_l)-1))
37 #define K_CMSG_DATA(cmsg) ((void*)((k_u8*)(cmsg)+K_CMSG_ALIGN(\
38 sizeof(struct k_cmsg_hdr))))
39 #define K_CMSG_SPACE(len) (K_CMSG_ALIGN(sizeof(struct k_cmsg_hdr))\
41 #define K_CMSG_LEN(len) (K_CMSG_ALIGN(sizeof(struct k_cmsg_hdr))+(len))
43 #define __K_CMSG_FIRSTHDR(ctl,len) ((len)>=sizeof(struct k_cmsg_hdr) ? \
44 (struct k_cmsg_hdr *)(ctl) : \
45 (struct k_cmsg_hdr *)NULL)
46 #define K_CMSG_FIRSTHDR(msg) __K_CMSG_FIRSTHDR((msg)->msg_control,\
47 (msg)->msg_controllen)
48 #define K_CMSG_OK(mhdr, cmsg) ((cmsg)->cmsg_len>=sizeof(struct cmsg_hdr)&&\
49 (cmsg)->cmsg_len<=(k_ul)\
50 ((mhdr)->msg_controllen-\
51 ((k_u8*)(cmsg)-(k_u8*)(mhdr)->msg_control)))
53 static inline struct k_cmsg_hdr
* __k_cmsg_nxthdr(void *ctl
,k_sz size
,
54 struct k_cmsg_hdr
*cmsg
)
56 struct k_cmsg_hdr
*ptr
;
58 ptr
=(struct k_cmsg_hdr
*)(((k_u8
*)cmsg
)+K_CMSG_ALIGN(cmsg
->len
));
59 if((k_ul
)((k_u8
*)(ptr
+1)-(k_u8
*)ctl
)>size
) return (struct k_cmsg_hdr
*)0;
63 static inline struct k_cmsg_hdr
*k_cmsg_nxthdr(struct k_msg_hdr
*msg
,
64 struct k_cmsg_hdr
*cmsg
)
66 return __k_cmsg_nxthdr(msg
->control
,msg
->control_len
,cmsg
);
71 #define K_MSG_DONTROUTE 4
72 #define K_MSG_TRYHARD 4//synonym for msg_dontroute for decnet
73 #define K_MSG_CTRUNC 8
74 #define K_MSG_PROBE 0x10//do not send. only probe path f.e. for mtu
75 #define K_MSG_TRUNC 0x20
76 #define K_MSG_DONTWAIT 0x40//nonblocking io
77 #define K_MSG_EOR 0x80//end of record
78 #define K_MSG_WAITALL 0x100//wait for a full request
79 #define K_MSG_FIN 0x200
80 #define K_MSG_SYN 0x400
81 #define K_MSG_CONFIRM 0x800//confirm path validity
82 #define K_MSG_RST 0x1000
83 #define K_MSG_ERRQUEUE 0x2000//fetch message from error queue
84 #define K_MSG_NOSIGNAL 0x4000//do not generate sigpipe
85 #define K_MSG_MORE 0x8000//sender will send more
86 #define K_MSG_WAITFORONE 0x10000//recvmmsg(): block until 1+ packets avail
87 #define K_MSG_EOF K_MSG_FIN
88 #define K_MSG_CMSG_CLOEXEC 0x40000000//set close_on_exit for file descriptor
89 //received through scm_rights
91 //"socket"-level control message types:
92 #define K_SCM_RIGHTS 0x01//rw: access rights (array of int)
93 #define K_SCM_CREDENTIALS 0x02//rw: struct ucred
94 #define K_SCM_SECURITY 0x03//rw: security label