2 * Connection oriented routing user space utils
3 * Copyright (C) 2009-2011
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
24 #include <linux/types.h>
25 #include <sys/socket.h>
28 #define CRD_KTU_SUPPORTEDVERSIONS 1
29 #define CRD_KTU_CONNECT 2
31 #define CRD_UTK_VERSION 1
33 * CRD_UTK_VERSION[4] length[4] version[4]
39 * CRD_UTK_UP[4] length[4] flags[8] addrlen[4] addr[addrlen]
44 #define CRD_UTK_CONNECTERROR 3
46 * CRD_UTK_CONNECTERROR[4] length[4] cookie[8] error[4]
54 #define PROTO_COR_RAW 0
55 #define PROTO_COR_RDEAMON 1
59 #define SOCKADDRTYPE_PORT 1
60 #define SOCKADDRTYPE_ADDRPORT 2
62 __SOCKADDR_COMMON (sin_
); /* 2 bytes */
68 #define RESUME_TYPE_NONE 0
69 #define RESUME_TYPE_READ 1
70 #define RESUME_TYPE_WRITE 2
72 #define RESUME_READ_FUNC_NONE 0
73 #define RESUME_READ_FUNC_RESP 1
74 #define RESUME_READ_FUNC_NEIGHLIST 2
75 #define RESUME_READ_FUNC_SERVICELIST 3
76 #define RESUME_READ_FUNC_RDSOCK_CMD 4
78 #define NEIGHLIST_MAX_FIELDS 256
79 #define ADDR_MAX_LEN 1024
80 #define WRITE_BUF_SIZE 1024
82 struct listneigh_field
{
87 struct libcor_nonblock_resumeinfo_resp
{
97 struct libcor_nonblock_resumeinfo_neighlist
{
101 void (*init
)(void *ptr
, __u32 numneighs
);
102 void (*next_neigh
)(void *ptr
, __u32 addrlen
, char *addr
);
112 struct listneigh_field fields
[NEIGHLIST_MAX_FIELDS
];
119 char addr
[ADDR_MAX_LEN
];
124 struct libcor_nonblock_resumeinfo_servicelist
{
128 void (*init
)(void *ptr
, __u32 numservices
);
129 void (*next_service
)(void *ptr
, __be16 port
);
141 struct libcor_nonblock_resumeinfo_rdsockcmd
{
153 struct libcor_nonblock_resumeinfo
{
190 struct libcor_nonblock_resumeinfo_resp resp
;
192 struct libcor_nonblock_resumeinfo_neighlist
195 struct libcor_nonblock_resumeinfo_servicelist
198 struct libcor_nonblock_resumeinfo_rdsockcmd
209 char buf
[WRITE_BUF_SIZE
];
215 #define RC_CONNBROKEN 1
216 #define RC_WOULDBLOCK 2
218 extern int resume_send(int fd
, struct libcor_nonblock_resumeinfo
*nr
);
220 static inline int resume_send_ifneeded(int fd
,
221 struct libcor_nonblock_resumeinfo
*nr
)
223 if (nr
->type
!= RESUME_TYPE_WRITE
)
226 return resume_send(fd
, nr
);
229 extern int read_resp_nonblock(int fd
, struct libcor_nonblock_resumeinfo
*nr
);
231 extern int read_resp(int fd
);
233 extern int send_connect_neigh_nonblock(int fd
,
234 struct libcor_nonblock_resumeinfo
*nr
,
235 __u32 addrlen
, char *addr
);
237 extern int send_connect_neigh(int fd
, __u32 addrlen
, char *addr
);
239 extern int send_connect_port_nonblock(int fd
,
240 struct libcor_nonblock_resumeinfo
*nr
,
243 extern int send_connect_port(int fd
, __be16 port
);
245 extern int send_list_services_nonblock(int fd
,
246 struct libcor_nonblock_resumeinfo
*nr
);
248 extern int send_list_services(int fd
);
250 extern int read_service_list_nonblock(int fd
,
251 struct libcor_nonblock_resumeinfo
*nr
, void *ptr
,
252 void (*init
)(void *ptr
, __u32 numservices
),
253 void (*next_service
)(void *ptr
, __be16 port
));
255 extern int read_service_list(int fd
, void *ptr
,
256 void (*init
)(void *ptr
, __u32 numservices
),
257 void (*next_service
)(void *ptr
, __be16 port
));
259 extern int send_list_neigh_nonblock(int fd
,
260 struct libcor_nonblock_resumeinfo
*nr
);
262 extern int send_list_neigh(int fd
);
264 extern int read_neigh_list_nonblock(int fd
,
265 struct libcor_nonblock_resumeinfo
*nr
,
267 void (*init
)(void *ptr
, __u32 numneighs
),
268 void (*next_neigh
)(void *ptr
, __u32 addrlen
, char *addr
));
270 extern int read_neigh_list(int fd
, void *ptr
,
271 void (*init
)(void *ptr
, __u32 numneighs
),
272 void (*next_neigh
)(void *ptr
, __u32 addrlen
, char *addr
));
277 #define COR_PASS_ON_CLOSE 1
279 #define CONNECTERROR_ACCES 1
280 #define CONNECTERROR_NETUNREACH 2
281 #define CONNECTERROR_TIMEDOUT 3
282 #define CONNECTERROR_REFUSED 4
284 extern int pass_socket(int fd
, __u64 cookie
);
286 extern int send_rdsock_version_nonblock(int fd
,
287 struct libcor_nonblock_resumeinfo
*nr
, __u32 version
);
289 extern int send_rdsock_version(int fd
, __u32 version
);
291 extern int send_rdsock_up_nonblock(int fd
,
292 struct libcor_nonblock_resumeinfo
*nr
,
293 char *addr
, __u32 addrlen
);
295 extern int send_rdsock_up(int fd
, char *addr
, __u32 addrlen
);
297 extern int send_rdsock_connecterror_nonblock(int fd
,
298 struct libcor_nonblock_resumeinfo
*nr
,
299 __u64 cookie
, __u32 error
);
301 extern int send_rdsock_connecterror(int fd
, __u64 cookie
, __u32 error
);
309 extern int parse_rdsock_supported_versions(struct rdsock_cmd
*cmd
,
310 __u32
*versionmin
, __u32
*versionmax
);
312 extern int parse_rdsock_connect(void *ptr
, struct rdsock_cmd
*cmd
,
313 int (*proc_connect
)(void *ptr
, __u64 cookie
,
314 struct cor_sockaddr
*addr
));
316 static inline void free_rdsockcmd_data(struct rdsock_cmd
*cmd
)
322 extern int read_rdsock_cmd_nonblock(int fd
,
323 struct libcor_nonblock_resumeinfo
*nr
,
324 struct rdsock_cmd
*cmd
);
326 extern int read_rdsock_cmd(int fd
, struct rdsock_cmd
*cmd
);