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
00049
00050 #include <fcntl.h>
00051 #include <sys/ioctl.h>
00052 #include <sys/socket.h>
00053
00054 #endif
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
00072
00073
00074
00075
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
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
00167
00168
00169
00170
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
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
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
00348
00349 #endif