Xenomai API  2.6.4
rtdm.h
Go to the documentation of this file.
1 
47 #ifndef _RTDM_H
48 #define _RTDM_H
49 
50 #ifdef __KERNEL__
51 
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>
57 
58 typedef u32 socklen_t;
59 typedef struct task_struct rtdm_user_info_t;
60 
61 #else /* !__KERNEL__ */
62 
63 #include <fcntl.h>
64 #include <stddef.h>
65 #include <stdint.h>
66 #include <sys/ioctl.h>
67 #include <sys/socket.h>
68 
69 #endif /* !__KERNEL__ */
70 
80 #define RTDM_API_VER 8
81 
83 #define RTDM_API_MIN_COMPAT_VER 6
84 
88 typedef uint64_t nanosecs_abs_t;
89 
94 typedef int64_t nanosecs_rel_t;
95 
101 #define RTDM_TIMEOUT_INFINITE 0
102 
104 #define RTDM_TIMEOUT_NONE (-1)
105 
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
124 /*
125 #define RTDM_CLASS_USB ?
126 #define RTDM_CLASS_FIREWIRE ?
127 #define RTDM_CLASS_INTERBUS ?
128 #define RTDM_CLASS_PROFIBUS ?
129 #define ...
130 */
131 #define RTDM_CLASS_EXPERIMENTAL 224
132 #define RTDM_CLASS_MAX 255
133 
135 #define RTDM_SUBCLASS_GENERIC (-1)
136 
137 #define RTIOC_TYPE_COMMON 0
138 
144 #define RTDM_MAX_DEVNAME_LEN 31
145 
150 typedef struct rtdm_device_info {
153 
156 
161 
165 
170 #define RTDM_PURGE_RX_BUFFER 0x0001
171 #define RTDM_PURGE_TX_BUFFER 0x0002
172 
184 #define RTIOC_DEVICE_INFO \
185  _IOR(RTIOC_TYPE_COMMON, 0x00, struct rtdm_device_info)
186 
191 #define RTIOC_PURGE _IOW(RTIOC_TYPE_COMMON, 0x10, int)
192 
195 /* Internally used for mapping socket functions on IOCTLs */
196 struct _rtdm_getsockopt_args {
197  int level;
198  int optname;
199  void *optval;
200  socklen_t *optlen;
201 };
202 
203 struct _rtdm_setsockopt_args {
204  int level;
205  int optname;
206  const void *optval;
207  socklen_t optlen;
208 };
209 
210 struct _rtdm_getsockaddr_args {
211  struct sockaddr *addr;
212  socklen_t *addrlen;
213 };
214 
215 struct _rtdm_setsockaddr_args {
216  const struct sockaddr *addr;
217  socklen_t addrlen;
218 };
219 
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, \
229  int)
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, \
237  int)
238 
239 #ifdef __KERNEL__
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,
246  size_t nbyte);
247 ssize_t __rt_dev_write(rtdm_user_info_t *user_info, int fd, const void *buf,
248  size_t nbyte);
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);
253 #endif /* __KERNEL__ */
254 
255 /* Define RTDM_NO_DEFAULT_USER_API to switch off the default rt_dev_xxx
256  * interface when providing a customised user API */
257 #ifndef RTDM_NO_DEFAULT_USER_API
258 
259 #ifdef __KERNEL__
260 
261 #define rt_dev_open(path, oflag, ...) \
262  __rt_dev_open(NULL, path, oflag)
263 
264 #define rt_dev_socket(protocol_family, socket_type, protocol) \
265  __rt_dev_socket(NULL, protocol_family, socket_type, protocol)
266 
267 #define rt_dev_close(fd) \
268  __rt_dev_close(NULL, fd)
269 
270 #define rt_dev_ioctl(fd, request, ...) \
271  __rt_dev_ioctl(NULL, fd, request, __VA_ARGS__)
272 
273 #define rt_dev_read(fd, buf, nbyte) \
274  __rt_dev_read(NULL, fd, buf, nbyte)
275 
276 #define rt_dev_write(fd, buf, nbyte) \
277  __rt_dev_write(NULL, fd, buf, nbyte)
278 
279 #define rt_dev_recvmsg(fd, msg, flags) \
280  __rt_dev_recvmsg(NULL, fd, msg, flags)
281 
282 #define rt_dev_sendmsg(fd, msg, flags) \
283  __rt_dev_sendmsg(NULL, fd, msg, flags)
284 
285 static inline ssize_t rt_dev_recvfrom(int fd, void *buf, size_t len, int flags,
286  struct sockaddr *from,
287  socklen_t *fromlen)
288 {
289  struct iovec iov;
290  struct msghdr msg;
291  int ret;
292 
293  iov.iov_base = buf;
294  iov.iov_len = len;
295 
296  msg.msg_name = from;
297  msg.msg_namelen = from ? *fromlen : 0;
298  msg.msg_iov = &iov;
299  msg.msg_iovlen = 1;
300  msg.msg_control = NULL;
301  msg.msg_controllen = 0;
302 
303  ret = rt_dev_recvmsg(fd, &msg, flags);
304  if (ret >= 0 && from)
305  *fromlen = msg.msg_namelen;
306  return ret;
307 }
308 
309 #else /* !__KERNEL__ */
310 
311 #ifdef __cplusplus
312 extern "C" {
313 #endif
314 
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);
323 
324 ssize_t rt_dev_recvfrom(int fd, void *buf, size_t len, int flags,
325  struct sockaddr *from, socklen_t *fromlen);
326 
327 #ifdef __cplusplus
328 }
329 #endif
330 
331 #endif /* !__KERNEL__ */
332 
333 #ifdef __cplusplus
334 extern "C" {
335 #endif
336 
337 static inline ssize_t rt_dev_recv(int fd, void *buf, size_t len, int flags)
338 {
339  return rt_dev_recvfrom(fd, buf, len, flags, NULL, NULL);
340 }
341 
342 static inline ssize_t rt_dev_sendto(int fd, const void *buf, size_t len,
343  int flags, const struct sockaddr *to,
344  socklen_t tolen)
345 {
346  struct iovec iov;
347  struct msghdr msg;
348 
349  iov.iov_base = (void *)buf;
350  iov.iov_len = len;
351 
352  msg.msg_name = (struct sockaddr *)to;
353  msg.msg_namelen = tolen;
354  msg.msg_iov = &iov;
355  msg.msg_iovlen = 1;
356  msg.msg_control = NULL;
357  msg.msg_controllen = 0;
358 
359  return rt_dev_sendmsg(fd, &msg, flags);
360 }
361 
362 static inline ssize_t rt_dev_send(int fd, const void *buf, size_t len,
363  int flags)
364 {
365  return rt_dev_sendto(fd, buf, len, flags, NULL, 0);
366 }
367 
368 static inline int rt_dev_getsockopt(int fd, int level, int optname,
369  void *optval, socklen_t *optlen)
370 {
371  struct _rtdm_getsockopt_args args =
372  { level, optname, optval, optlen };
373 
374  return rt_dev_ioctl(fd, _RTIOC_GETSOCKOPT, &args);
375 }
376 
377 static inline int rt_dev_setsockopt(int fd, int level, int optname,
378  const void *optval, socklen_t optlen)
379 {
380  struct _rtdm_setsockopt_args args =
381  { level, optname, (void *)optval, optlen };
382 
383  return rt_dev_ioctl(fd, _RTIOC_SETSOCKOPT, &args);
384 }
385 
386 static inline int rt_dev_bind(int fd, const struct sockaddr *my_addr,
387  socklen_t addrlen)
388 {
389  struct _rtdm_setsockaddr_args args = { my_addr, addrlen };
390 
391  return rt_dev_ioctl(fd, _RTIOC_BIND, &args);
392 }
393 
394 static inline int rt_dev_connect(int fd, const struct sockaddr *serv_addr,
395  socklen_t addrlen)
396 {
397  struct _rtdm_setsockaddr_args args = { serv_addr, addrlen };
398 
399  return rt_dev_ioctl(fd, _RTIOC_CONNECT, &args);
400 }
401 
402 static inline int rt_dev_listen(int fd, int backlog)
403 {
404  return rt_dev_ioctl(fd, _RTIOC_LISTEN, backlog);
405 }
406 
407 static inline int rt_dev_accept(int fd, struct sockaddr *addr,
408  socklen_t *addrlen)
409 {
410  struct _rtdm_getsockaddr_args args = { addr, addrlen };
411 
412  return rt_dev_ioctl(fd, _RTIOC_ACCEPT, &args);
413 }
414 
415 static inline int rt_dev_getsockname(int fd, struct sockaddr *name,
416  socklen_t *namelen)
417 {
418  struct _rtdm_getsockaddr_args args = { name, namelen };
419 
420  return rt_dev_ioctl(fd, _RTIOC_GETSOCKNAME, &args);
421 }
422 
423 static inline int rt_dev_getpeername(int fd, struct sockaddr *name,
424  socklen_t *namelen)
425 {
426  struct _rtdm_getsockaddr_args args = { name, namelen };
427 
428  return rt_dev_ioctl(fd, _RTIOC_GETPEERNAME, &args);
429 }
430 
431 static inline int rt_dev_shutdown(int fd, int how)
432 {
433  return rt_dev_ioctl(fd, _RTIOC_SHUTDOWN, how);
434 }
435 
436 #ifdef __cplusplus
437 }
438 #endif
439 
440 #endif /* RTDM_NO_DEFAULT_USER_API */
441 
442 #endif /* _RTDM_H */