root / lab4 / .minix-src / include / minix / sockdriver.h @ 14
History | View | Annotate | Download (7.27 KB)
1 |
#ifndef _MINIX_SOCKDRIVER_H
|
---|---|
2 |
#define _MINIX_SOCKDRIVER_H
|
3 |
|
4 |
#include <sys/socket.h> |
5 |
|
6 |
/*
|
7 |
* The maximum sockaddr structure size. All provided address buffers are of
|
8 |
* this size. The socket driver writer must ensure that all the driver's
|
9 |
* sockaddr structures fit in this size, increasing this variable as necessary.
|
10 |
*/
|
11 |
#define SOCKADDR_MAX (UINT8_MAX + 1) |
12 |
|
13 |
/*
|
14 |
* Convenience macro to perform static testing of the above assumption. Usage:
|
15 |
* STATIC_SOCKADDR_MAX_ASSERT(sockaddr_un);
|
16 |
*/
|
17 |
#define STATIC_SOCKADDR_MAX_ASSERT(t) \
|
18 |
typedef int _STATIC_SOCKADDR_MAX_ASSERT_##t[/* CONSTCOND */ \ |
19 |
(sizeof(struct t) <= SOCKADDR_MAX) ? 1 : -1] |
20 |
|
21 |
/*
|
22 |
* The maximum number of I/O vector elements that can be passed to the
|
23 |
* sockdriver_vcopy functions.
|
24 |
*/
|
25 |
#define SOCKDRIVER_IOV_MAX SCPVEC_NR
|
26 |
|
27 |
/* Socket identifier. May also be a negative error code upon call return. */
|
28 |
typedef int32_t sockid_t;
|
29 |
|
30 |
/* Socket request identifier. To be used in struct sockdriver_call only. */
|
31 |
typedef int32_t sockreq_t;
|
32 |
|
33 |
/*
|
34 |
* The following structures are all identity transfer (ixfer) safe, meaning
|
35 |
* that they are guaranteed not to contain pointers.
|
36 |
*/
|
37 |
|
38 |
/*
|
39 |
* Data structure with call information for later call resumption. The socket
|
40 |
* driver may use the sc_endpt and sc_req fields to index and find suspended
|
41 |
* calls for the purpose of cancellation. A provided sc_endpt value will never
|
42 |
* be NONE, so this value may be used to mark the structure as unused, if
|
43 |
* needed. Otherwise, the structure should be copied around as is. Upon
|
44 |
* cancellation, the original call structure must be used to resume the call,
|
45 |
* and not the call structure passed to sdr_cancel.
|
46 |
*/
|
47 |
struct sockdriver_call {
|
48 |
endpoint_t sc_endpt; /* endpoint of caller */
|
49 |
sockreq_t sc_req; /* request identifier */
|
50 |
cp_grant_id_t _sc_grant; /* address storage grant (private) */
|
51 |
size_t _sc_len; /* size of address storage (private) */
|
52 |
}; |
53 |
|
54 |
/*
|
55 |
* Data structure for the requesting party of select requests. The socket
|
56 |
* driver may use the ss_endpt field to index and find suspended select calls.
|
57 |
* A provided ss_endpt value will never be NONE, so this value may be used to
|
58 |
* mark the structure as unused, if needed. For future compatibility, the
|
59 |
* structure should be copied around in its entirety.
|
60 |
*/
|
61 |
struct sockdriver_select {
|
62 |
endpoint_t ss_endpt; /* endpoint of caller */
|
63 |
}; |
64 |
|
65 |
/* Opaque data structure for copying in and out data. */
|
66 |
struct sockdriver_data {
|
67 |
endpoint_t _sd_endpt; /* endpoint of grant owner (private) */
|
68 |
cp_grant_id_t _sd_grant; /* safecopy grant (private) */
|
69 |
size_t _sd_len; /* size of granted area (private) */
|
70 |
}; |
71 |
|
72 |
/*
|
73 |
* Opaque data structure that may store the contents of sockdriver_data more
|
74 |
* compactly in cases where some of its fields are available through other
|
75 |
* means. Practically, this can save memory when storing suspended calls.
|
76 |
*/
|
77 |
struct sockdriver_packed_data {
|
78 |
cp_grant_id_t _spd_grant; /* safecopy grant (private) */
|
79 |
}; |
80 |
|
81 |
/* Function call table for socket drivers. */
|
82 |
struct sockdriver {
|
83 |
sockid_t (* sdr_socket)(int domain, int type, int protocol, |
84 |
endpoint_t user_endpt); |
85 |
int (* sdr_socketpair)(int domain, int type, int protocol, |
86 |
endpoint_t user_endpt, sockid_t id[2]);
|
87 |
int (* sdr_bind)(sockid_t id, const struct sockaddr * __restrict addr, |
88 |
socklen_t addr_len, endpoint_t user_endpt, |
89 |
const struct sockdriver_call * __restrict call); |
90 |
int (* sdr_connect)(sockid_t id,
|
91 |
const struct sockaddr * __restrict addr, socklen_t addr_len, |
92 |
endpoint_t user_endpt, |
93 |
const struct sockdriver_call * __restrict call); |
94 |
int (* sdr_listen)(sockid_t id, int backlog); |
95 |
sockid_t (* sdr_accept)(sockid_t id, struct sockaddr * __restrict addr,
|
96 |
socklen_t * __restrict addr_len, endpoint_t user_endpt, |
97 |
const struct sockdriver_call * __restrict call); |
98 |
int (* sdr_send)(sockid_t id,
|
99 |
const struct sockdriver_data * __restrict data, size_t len, |
100 |
const struct sockdriver_data * __restrict ctl_data, |
101 |
socklen_t ctl_len, const struct sockaddr * __restrict addr, |
102 |
socklen_t addr_len, endpoint_t user_endpt, int flags,
|
103 |
const struct sockdriver_call * __restrict call); |
104 |
int (* sdr_recv)(sockid_t id,
|
105 |
const struct sockdriver_data * __restrict data, size_t len, |
106 |
const struct sockdriver_data * __restrict ctl_data, |
107 |
socklen_t * __restrict ctl_len, struct sockaddr * __restrict addr,
|
108 |
socklen_t * __restrict addr_len, endpoint_t user_endpt, |
109 |
int * __restrict flags,
|
110 |
const struct sockdriver_call * __restrict call); |
111 |
int (* sdr_ioctl)(sockid_t id, unsigned long request, |
112 |
const struct sockdriver_data * __restrict data, |
113 |
endpoint_t user_endpt, |
114 |
const struct sockdriver_call * __restrict call); |
115 |
int (* sdr_setsockopt)(sockid_t id, int level, int name, |
116 |
const struct sockdriver_data * data, socklen_t len); |
117 |
int (* sdr_getsockopt)(sockid_t id, int level, int name, |
118 |
const struct sockdriver_data * __restrict data, |
119 |
socklen_t * __restrict len); |
120 |
int (* sdr_getsockname)(sockid_t id, struct sockaddr * __restrict addr, |
121 |
socklen_t * __restrict addr_len); |
122 |
int (* sdr_getpeername)(sockid_t id, struct sockaddr * __restrict addr, |
123 |
socklen_t * __restrict addr_len); |
124 |
int (* sdr_shutdown)(sockid_t id, int how); |
125 |
int (* sdr_close)(sockid_t id, const struct sockdriver_call * call); |
126 |
void (* sdr_cancel)(sockid_t id, const struct sockdriver_call * call); |
127 |
int (* sdr_select)(sockid_t id, unsigned int ops, |
128 |
const struct sockdriver_select * sel); |
129 |
void (* sdr_alarm)(clock_t stamp);
|
130 |
void (* sdr_other)(const message * m_ptr, int ipc_status); |
131 |
}; |
132 |
|
133 |
/* Functions defined by libsockdriver. */
|
134 |
void sockdriver_announce(void); |
135 |
void sockdriver_process(const struct sockdriver * __restrict sdp, |
136 |
const message * __restrict m_ptr, int ipc_status); |
137 |
void sockdriver_terminate(void); |
138 |
void sockdriver_task(const struct sockdriver * sdp); |
139 |
|
140 |
void sockdriver_reply_generic(const struct sockdriver_call * call, int reply); |
141 |
void sockdriver_reply_accept(const struct sockdriver_call * __restrict call, |
142 |
sockid_t reply, struct sockaddr * __restrict addr, socklen_t addr_len);
|
143 |
void sockdriver_reply_recv(const struct sockdriver_call * __restrict call, |
144 |
int reply, socklen_t ctl_len, struct sockaddr * __restrict addr, |
145 |
socklen_t addr_len, int flags);
|
146 |
void sockdriver_reply_select(const struct sockdriver_select * sel, sockid_t id, |
147 |
int ops);
|
148 |
|
149 |
int sockdriver_copyin(const struct sockdriver_data * __restrict data, |
150 |
size_t off, void * __restrict ptr, size_t len);
|
151 |
int sockdriver_copyout(const struct sockdriver_data * __restrict data, |
152 |
size_t off, const void * __restrict ptr, size_t len); |
153 |
|
154 |
int sockdriver_vcopyin(const struct sockdriver_data * __restrict data, |
155 |
size_t off, const iovec_t * iov, unsigned int iovcnt); |
156 |
int sockdriver_vcopyout(const struct sockdriver_data * __restrict data, |
157 |
size_t off, const iovec_t * iov, unsigned int iovcnt); |
158 |
|
159 |
int sockdriver_copyin_opt(const struct sockdriver_data * __restrict data, |
160 |
void * __restrict ptr, size_t len, socklen_t optlen);
|
161 |
int sockdriver_copyout_opt(const struct sockdriver_data * __restrict data, |
162 |
const void * __restrict ptr, size_t len, |
163 |
socklen_t * __restrict optlen); |
164 |
|
165 |
int sockdriver_pack_data(struct sockdriver_packed_data * pack, |
166 |
const struct sockdriver_call * call, |
167 |
const struct sockdriver_data * data, size_t len); |
168 |
void sockdriver_unpack_data(struct sockdriver_data * data, |
169 |
const struct sockdriver_call * call, |
170 |
const struct sockdriver_packed_data * pack, size_t len); |
171 |
|
172 |
#endif /* !_MINIX_SOCKDRIVER_H */ |