include/rtdm/rtdm.h

Go to the documentation of this file.
00001 
00047 #ifndef _RTDM_H
00048 #define _RTDM_H
00049 
00050 #ifdef __KERNEL__
00051 
00052 #include <linux/fcntl.h>
00053 #include <linux/ioctl.h>
00054 #include <linux/sched.h>
00055 #include <linux/socket.h>
00056 
00057 typedef size_t socklen_t;
00058 typedef struct task_struct rtdm_user_info_t;
00059 
00060 #else /* !__KERNEL__ */
00061 
00062 #include <fcntl.h>
00063 #include <stdint.h>
00064 #include <sys/ioctl.h>
00065 #include <sys/socket.h>
00066 
00067 #endif /* !__KERNEL__ */
00068 
00078 #define RTDM_API_VER                    6
00079 
00081 #define RTDM_API_MIN_COMPAT_VER         6
00082 
00086 typedef uint64_t nanosecs_abs_t;
00087 
00092 typedef int64_t nanosecs_rel_t;
00093 
00099 #define RTDM_TIMEOUT_INFINITE           0
00100 
00102 #define RTDM_TIMEOUT_NONE               (-1)
00103 
00115 #define RTDM_CLASS_PARPORT              1
00116 #define RTDM_CLASS_SERIAL               2
00117 #define RTDM_CLASS_CAN                  3
00118 #define RTDM_CLASS_NETWORK              4
00119 #define RTDM_CLASS_RTMAC                5
00120 #define RTDM_CLASS_TESTING              6
00121 /*
00122 #define RTDM_CLASS_USB                  ?
00123 #define RTDM_CLASS_FIREWIRE             ?
00124 #define RTDM_CLASS_INTERBUS             ?
00125 #define RTDM_CLASS_PROFIBUS             ?
00126 #define ...
00127 */
00128 #define RTDM_CLASS_EXPERIMENTAL         224
00129 #define RTDM_CLASS_MAX                  255
00130 
00132 #define RTDM_SUBCLASS_GENERIC           (-1)
00133 
00134 #define RTIOC_TYPE_COMMON               0
00135 
00141 #define RTDM_MAX_DEVNAME_LEN            31
00142 
00147 typedef struct rtdm_device_info {
00149         int device_flags;
00150 
00152         int device_class;
00153 
00157         int device_sub_class;
00158 
00160         int profile_version;
00161 } rtdm_device_info_t;
00162 
00167 #define RTDM_PURGE_RX_BUFFER            0x0001
00168 #define RTDM_PURGE_TX_BUFFER            0x0002
00169 
00181 #define RTIOC_DEVICE_INFO \
00182         _IOR(RTIOC_TYPE_COMMON, 0x00, struct rtdm_device_info)
00183 
00188 #define RTIOC_PURGE             _IOW(RTIOC_TYPE_COMMON, 0x10, int)
00189 
00192 /* Internally used for mapping socket functions on IOCTLs */
00193 struct _rtdm_getsockopt_args {
00194         int level;
00195         int optname;
00196         void *optval;
00197         socklen_t *optlen;
00198 };
00199 
00200 struct _rtdm_setsockopt_args {
00201         int level;
00202         int optname;
00203         const void *optval;
00204         socklen_t optlen;
00205 };
00206 
00207 struct _rtdm_getsockaddr_args {
00208         struct sockaddr *addr;
00209         socklen_t *addrlen;
00210 };
00211 
00212 struct _rtdm_setsockaddr_args {
00213         const struct sockaddr *addr;
00214         socklen_t addrlen;
00215 };
00216 
00217 #define _RTIOC_GETSOCKOPT       _IOW(RTIOC_TYPE_COMMON, 0x20,           \
00218                                      struct _rtdm_getsockopt_args)
00219 #define _RTIOC_SETSOCKOPT       _IOW(RTIOC_TYPE_COMMON, 0x21,           \
00220                                      struct _rtdm_setsockopt_args)
00221 #define _RTIOC_BIND             _IOW(RTIOC_TYPE_COMMON, 0x22,           \
00222                                      struct _rtdm_setsockaddr_args)
00223 #define _RTIOC_CONNECT          _IOW(RTIOC_TYPE_COMMON, 0x23,           \
00224                                      struct _rtdm_setsockaddr_args)
00225 #define _RTIOC_LISTEN           _IOW(RTIOC_TYPE_COMMON, 0x24,           \
00226                                      int)
00227 #define _RTIOC_ACCEPT           _IOW(RTIOC_TYPE_COMMON, 0x25,           \
00228                                      struct _rtdm_getsockaddr_args)
00229 #define _RTIOC_GETSOCKNAME      _IOW(RTIOC_TYPE_COMMON, 0x26,           \
00230                                      struct _rtdm_getsockaddr_args)
00231 #define _RTIOC_GETPEERNAME      _IOW(RTIOC_TYPE_COMMON, 0x27,           \
00232                                      struct _rtdm_getsockaddr_args)
00233 #define _RTIOC_SHUTDOWN         _IOW(RTIOC_TYPE_COMMON, 0x28,           \
00234                                      int)
00235 
00236 #ifdef __KERNEL__
00237 int __rt_dev_open(rtdm_user_info_t *user_info, const char *path, int oflag);
00238 int __rt_dev_socket(rtdm_user_info_t *user_info, int protocol_family,
00239                     int socket_type, int protocol);
00240 int __rt_dev_close(rtdm_user_info_t *user_info, int fd);
00241 int __rt_dev_ioctl(rtdm_user_info_t *user_info, int fd, int request, ...);
00242 ssize_t __rt_dev_read(rtdm_user_info_t *user_info, int fd, void *buf,
00243                       size_t nbyte);
00244 ssize_t __rt_dev_write(rtdm_user_info_t *user_info, int fd, const void *buf,
00245                        size_t nbyte);
00246 ssize_t __rt_dev_recvmsg(rtdm_user_info_t *user_info, int fd,
00247                          struct msghdr *msg, int flags);
00248 ssize_t __rt_dev_sendmsg(rtdm_user_info_t *user_info, int fd,
00249                          const struct msghdr *msg, int flags);
00250 struct xnselector;
00251 int __rt_dev_select_bind(rtdm_user_info_t *user_info, int fd,
00252                          struct xnselector *selector,
00253                          unsigned type, unsigned index);
00254 #endif /* __KERNEL__ */
00255 
00256 /* Define RTDM_NO_DEFAULT_USER_API to switch off the default rt_dev_xxx
00257  * interface when providing a customised user API */
00258 #ifndef RTDM_NO_DEFAULT_USER_API
00259 
00260 #ifdef __KERNEL__
00261 
00262 #define rt_dev_open(path, oflag, ...)                           \
00263         __rt_dev_open(NULL, path, oflag)
00264 
00265 #define rt_dev_socket(protocol_family, socket_type, protocol)   \
00266         __rt_dev_socket(NULL, protocol_family, socket_type, protocol)
00267 
00268 #define rt_dev_close(fd)                                        \
00269         __rt_dev_close(NULL, fd)
00270 
00271 #define rt_dev_ioctl(fd, request, ...)                          \
00272         __rt_dev_ioctl(NULL, fd, request, __VA_ARGS__)
00273 
00274 #define rt_dev_read(fd, buf, nbyte)                             \
00275         __rt_dev_read(NULL, fd, buf, nbyte)
00276 
00277 #define rt_dev_write(fd, buf, nbyte)                            \
00278         __rt_dev_write(NULL, fd, buf, nbyte)
00279 
00280 #define rt_dev_recvmsg(fd, msg, flags)                          \
00281         __rt_dev_recvmsg(NULL, fd, msg, flags)
00282 
00283 #define rt_dev_sendmsg(fd, msg, flags)                          \
00284         __rt_dev_sendmsg(NULL, fd, msg, flags)
00285 
00286 static inline ssize_t rt_dev_recvfrom(int fd, void *buf, size_t len, int flags,
00287                                       struct sockaddr *from,
00288                                       socklen_t *fromlen)
00289 {
00290         struct iovec iov;
00291         struct msghdr msg;
00292         int ret;
00293 
00294         iov.iov_base = buf;
00295         iov.iov_len = len;
00296 
00297         msg.msg_name = from;
00298         msg.msg_namelen = from ? *fromlen : 0;
00299         msg.msg_iov = &iov;
00300         msg.msg_iovlen = 1;
00301         msg.msg_control = NULL;
00302         msg.msg_controllen = 0;
00303 
00304         ret = rt_dev_recvmsg(fd, &msg, flags);
00305         if (ret >= 0 && from)
00306                 *fromlen = msg.msg_namelen;
00307         return ret;
00308 }
00309 
00310 #else /* !__KERNEL__ */
00311 
00312 #ifdef __cplusplus
00313 extern "C" {
00314 #endif
00315 
00316 int rt_dev_open(const char *path, int oflag, ...);
00317 int rt_dev_socket(int protocol_family, int socket_type, int protocol);
00318 int rt_dev_close(int fd);
00319 int rt_dev_ioctl(int fd, int request, ...);
00320 ssize_t rt_dev_read(int fd, void *buf, size_t nbyte);
00321 ssize_t rt_dev_write(int fd, const void *buf, size_t nbyte);
00322 ssize_t rt_dev_recvmsg(int fd, struct msghdr *msg, int flags);
00323 ssize_t rt_dev_sendmsg(int fd, const struct msghdr *msg, int flags);
00324 
00325 ssize_t rt_dev_recvfrom(int fd, void *buf, size_t len, int flags,
00326                         struct sockaddr *from, socklen_t *fromlen);
00327 
00328 #ifdef __cplusplus
00329 }
00330 #endif
00331 
00332 #endif /* !__KERNEL__ */
00333 
00334 #ifdef __cplusplus
00335 extern "C" {
00336 #endif
00337 
00338 static inline ssize_t rt_dev_recv(int fd, void *buf, size_t len, int flags)
00339 {
00340         return rt_dev_recvfrom(fd, buf, len, flags, NULL, NULL);
00341 }
00342 
00343 static inline ssize_t rt_dev_sendto(int fd, const void *buf, size_t len,
00344                                     int flags, const struct sockaddr *to,
00345                                     socklen_t tolen)
00346 {
00347         struct iovec iov;
00348         struct msghdr msg;
00349 
00350         iov.iov_base = (void *)buf;
00351         iov.iov_len = len;
00352 
00353         msg.msg_name = (struct sockaddr *)to;
00354         msg.msg_namelen = tolen;
00355         msg.msg_iov = &iov;
00356         msg.msg_iovlen = 1;
00357         msg.msg_control = NULL;
00358         msg.msg_controllen = 0;
00359 
00360         return rt_dev_sendmsg(fd, &msg, flags);
00361 }
00362 
00363 static inline ssize_t rt_dev_send(int fd, const void *buf, size_t len,
00364                                   int flags)
00365 {
00366         return rt_dev_sendto(fd, buf, len, flags, NULL, 0);
00367 }
00368 
00369 static inline int rt_dev_getsockopt(int fd, int level, int optname,
00370                                     void *optval, socklen_t *optlen)
00371 {
00372         struct _rtdm_getsockopt_args args =
00373                 { level, optname, optval, optlen };
00374 
00375         return rt_dev_ioctl(fd, _RTIOC_GETSOCKOPT, &args);
00376 }
00377 
00378 static inline int rt_dev_setsockopt(int fd, int level, int optname,
00379                                     const void *optval, socklen_t optlen)
00380 {
00381         struct _rtdm_setsockopt_args args =
00382                 { level, optname, (void *)optval, optlen };
00383 
00384         return rt_dev_ioctl(fd, _RTIOC_SETSOCKOPT, &args);
00385 }
00386 
00387 static inline int rt_dev_bind(int fd, const struct sockaddr *my_addr,
00388                               socklen_t addrlen)
00389 {
00390         struct _rtdm_setsockaddr_args args = { my_addr, addrlen };
00391 
00392         return rt_dev_ioctl(fd, _RTIOC_BIND, &args);
00393 }
00394 
00395 static inline int rt_dev_connect(int fd, const struct sockaddr *serv_addr,
00396                                  socklen_t addrlen)
00397 {
00398         struct _rtdm_setsockaddr_args args = { serv_addr, addrlen };
00399 
00400         return rt_dev_ioctl(fd, _RTIOC_CONNECT, &args);
00401 }
00402 
00403 static inline int rt_dev_listen(int fd, int backlog)
00404 {
00405         return rt_dev_ioctl(fd, _RTIOC_LISTEN, backlog);
00406 }
00407 
00408 static inline int rt_dev_accept(int fd, struct sockaddr *addr,
00409                                 socklen_t *addrlen)
00410 {
00411         struct _rtdm_getsockaddr_args args = { addr, addrlen };
00412 
00413         return rt_dev_ioctl(fd, _RTIOC_ACCEPT, &args);
00414 }
00415 
00416 static inline int rt_dev_getsockname(int fd, struct sockaddr *name,
00417                                      socklen_t *namelen)
00418 {
00419         struct _rtdm_getsockaddr_args args = { name, namelen };
00420 
00421         return rt_dev_ioctl(fd, _RTIOC_GETSOCKNAME, &args);
00422 }
00423 
00424 static inline int rt_dev_getpeername(int fd, struct sockaddr *name,
00425                                      socklen_t *namelen)
00426 {
00427         struct _rtdm_getsockaddr_args args = { name, namelen };
00428 
00429         return rt_dev_ioctl(fd, _RTIOC_GETPEERNAME, &args);
00430 }
00431 
00432 static inline int rt_dev_shutdown(int fd, int how)
00433 {
00434         return rt_dev_ioctl(fd, _RTIOC_SHUTDOWN, how);
00435 }
00436 
00437 #ifdef __cplusplus
00438 }
00439 #endif
00440 
00441 #endif /* RTDM_NO_DEFAULT_USER_API */
00442 
00443 #endif /* _RTDM_H */

Generated on Mon Mar 24 18:02:40 2008 for Xenomai API by  doxygen 1.5.3