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