export_servicelist, localhost handling, managed socket connect bugfix
[corutils.git] / libcor.h
blobf1d7aee40e7781362ba91e165a32e216686e01ab
1 /**
2 * Connection oriented routing user space utils
3 * Copyright (C) 2009-2011
4 * Authors:
5 * Michael Blizek
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 * 02110-1301, USA.
23 #include <stdlib.h>
24 #include <linux/types.h>
25 #include <sys/socket.h>
28 #define CRD_KTU_CONNECT 1
30 #define CRD_UTK_UP 1
32 * CRD_KTU_CONNECT[4] length[4] flags[8] addrlen[4] addr[addrlen]
37 #define CRD_UTK_CONNECTERROR 2
39 * CRD_KTU_CONNECT[4] length[4] cookie[8] error[4]
44 #define AF_COR 40
45 #define PF_COR AF_COR
47 #define PROTO_COR_RAW 0
48 #define PROTO_COR_RDEAMON 1
50 typedef __u16 __be16;
52 #define SOCKADDRTYPE_PORT 1
53 #define SOCKADDRTYPE_ADDRPORT 2
54 struct cor_sockaddr {
55 __SOCKADDR_COMMON (sin_); /* 2 bytes */
57 __be16 port;
58 char addr[64];
61 #define RESUME_TYPE_NONE 0
62 #define RESUME_TYPE_READ 1
63 #define RESUME_TYPE_WRITE 2
65 #define RESUME_READ_FUNC_NONE 0
66 #define RESUME_READ_FUNC_RESP 1
67 #define RESUME_READ_FUNC_NEIGHLIST 2
68 #define RESUME_READ_FUNC_SERVICELIST 3
69 #define RESUME_READ_FUNC_RDSOCK_CMD 4
71 #define NEIGHLIST_MAX_FIELDS 256
72 #define ADDR_MAX_LEN 1024
73 #define WRITE_BUF_SIZE 1024
75 struct listneigh_field {
76 __u16 field;
77 __u16 len;
80 struct libcor_nonblock_resumeinfo_resp{
81 int fd;
83 __u8 state;
84 __u8 respcode;
86 __u16 reasoncode;
87 __u32 reasonlen;
90 struct libcor_nonblock_resumeinfo_neighlist{
91 int fd;
93 void *ptr;
94 void (*init)(void *ptr, __u32 numneighs);
95 void (*next_neigh)(void *ptr, __u32 addrlen, char *addr);
98 __u8 state;
100 __u8 respcode;
101 __u32 len;
102 __u32 numneighs;
103 __u32 numfields;
105 struct listneigh_field fields[NEIGHLIST_MAX_FIELDS];
107 __u64 u;
108 __u64 v;
110 __u32 fieldlen;
112 char addr[ADDR_MAX_LEN];
113 __u32 addrlen;
114 char latency;
117 struct libcor_nonblock_resumeinfo_servicelist{
118 int fd;
120 void *ptr;
121 void (*init)(void *ptr, __u32 numservices);
122 void (*next_service)(void *ptr, __be16 port);
124 __u8 state;
126 __u8 respcode;
127 __u32 len;
128 __u32 numservices;
130 __u64 q;
131 __be16 port;
134 struct libcor_nonblock_resumeinfo_rdsockcmd{
135 int fd;
137 __u8 state;
139 char buf[8];
141 __u32 cmd;
142 __u32 cmddatalen;
143 char *cmddata;
146 struct libcor_nonblock_resumeinfo{
147 __u8 type;
149 union{
150 struct{
151 struct{
152 __u8 state;
154 int fd;
155 char *buf;
156 __u32 len;
157 __u32 *maxread;
159 __u32 totalread;
160 }read_fully;
162 struct{
163 __u8 state;
165 int fd;
166 __u32 len;
167 __u32 discarded;
168 }read_discard;
170 struct{
171 __u8 state;
173 int fd;
174 __u32 *len;
175 __u32 *maxread;
177 char buf[4];
178 __u32 read;
179 }read_len;
181 __u8 functype;
182 union{
183 struct libcor_nonblock_resumeinfo_resp resp;
185 struct libcor_nonblock_resumeinfo_neighlist
186 neighlist;
188 struct libcor_nonblock_resumeinfo_servicelist
189 servicelist;
191 struct libcor_nonblock_resumeinfo_rdsockcmd
192 rdsock_cmd;
193 }funcdata;
194 }read;
196 struct{
197 int fd;
199 __u32 len;
200 __u32 totalsent;
202 char buf[WRITE_BUF_SIZE];
203 }write;
204 }data;
207 #define RC_OK 0
208 #define RC_CONNBROKEN 1
209 #define RC_WOULDBLOCK 2
211 extern int resume_send(int fd, struct libcor_nonblock_resumeinfo *nr);
213 static inline int resume_send_ifneeded(int fd,
214 struct libcor_nonblock_resumeinfo *nr)
216 if (nr->type != RESUME_TYPE_WRITE)
217 return RC_OK;
219 return resume_send(fd, nr);
222 extern int read_resp_nonblock(int fd, struct libcor_nonblock_resumeinfo *nr);
224 extern int read_resp(int fd);
226 extern int send_connect_neigh_nonblock(int fd,
227 struct libcor_nonblock_resumeinfo *nr,
228 __u32 addrlen, char *addr);
230 extern int send_connect_neigh(int fd, __u32 addrlen, char *addr);
232 extern int send_connect_port_nonblock(int fd,
233 struct libcor_nonblock_resumeinfo *nr,
234 __be16 port);
236 extern int send_connect_port(int fd, __be16 port);
238 extern int send_list_services_nonblock(int fd,
239 struct libcor_nonblock_resumeinfo *nr);
241 extern int send_list_services(int fd);
243 extern int read_service_list_nonblock(int fd,
244 struct libcor_nonblock_resumeinfo *nr, void *ptr,
245 void (*init)(void *ptr, __u32 numservices),
246 void (*next_service)(void *ptr, __be16 port));
248 extern int read_service_list(int fd, void *ptr,
249 void (*init)(void *ptr, __u32 numservices),
250 void (*next_service)(void *ptr, __be16 port));
252 extern int send_list_neigh_nonblock(int fd,
253 struct libcor_nonblock_resumeinfo *nr);
255 extern int send_list_neigh(int fd);
257 extern int read_neigh_list_nonblock(int fd,
258 struct libcor_nonblock_resumeinfo *nr,
259 void *ptr,
260 void (*init)(void *ptr, __u32 numneighs),
261 void (*next_neigh)(void *ptr, __u32 addrlen, char *addr));
263 extern int read_neigh_list(int fd, void *ptr,
264 void (*init)(void *ptr, __u32 numneighs),
265 void (*next_neigh)(void *ptr, __u32 addrlen, char *addr));
268 #define SOL_COR 280
270 #define COR_PASS_ON_CLOSE 1
272 #define CONNECTERROR_ACCES 1
273 #define CONNECTERROR_NETUNREACH 2
274 #define CONNECTERROR_TIMEDOUT 3
275 #define CONNECTERROR_REFUSED 4
277 extern int pass_socket(int fd, __u64 cookie);
279 extern int send_rdsock_connecterror_nonblock(int fd,
280 struct libcor_nonblock_resumeinfo *nr,
281 __u64 cookie, __u32 error);
283 extern int send_rdsock_connecterror(int fd, __u64 cookie, __u32 error);
285 extern int send_rdsock_up_nonblock(int fd,
286 struct libcor_nonblock_resumeinfo *nr,
287 char *addr, __u32 addrlen);
289 extern int send_rdsock_up(int fd, char *addr, __u32 addrlen);
291 struct rdsock_cmd{
292 __u32 cmd;
293 char *cmddata;
294 __u32 cmddatalen;
297 extern int parse_rdsock_connect(void *ptr, struct rdsock_cmd *cmd,
298 int (*proc_connect)(void *ptr, __u64 cookie,
299 struct cor_sockaddr *addr));
301 static inline void free_rdsockcmd_data(struct rdsock_cmd *cmd)
303 free(cmd->cmddata);
304 cmd->cmddata = 0;
307 extern int read_rdsock_cmd_nonblock(int fd,
308 struct libcor_nonblock_resumeinfo *nr,
309 struct rdsock_cmd *cmd);
311 extern int read_rdsock_cmd(int fd, struct rdsock_cmd *cmd);