52 #include <linux/types.h>
53 #include <linux/fcntl.h>
54 #include <linux/ioctl.h>
55 #include <linux/sched.h>
56 #include <linux/socket.h>
58 typedef u32 socklen_t;
59 typedef struct task_struct rtdm_user_info_t;
66 #include <sys/ioctl.h>
67 #include <sys/socket.h>
80 #define RTDM_API_VER 8
83 #define RTDM_API_MIN_COMPAT_VER 6
101 #define RTDM_TIMEOUT_INFINITE 0
104 #define RTDM_TIMEOUT_NONE (-1)
117 #define RTDM_CLASS_PARPORT 1
118 #define RTDM_CLASS_SERIAL 2
119 #define RTDM_CLASS_CAN 3
120 #define RTDM_CLASS_NETWORK 4
121 #define RTDM_CLASS_RTMAC 5
122 #define RTDM_CLASS_TESTING 6
123 #define RTDM_CLASS_RTIPC 7
131 #define RTDM_CLASS_EXPERIMENTAL 224
132 #define RTDM_CLASS_MAX 255
135 #define RTDM_SUBCLASS_GENERIC (-1)
137 #define RTIOC_TYPE_COMMON 0
144 #define RTDM_MAX_DEVNAME_LEN 31
170 #define RTDM_PURGE_RX_BUFFER 0x0001
171 #define RTDM_PURGE_TX_BUFFER 0x0002
184 #define RTIOC_DEVICE_INFO \
185 _IOR(RTIOC_TYPE_COMMON, 0x00, struct rtdm_device_info)
191 #define RTIOC_PURGE _IOW(RTIOC_TYPE_COMMON, 0x10, int)
196 struct _rtdm_getsockopt_args {
203 struct _rtdm_setsockopt_args {
210 struct _rtdm_getsockaddr_args {
211 struct sockaddr *addr;
215 struct _rtdm_setsockaddr_args {
216 const struct sockaddr *addr;
220 #define _RTIOC_GETSOCKOPT _IOW(RTIOC_TYPE_COMMON, 0x20, \
221 struct _rtdm_getsockopt_args)
222 #define _RTIOC_SETSOCKOPT _IOW(RTIOC_TYPE_COMMON, 0x21, \
223 struct _rtdm_setsockopt_args)
224 #define _RTIOC_BIND _IOW(RTIOC_TYPE_COMMON, 0x22, \
225 struct _rtdm_setsockaddr_args)
226 #define _RTIOC_CONNECT _IOW(RTIOC_TYPE_COMMON, 0x23, \
227 struct _rtdm_setsockaddr_args)
228 #define _RTIOC_LISTEN _IOW(RTIOC_TYPE_COMMON, 0x24, \
230 #define _RTIOC_ACCEPT _IOW(RTIOC_TYPE_COMMON, 0x25, \
231 struct _rtdm_getsockaddr_args)
232 #define _RTIOC_GETSOCKNAME _IOW(RTIOC_TYPE_COMMON, 0x26, \
233 struct _rtdm_getsockaddr_args)
234 #define _RTIOC_GETPEERNAME _IOW(RTIOC_TYPE_COMMON, 0x27, \
235 struct _rtdm_getsockaddr_args)
236 #define _RTIOC_SHUTDOWN _IOW(RTIOC_TYPE_COMMON, 0x28, \
240 int __rt_dev_open(rtdm_user_info_t *user_info,
const char *path,
int oflag);
241 int __rt_dev_socket(rtdm_user_info_t *user_info,
int protocol_family,
242 int socket_type,
int protocol);
243 int __rt_dev_close(rtdm_user_info_t *user_info,
int fd);
244 int __rt_dev_ioctl(rtdm_user_info_t *user_info,
int fd,
int request, ...);
245 ssize_t __rt_dev_read(rtdm_user_info_t *user_info,
int fd,
void *buf,
247 ssize_t __rt_dev_write(rtdm_user_info_t *user_info,
int fd,
const void *buf,
249 ssize_t __rt_dev_recvmsg(rtdm_user_info_t *user_info,
int fd,
250 struct msghdr *msg,
int flags);
251 ssize_t __rt_dev_sendmsg(rtdm_user_info_t *user_info,
int fd,
252 const struct msghdr *msg,
int flags);
257 #ifndef RTDM_NO_DEFAULT_USER_API
261 #define rt_dev_open(path, oflag, ...) \
262 __rt_dev_open(NULL, path, oflag)
264 #define rt_dev_socket(protocol_family, socket_type, protocol) \
265 __rt_dev_socket(NULL, protocol_family, socket_type, protocol)
267 #define rt_dev_close(fd) \
268 __rt_dev_close(NULL, fd)
270 #define rt_dev_ioctl(fd, request, ...) \
271 __rt_dev_ioctl(NULL, fd, request, __VA_ARGS__)
273 #define rt_dev_read(fd, buf, nbyte) \
274 __rt_dev_read(NULL, fd, buf, nbyte)
276 #define rt_dev_write(fd, buf, nbyte) \
277 __rt_dev_write(NULL, fd, buf, nbyte)
279 #define rt_dev_recvmsg(fd, msg, flags) \
280 __rt_dev_recvmsg(NULL, fd, msg, flags)
282 #define rt_dev_sendmsg(fd, msg, flags) \
283 __rt_dev_sendmsg(NULL, fd, msg, flags)
285 static inline ssize_t rt_dev_recvfrom(
int fd,
void *buf,
size_t len,
int flags,
286 struct sockaddr *from,
297 msg.msg_namelen = from ? *fromlen : 0;
300 msg.msg_control = NULL;
301 msg.msg_controllen = 0;
303 ret = rt_dev_recvmsg(fd, &msg, flags);
304 if (ret >= 0 && from)
305 *fromlen = msg.msg_namelen;
315 int rt_dev_open(
const char *path,
int oflag, ...);
316 int rt_dev_socket(
int protocol_family,
int socket_type,
int protocol);
317 int rt_dev_close(
int fd);
318 int rt_dev_ioctl(
int fd,
int request, ...);
319 ssize_t rt_dev_read(
int fd,
void *buf,
size_t nbyte);
320 ssize_t rt_dev_write(
int fd,
const void *buf,
size_t nbyte);
321 ssize_t rt_dev_recvmsg(
int fd,
struct msghdr *msg,
int flags);
322 ssize_t rt_dev_sendmsg(
int fd,
const struct msghdr *msg,
int flags);
324 ssize_t rt_dev_recvfrom(
int fd,
void *buf,
size_t len,
int flags,
325 struct sockaddr *from, socklen_t *fromlen);
337 static inline ssize_t
rt_dev_recv(
int fd,
void *buf,
size_t len,
int flags)
339 return rt_dev_recvfrom(fd, buf, len, flags, NULL, NULL);
342 static inline ssize_t
rt_dev_sendto(
int fd,
const void *buf,
size_t len,
343 int flags,
const struct sockaddr *to,
349 iov.iov_base = (
void *)buf;
352 msg.msg_name = (
struct sockaddr *)to;
353 msg.msg_namelen = tolen;
356 msg.msg_control = NULL;
357 msg.msg_controllen = 0;
359 return rt_dev_sendmsg(fd, &msg, flags);
362 static inline ssize_t
rt_dev_send(
int fd,
const void *buf,
size_t len,
369 void *optval, socklen_t *optlen)
371 struct _rtdm_getsockopt_args args =
372 { level, optname, optval, optlen };
374 return rt_dev_ioctl(fd, _RTIOC_GETSOCKOPT, &args);
378 const void *optval, socklen_t optlen)
380 struct _rtdm_setsockopt_args args =
381 { level, optname, (
void *)optval, optlen };
383 return rt_dev_ioctl(fd, _RTIOC_SETSOCKOPT, &args);
386 static inline int rt_dev_bind(
int fd,
const struct sockaddr *my_addr,
389 struct _rtdm_setsockaddr_args args = { my_addr, addrlen };
391 return rt_dev_ioctl(fd, _RTIOC_BIND, &args);
394 static inline int rt_dev_connect(
int fd,
const struct sockaddr *serv_addr,
397 struct _rtdm_setsockaddr_args args = { serv_addr, addrlen };
399 return rt_dev_ioctl(fd, _RTIOC_CONNECT, &args);
404 return rt_dev_ioctl(fd, _RTIOC_LISTEN, backlog);
407 static inline int rt_dev_accept(
int fd,
struct sockaddr *addr,
410 struct _rtdm_getsockaddr_args args = { addr, addrlen };
412 return rt_dev_ioctl(fd, _RTIOC_ACCEPT, &args);
418 struct _rtdm_getsockaddr_args args = { name, namelen };
420 return rt_dev_ioctl(fd, _RTIOC_GETSOCKNAME, &args);
426 struct _rtdm_getsockaddr_args args = { name, namelen };
428 return rt_dev_ioctl(fd, _RTIOC_GETPEERNAME, &args);
433 return rt_dev_ioctl(fd, _RTIOC_SHUTDOWN, how);