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 
00069 
00079 #define RTDM_API_VER                5
00080 
00082 #define RTDM_API_MIN_COMPAT_VER     5
00083 
00088 typedef uint64_t                    nanosecs_abs_t;
00089 
00094 typedef int64_t                     nanosecs_rel_t;
00095 
00096 
00102 #define RTDM_TIMEOUT_INFINITE       0
00103 
00105 #define RTDM_TIMEOUT_NONE           (-1)
00106 
00119 #define RTDM_CLASS_PARPORT          1
00120 #define RTDM_CLASS_SERIAL           2
00121 #define RTDM_CLASS_CAN              3
00122 #define RTDM_CLASS_NETWORK          4
00123 #define RTDM_CLASS_RTMAC            5
00124 #define RTDM_CLASS_TESTING          6
00125 /*
00126 #define RTDM_CLASS_USB              ?
00127 #define RTDM_CLASS_FIREWIRE         ?
00128 #define RTDM_CLASS_INTERBUS         ?
00129 #define RTDM_CLASS_PROFIBUS         ?
00130 #define ...
00131 */
00132 #define RTDM_CLASS_EXPERIMENTAL     224
00133 #define RTDM_CLASS_MAX              255
00134 
00137 #define RTIOC_TYPE_COMMON           0
00138 
00139 
00145 #define RTDM_MAX_DEVNAME_LEN        31
00146 
00153 #define RTDM_PURGE_RX_BUFFER        0x0001
00154 #define RTDM_PURGE_TX_BUFFER        0x0002
00155 
00168 #define RTIOC_PURGE                 _IOW(RTIOC_TYPE_COMMON, 0x10, int)
00169 
00173 /* Internally used for mapping socket functions on IOCTLs */
00174 struct _rtdm_getsockopt_args {
00175     int                             level;
00176     int                             optname;
00177     void                            *optval;
00178     socklen_t                       *optlen;
00179 };
00180 
00181 struct _rtdm_setsockopt_args {
00182     int                             level;
00183     int                             optname;
00184     const void                      *optval;
00185     socklen_t                       optlen;
00186 };
00187 
00188 struct _rtdm_getsockaddr_args {
00189     struct sockaddr                 *addr;
00190     socklen_t                       *addrlen;
00191 };
00192 
00193 struct _rtdm_setsockaddr_args {
00194     const struct sockaddr           *addr;
00195     socklen_t                       addrlen;
00196 };
00197 
00198 #define _RTIOC_GETSOCKOPT          _IOW(RTIOC_TYPE_COMMON, 0x20,        \
00199                                         struct _rtdm_getsockopt_args)
00200 #define _RTIOC_SETSOCKOPT          _IOW(RTIOC_TYPE_COMMON, 0x21,        \
00201                                         struct _rtdm_setsockopt_args)
00202 #define _RTIOC_BIND                _IOW(RTIOC_TYPE_COMMON, 0x22,        \
00203                                         struct _rtdm_setsockaddr_args)
00204 #define _RTIOC_CONNECT             _IOW(RTIOC_TYPE_COMMON, 0x23,        \
00205                                         struct _rtdm_setsockaddr_args)
00206 #define _RTIOC_LISTEN              _IOW(RTIOC_TYPE_COMMON, 0x24,        \
00207                                         int)
00208 #define _RTIOC_ACCEPT              _IOW(RTIOC_TYPE_COMMON, 0x25,        \
00209                                         struct _rtdm_getsockaddr_args)
00210 #define _RTIOC_GETSOCKNAME         _IOW(RTIOC_TYPE_COMMON, 0x26,        \
00211                                         struct _rtdm_getsockaddr_args)
00212 #define _RTIOC_GETPEERNAME         _IOW(RTIOC_TYPE_COMMON, 0x27,        \
00213                                         struct _rtdm_getsockaddr_args)
00214 #define _RTIOC_SHUTDOWN            _IOW(RTIOC_TYPE_COMMON, 0x28,        \
00215                                         int)
00216 
00217 
00218 #ifdef __KERNEL__
00219 int     _rtdm_open   (rtdm_user_info_t *user_info, const char *path,
00220                       int oflag);
00221 int     _rtdm_socket (rtdm_user_info_t *user_info, int protocol_family,
00222                       int socket_type, int protocol);
00223 int     _rtdm_close  (rtdm_user_info_t *user_info, int fd, int forced);
00224 int     _rtdm_ioctl  (rtdm_user_info_t *user_info, int fd, int request, ...);
00225 ssize_t _rtdm_read   (rtdm_user_info_t *user_info, int fd, void *buf,
00226                       size_t nbyte);
00227 ssize_t _rtdm_write  (rtdm_user_info_t *user_info, int fd, const void *buf,
00228                       size_t nbyte);
00229 ssize_t _rtdm_recvmsg(rtdm_user_info_t *user_info, int fd, struct msghdr *msg,
00230                       int flags);
00231 ssize_t _rtdm_sendmsg(rtdm_user_info_t *user_info, int fd,
00232                       const struct msghdr *msg, int flags);
00233 #endif /* __KERNEL__ */
00234 
00235 
00236 /* Define RTDM_NO_DEFAULT_USER_API to switch off the default rt_dev_xxx
00237  * interface when providing a customised user API */
00238 #ifndef RTDM_NO_DEFAULT_USER_API
00239 
00240 #ifdef __KERNEL__
00241 
00242 #define rt_dev_open(path, oflag, ...)                           \
00243     _rtdm_open(NULL, path, oflag)
00244 
00245 #define rt_dev_socket(protocol_family, socket_type, protocol)   \
00246     _rtdm_socket(NULL, protocol_family, socket_type, protocol)
00247 
00248 #define rt_dev_close(fd)                                        \
00249     _rtdm_close(NULL, fd, 0)
00250 
00251 #define rt_dev_ioctl(fd, request, ...)                          \
00252     _rtdm_ioctl(NULL, fd, request, __VA_ARGS__)
00253 
00254 #define rt_dev_read(fd, buf, nbyte)                             \
00255     _rtdm_read(NULL, fd, buf, nbyte)
00256 
00257 #define rt_dev_write(fd, buf, nbyte)                            \
00258     _rtdm_write(NULL, fd, buf, nbyte)
00259 
00260 #define rt_dev_recvmsg(fd, msg, flags)                          \
00261     _rtdm_recvmsg(NULL, fd, msg, flags)
00262 
00263 #define rt_dev_sendmsg(fd, msg, flags)                          \
00264     _rtdm_sendmsg(NULL, fd, msg, flags)
00265 
00266 
00267 static inline ssize_t rt_dev_recvfrom(int fd, void *buf, size_t len, int flags,
00268                                       struct sockaddr *from,
00269                                       socklen_t *fromlen)
00270 {
00271     struct iovec    iov = {buf, len};
00272     struct msghdr   msg =
00273         {from, (from != NULL) ? *fromlen : 0, &iov, 1, NULL, 0};
00274     int             ret;
00275 
00276     ret = rt_dev_recvmsg(fd, &msg, flags);
00277     if ((ret >= 0) && (from != NULL))
00278         *fromlen = msg.msg_namelen;
00279     return ret;
00280 }
00281 
00282 #else  /* !__KERNEL__ */
00283 
00284 #ifdef __cplusplus
00285 extern "C" {
00286 #endif
00287 
00288 int     rt_dev_open   (const char *path, int oflag, ...);
00289 int     rt_dev_socket (int protocol_family, int socket_type, int protocol);
00290 int     rt_dev_close  (int fd);
00291 int     rt_dev_ioctl  (int fd, int request, ...);
00292 ssize_t rt_dev_read   (int fd, void *buf, size_t nbyte);
00293 ssize_t rt_dev_write  (int fd, const void *buf, size_t nbyte);
00294 ssize_t rt_dev_recvmsg(int fd, struct msghdr *msg, int flags);
00295 ssize_t rt_dev_sendmsg(int fd, const struct msghdr *msg, int flags);
00296 
00297 ssize_t rt_dev_recvfrom(int fd, void *buf, size_t len, int flags,
00298                         struct sockaddr *from,
00299                         socklen_t *fromlen);
00300 
00301 #ifdef __cplusplus
00302 }
00303 #endif
00304 
00305 #endif /* __KERNEL__ */
00306 
00307 #ifdef __cplusplus
00308 extern "C" {
00309 #endif
00310 
00311 static inline ssize_t rt_dev_recv(int fd, void *buf, size_t len, int flags)
00312 {
00313     return rt_dev_recvfrom(fd, buf, len, flags, NULL, NULL);
00314 }
00315 
00316 
00317 static inline ssize_t rt_dev_sendto(int fd, const void *buf, size_t len,
00318                                     int flags, const struct sockaddr *to,
00319                                     socklen_t tolen)
00320 {
00321     struct iovec    iov = {(void *)buf, len};
00322     struct msghdr   msg =
00323         {(struct sockaddr *)to, tolen, &iov, 1, NULL, 0};
00324 
00325     return rt_dev_sendmsg(fd, &msg, flags);
00326 }
00327 
00328 
00329 static inline ssize_t rt_dev_send(int fd, const void *buf, size_t len,
00330                                   int flags)
00331 {
00332     return rt_dev_sendto(fd, buf, len, flags, NULL, 0);
00333 }
00334 
00335 
00336 static inline int rt_dev_getsockopt(int fd, int level, int optname,
00337                                     void *optval, socklen_t *optlen)
00338 {
00339     struct _rtdm_getsockopt_args args = {level, optname, optval, optlen};
00340 
00341     return rt_dev_ioctl(fd, _RTIOC_GETSOCKOPT, &args);
00342 }
00343 
00344 
00345 static inline int rt_dev_setsockopt(int fd, int level, int optname,
00346                                     const void *optval, socklen_t optlen)
00347 {
00348     struct _rtdm_setsockopt_args args =
00349     {level, optname, (void *)optval, optlen};
00350 
00351     return rt_dev_ioctl(fd, _RTIOC_SETSOCKOPT, &args);
00352 }
00353 
00354 
00355 static inline int rt_dev_bind(int fd, const struct sockaddr *my_addr,
00356                               socklen_t addrlen)
00357 {
00358     struct _rtdm_setsockaddr_args args = {my_addr, addrlen};
00359 
00360     return rt_dev_ioctl(fd, _RTIOC_BIND, &args);
00361 }
00362 
00363 
00364 static inline int rt_dev_connect(int fd, const struct sockaddr *serv_addr,
00365                                  socklen_t addrlen)
00366 {
00367     struct _rtdm_setsockaddr_args args = {serv_addr, addrlen};
00368 
00369     return rt_dev_ioctl(fd, _RTIOC_CONNECT, &args);
00370 }
00371 
00372 
00373 static inline int rt_dev_listen(int fd, int backlog)
00374 {
00375     return rt_dev_ioctl(fd, _RTIOC_LISTEN, backlog);
00376 }
00377 
00378 
00379 static inline int rt_dev_accept(int fd, struct sockaddr *addr,
00380                                 socklen_t *addrlen)
00381 {
00382     struct _rtdm_getsockaddr_args args = {addr, addrlen};
00383 
00384     return rt_dev_ioctl(fd, _RTIOC_ACCEPT, &args);
00385 }
00386 
00387 
00388 static inline int rt_dev_getsockname(int fd, struct sockaddr *name,
00389                                      socklen_t *namelen)
00390 {
00391     struct _rtdm_getsockaddr_args args = {name, namelen};
00392 
00393     return rt_dev_ioctl(fd, _RTIOC_GETSOCKNAME, &args);
00394 }
00395 
00396 
00397 static inline int rt_dev_getpeername(int fd, struct sockaddr *name,
00398                                      socklen_t *namelen)
00399 {
00400     struct _rtdm_getsockaddr_args args = {name, namelen};
00401 
00402     return rt_dev_ioctl(fd, _RTIOC_GETPEERNAME, &args);
00403 }
00404 
00405 static inline int rt_dev_shutdown(int fd, int how)
00406 {
00407     return rt_dev_ioctl(fd, _RTIOC_SHUTDOWN, how);
00408 }
00409 
00410 #ifdef __cplusplus
00411 }
00412 #endif
00413 
00414 #endif /* RTDM_NO_DEFAULT_USER_API */
00415 
00416 #endif /* _RTDM_H */

Generated on Mon Dec 25 13:57:10 2006 for Xenomai API by  doxygen 1.4.6