master
h 141 lines 4.84 KB
Raw
1 /*++
2
3 Copyright (c) Microsoft. All rights reserved.
4
5 Module Name:
6
7 common.h
8
9 Abstract:
10
11 Common socket definitions and helper routines.
12
13 --*/
14
15 #ifndef _LXT_SOCKET_COMMON_
16 #define _LXT_SOCKET_COMMON_
17
18 #define LXT_SOCKET_CLIENT_VARIATION_SLEEP_SECONDS 5
19 #define LXT_SOCKET_DEFAULT_BUFFER_LENGTH 512
20 #define LXT_SOCKET_DEFAULT_PORT 50001
21 #define LXT_SOCKET_DEFAULT_PORT_IPV6 50002
22 #define LXT_SOCKET_DEFAULT_PORT_STRING "50001"
23 #define LXT_SOCKET_DEFAULT_PORT_IPV6_STRING "50002"
24 #define LXT_SOCKET_VARIATION_TIMEOUT (5 * 1000)
25 #define LXT_SOCKET_DEFAULT_BACKLOG 32
26 #define LXT_SOCKET_STREAM_STRING "SOCK_STREAM"
27 #define LXT_SOCKET_DGRAM_STRING "SOCK_DGRAM"
28 #define LXT_SOCKET_RAW_STRING "SOCK_RAW"
29 #define LXT_SOCKET_SEQPACKET_STRING "SOCK_SEQPACKET"
30 #define LXT_SOCKET_PACKET_STRING "SOCK_PACKET"
31 #define LXT_SOCKET_AF_INET_STRING "AF_INET"
32 #define LXT_SOCKET_AF_INET6_STRING "AF_INET6"
33
34 #define LxtCheckBytesSendRecv(_requested, _actual) \
35 { \
36 if ((_requested) != (_actual)) \
37 { \
38 LxtLogError( \
39 "Bytes requested in send/recv do not match actual. " \
40 "Requested: %d, Actual:%d.", \
41 (_requested), \
42 (_actual)); \
43 Result = LXT_RESULT_FAILURE; \
44 goto ErrorExit; \
45 } \
46 }
47
48 #define LxtCheckPoll(_numfdsExpected, _numfdsActual, _reventExpected, _reventActual) \
49 { \
50 if ((_numfdsExpected) != (_numfdsActual)) \
51 { \
52 LxtLogError("poll returned unexpected value, expecting %d, actual: %d. revents: 0x%x", (_numfdsExpected), (_numfdsActual), (_reventActual)); \
53 Result = LXT_RESULT_FAILURE; \
54 goto ErrorExit; \
55 } \
56 \
57 if ((_reventExpected) != (_reventActual)) \
58 { \
59 LxtLogError( \
60 "expected epoll events do not match actual. " \
61 "Expected: 0x%x, Actual: 0x%x", \
62 (_reventExpected), \
63 (_reventActual)); \
64 Result = LXT_RESULT_FAILURE; \
65 goto ErrorExit; \
66 } \
67 }
68
69 //
70 // This macro will send data from a socket to its connected peer.
71 //
72
73 #define LxtCheckSend(_clientsocket, _sendbuffer, _numbytes, _clientname) \
74 { \
75 LxtLogInfo("[%s]Sending data to server", (_clientname)); \
76 LxtCheckErrno((BytesSent = send((_clientsocket), (_sendbuffer), _numbytes, 0))); \
77 LxtCheckBytesSendRecv((ssize_t)_numbytes, BytesSent); \
78 }
79
80 #define LxtCheckRecv(_servername, _clientname, _recvbuffer, _sendbuffer, _serversocket) \
81 { \
82 ExpectedBytes = strlen(_sendbuffer); \
83 LxtCheckErrno((BytesReceived = recvfrom((_serversocket), (_recvbuffer), sizeof(_recvbuffer), 0, NULL, NULL))); \
84 LxtCheckBytesSendRecv(ExpectedBytes, BytesReceived); \
85 LxtLogInfo("[%s]Data received from %s", (_servername), (_clientname)); \
86 }
87
88 //
89 // TODO: switch over to an array of strings to send / receive.
90 //
91
92 #define LXT_SOCKET_DEFAULT_SEND_STRING "test socket test string\n"
93
94 #define LXT_SOCKET_SERVER_MAX_BACKLOG_NUM 5
95
96 #define LxtCheckEpoll(_fd, _event, _timeout) \
97 { \
98 LxtCheckErrno(LxtSocketEpoll((_fd), (_event), (_timeout))); \
99 }
100
101 #define LxtCheckAncillaryCredentials(_cmsg, _pid, _uid, _gid) \
102 { \
103 struct ucred* Credentials; \
104 LxtCheckEqual((_cmsg)->cmsg_level, SOL_SOCKET, "%d"); \
105 LxtCheckEqual((_cmsg)->cmsg_type, SCM_CREDENTIALS, "%d"); \
106 LxtCheckEqual((_cmsg)->cmsg_len, CMSG_LEN(sizeof(struct ucred)), "%d"); \
107 Credentials = (struct ucred*)CMSG_DATA(_cmsg); \
108 LxtCheckEqual(Credentials->pid, (_pid), "%d"); \
109 LxtCheckEqual(Credentials->uid, (_uid), "%d"); \
110 LxtCheckEqual(Credentials->gid, (_gid), "%d"); \
111 }
112
113 #define LxtSocketGetDomainAsString(_domain) (((_domain) == AF_INET) ? LXT_SOCKET_AF_INET_STRING : LXT_SOCKET_AF_INET6_STRING)
114
115 //
116 // Private macro to get the next message header which returns the first
117 // control message when the control message pointer is NULL. glibc's
118 // 'CMSG_NXTHDR' does not handle that case.
119 //
120
121 #define MY_CMSG_NXTHDR(_msghdr, _pcmsg) (((_pcmsg) == NULL) ? CMSG_FIRSTHDR(_msghdr) : CMSG_NXTHDR(_msghdr, _pcmsg))
122
123 int LxtSocketEpoll(int Descriptor, int Event, int Timeout);
124
125 void* SocketBlockedReaderThread(void* Arg);
126
127 void* SocketBlockedReaderZeroBufferThread(void* Arg);
128
129 void* SocketBlockedWriterThread(void* Arg);
130
131 struct cmsghdr* SocketGetControlMessage(struct msghdr* MessageHeader, struct cmsghdr* StartControlMessage, int Level, int Type);
132
133 int SocketGetSetBooleanSocketOption(int Socket, int OptionLevel, int OptionName, bool SmallerSizeAllowed);
134
135 char* SocketGetTypeAsString(int Type);
136
137 int SocketStreamClientMsgWaitAll(int ConnectedSocket);
138
139 int SocketStreamServerMsgWaitAll(int AcceptedSocket);
140
141 #endif // _LXT_SOCKET_COMMON_