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
00061
00062 #include <fcntl.h>
00063 #include <stdint.h>
00064 #include <sys/ioctl.h>
00065 #include <sys/socket.h>
00066
00067 #endif
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
00127
00128
00129
00130
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
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
00234
00235
00236
00237
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
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
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
00415
00416 #endif