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