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