rtdm.h

Go to the documentation of this file.
00001 
00035 #ifndef _RTDM_H
00036 #define _RTDM_H
00037 
00038 #ifdef __KERNEL__
00039 
00040 #include <linux/fcntl.h>
00041 #include <linux/ioctl.h>
00042 #include <linux/sched.h>
00043 #include <linux/socket.h>
00044 
00045 typedef size_t                      socklen_t;
00046 typedef struct task_struct          rtdm_user_info_t;
00047 
00048 #else  /* !__KERNEL__ */
00049 
00050 #include <fcntl.h>
00051 #include <sys/ioctl.h>
00052 #include <sys/socket.h>
00053 
00054 #endif /* !__KERNEL__ */
00055 
00056 
00058 #define RTDM_MAX_DEVNAME_LEN        31
00059 
00060 
00065 #define RTDM_CLASS_PARPORT          1
00066 #define RTDM_CLASS_SERIAL           2
00067 #define RTDM_CLASS_CAN              3
00068 #define RTDM_CLASS_NETWORK          4
00069 #define RTDM_CLASS_RTMAC            5
00070 /*
00071 #define RTDM_CLASS_USB              ?
00072 #define RTDM_CLASS_FIREWIRE         ?
00073 #define RTDM_CLASS_INTERBUS         ?
00074 #define RTDM_CLASS_PROFIBUS         ?
00075 #define ...
00076 */
00077 #define RTDM_CLASS_EXPERIMENTAL     224
00078 #define RTDM_CLASS_MAX              255
00079 
00082 #define RTIOC_TYPE_COMMON           0
00083 
00084 
00094 #define RTIOC_PURGE                 _IOW(RTIOC_TYPE_COMMON, 0x10, int)
00095 
00101 #define RTDM_PURGE_RX_BUFFER        0x0001
00102 #define RTDM_PURGE_TX_BUFFER        0x0002
00103 
00106 /* Internally used for mapping socket functions on IOCTLs */
00107 struct _rtdm_getsockopt_args {
00108     int                             level;
00109     int                             optname;
00110     void                            *optval;
00111     socklen_t                       *optlen;
00112 };
00113 
00114 struct _rtdm_setsockopt_args {
00115     int                             level;
00116     int                             optname;
00117     const void                      *optval;
00118     socklen_t                       optlen;
00119 };
00120 
00121 struct _rtdm_getsockaddr_args {
00122     struct sockaddr                 *addr;
00123     socklen_t                       *addrlen;
00124 };
00125 
00126 struct _rtdm_setsockaddr_args {
00127     const struct sockaddr           *addr;
00128     socklen_t                       addrlen;
00129 };
00130 
00131 #define _RTIOC_GETSOCKOPT          _IOW(RTIOC_TYPE_COMMON, 0x20,        \
00132                                         struct _rtdm_getsockopt_args)
00133 #define _RTIOC_SETSOCKOPT          _IOW(RTIOC_TYPE_COMMON, 0x21,        \
00134                                         struct _rtdm_setsockopt_args)
00135 #define _RTIOC_BIND                _IOW(RTIOC_TYPE_COMMON, 0x22,        \
00136                                         struct _rtdm_setsockaddr_args)
00137 #define _RTIOC_CONNECT             _IOW(RTIOC_TYPE_COMMON, 0x23,        \
00138                                         struct _rtdm_setsockaddr_args)
00139 #define _RTIOC_LISTEN              _IOW(RTIOC_TYPE_COMMON, 0x24,        \
00140                                         int)
00141 #define _RTIOC_ACCEPT              _IOW(RTIOC_TYPE_COMMON, 0x25,        \
00142                                         struct _rtdm_getsockaddr_args)
00143 #define _RTIOC_GETSOCKNAME         _IOW(RTIOC_TYPE_COMMON, 0x26,        \
00144                                         struct _rtdm_getsockaddr_args)
00145 #define _RTIOC_GETPEERNAME         _IOW(RTIOC_TYPE_COMMON, 0x27,        \
00146                                         struct _rtdm_getsockaddr_args)
00147 #define _RTIOC_SHUTDOWN            _IOW(RTIOC_TYPE_COMMON, 0x28,        \
00148                                         int)
00149 
00150 
00151 #ifdef __KERNEL__
00152 int     _rtdm_open   (rtdm_user_info_t *user_info, const char *path,
00153                       int oflag);
00154 int     _rtdm_socket (rtdm_user_info_t *user_info, int protocol_family,
00155                       int socket_type, int protocol);
00156 int     _rtdm_close  (rtdm_user_info_t *user_info, int fd, int forced);
00157 int     _rtdm_ioctl  (rtdm_user_info_t *user_info, int fd, int request, ...);
00158 ssize_t _rtdm_read   (rtdm_user_info_t *user_info, int fd, void *buf,
00159                       size_t nbyte);
00160 ssize_t _rtdm_write  (rtdm_user_info_t *user_info, int fd, const void *buf,
00161                       size_t nbyte);
00162 ssize_t _rtdm_recvmsg(rtdm_user_info_t *user_info, int fd, struct msghdr *msg,
00163                       int flags);
00164 ssize_t _rtdm_sendmsg(rtdm_user_info_t *user_info, int fd,
00165                       const struct msghdr *msg, int flags);
00166 #endif /* __KERNEL__ */
00167 
00168 
00169 /* Define RTDM_NO_DEFAULT_USER_API to switch off the default rt_dev_xxx
00170  * interface when providing a customised user API */
00171 #ifndef RTDM_NO_DEFAULT_USER_API
00172 
00173 #ifdef __KERNEL__
00174 
00175 #define rt_dev_open(path, oflag, ...)                           \
00176     _rtdm_open(NULL, path, oflag)
00177 
00178 #define rt_dev_socket(protocol_family, socket_type, protocol)   \
00179     _rtdm_socket(NULL, protocol_family, socket_type, protocol)
00180 
00181 #define rt_dev_close(fd)                                        \
00182     _rtdm_close(NULL, fd, 0)
00183 
00184 #define rt_dev_ioctl(fd, request, ...)                          \
00185     _rtdm_ioctl(NULL, fd, request, __VA_ARGS__)
00186 
00187 #define rt_dev_read(fd, buf, nbyte)                             \
00188     _rtdm_read(NULL, fd, buf, nbyte)
00189 
00190 #define rt_dev_write(fd, buf, nbyte)                            \
00191     _rtdm_write(NULL, fd, buf, nbyte)
00192 
00193 #define rt_dev_recvmsg(fd, msg, flags)                          \
00194     _rtdm_recvmsg(NULL, fd, msg, flags)
00195 
00196 #define rt_dev_sendmsg(fd, msg, flags)                          \
00197     _rtdm_sendmsg(NULL, fd, msg, flags)
00198 
00199 
00200 static inline ssize_t rt_dev_recvfrom(int fd, void *buf, size_t len, int flags,
00201                                       struct sockaddr *from,
00202                                       socklen_t *fromlen)
00203 {
00204     struct iovec    iov = {buf, len};
00205     struct msghdr   msg =
00206         {from, (from != NULL) ? *fromlen : 0, &iov, 1, NULL, 0};
00207     int             ret;
00208 
00209     ret = rt_dev_recvmsg(fd, &msg, flags);
00210     if ((ret >= 0) && (from != NULL))
00211         *fromlen = msg.msg_namelen;
00212     return ret;
00213 }
00214 
00215 #else  /* !__KERNEL__ */
00216 
00217 #ifdef __cplusplus
00218 extern "C" {
00219 #endif
00220 
00221 int     rt_dev_open   (const char *path, int oflag, ...);
00222 int     rt_dev_socket (int protocol_family, int socket_type, int protocol);
00223 int     rt_dev_close  (int fd);
00224 int     rt_dev_ioctl  (int fd, int request, ...);
00225 ssize_t rt_dev_read   (int fd, void *buf, size_t nbyte);
00226 ssize_t rt_dev_write  (int fd, const void *buf, size_t nbyte);
00227 ssize_t rt_dev_recvmsg(int fd, struct msghdr *msg, int flags);
00228 ssize_t rt_dev_sendmsg(int fd, const struct msghdr *msg, int flags);
00229 
00230 ssize_t rt_dev_recvfrom(int fd, void *buf, size_t len, int flags,
00231                         struct sockaddr *from,
00232                         socklen_t *fromlen);
00233 
00234 #ifdef __cplusplus
00235 }
00236 #endif
00237 
00238 #endif /* __KERNEL__ */
00239 
00240 #ifdef __cplusplus
00241 extern "C" {
00242 #endif
00243 
00244 static inline ssize_t rt_dev_recv(int fd, void *buf, size_t len, int flags)
00245 {
00246     return rt_dev_recvfrom(fd, buf, len, flags, NULL, NULL);
00247 }
00248 
00249 
00250 static inline ssize_t rt_dev_sendto(int fd, const void *buf, size_t len,
00251                                     int flags, const struct sockaddr *to,
00252                                     socklen_t tolen)
00253 {
00254     struct iovec    iov = {(void *)buf, len};
00255     struct msghdr   msg =
00256         {(struct sockaddr *)to, tolen, &iov, 1, NULL, 0};
00257 
00258     return rt_dev_sendmsg(fd, &msg, flags);
00259 }
00260 
00261 
00262 static inline ssize_t rt_dev_send(int fd, const void *buf, size_t len,
00263                                   int flags)
00264 {
00265     return rt_dev_sendto(fd, buf, len, flags, NULL, 0);
00266 }
00267 
00268 
00269 static inline int rt_dev_getsockopt(int fd, int level, int optname,
00270                                     void *optval, socklen_t *optlen)
00271 {
00272     struct _rtdm_getsockopt_args args = {level, optname, optval, optlen};
00273 
00274     return rt_dev_ioctl(fd, _RTIOC_GETSOCKOPT, &args);
00275 }
00276 
00277 
00278 static inline int rt_dev_setsockopt(int fd, int level, int optname,
00279                                     const void *optval, socklen_t optlen)
00280 {
00281     struct _rtdm_setsockopt_args args =
00282     {level, optname, (void *)optval, optlen};
00283 
00284     return rt_dev_ioctl(fd, _RTIOC_SETSOCKOPT, &args);
00285 }
00286 
00287 
00288 static inline int rt_dev_bind(int fd, const struct sockaddr *my_addr,
00289                               socklen_t addrlen)
00290 {
00291     struct _rtdm_setsockaddr_args args = {my_addr, addrlen};
00292 
00293     return rt_dev_ioctl(fd, _RTIOC_BIND, &args);
00294 }
00295 
00296 
00297 static inline int rt_dev_connect(int fd, const struct sockaddr *serv_addr,
00298                                  socklen_t addrlen)
00299 {
00300     struct _rtdm_setsockaddr_args args = {serv_addr, addrlen};
00301 
00302     return rt_dev_ioctl(fd, _RTIOC_CONNECT, &args);
00303 }
00304 
00305 
00306 static inline int rt_dev_listen(int fd, int backlog)
00307 {
00308     return rt_dev_ioctl(fd, _RTIOC_LISTEN, backlog);
00309 }
00310 
00311 
00312 static inline int rt_dev_accept(int fd, struct sockaddr *addr,
00313                                 socklen_t *addrlen)
00314 {
00315     struct _rtdm_getsockaddr_args args = {addr, addrlen};
00316 
00317     return rt_dev_ioctl(fd, _RTIOC_ACCEPT, &args);
00318 }
00319 
00320 
00321 static inline int rt_dev_getsockname(int fd, struct sockaddr *name,
00322                                      socklen_t *namelen)
00323 {
00324     struct _rtdm_getsockaddr_args args = {name, namelen};
00325 
00326     return rt_dev_ioctl(fd, _RTIOC_GETSOCKNAME, &args);
00327 }
00328 
00329 
00330 static inline int rt_dev_getpeername(int fd, struct sockaddr *name,
00331                                      socklen_t *namelen)
00332 {
00333     struct _rtdm_getsockaddr_args args = {name, namelen};
00334 
00335     return rt_dev_ioctl(fd, _RTIOC_GETPEERNAME, &args);
00336 }
00337 
00338 static inline int rt_dev_shutdown(int fd, int how)
00339 {
00340     return rt_dev_ioctl(fd, _RTIOC_SHUTDOWN, how);
00341 }
00342 
00343 #ifdef __cplusplus
00344 }
00345 #endif
00346 
00347 #endif /* RTDM_NO_DEFAULT_USER_API */
00348 
00349 #endif /* _RTDM_H */

Generated on Sat Sep 3 12:32:47 2005 for RTAI Fusion API by  doxygen 1.4.2