Xenomai  3.0.4
internal.h
1 
20 #ifndef _RTIPC_INTERNAL_H
21 #define _RTIPC_INTERNAL_H
22 
23 #include <linux/uio.h>
24 #include <cobalt/kernel/registry.h>
25 #include <cobalt/kernel/clock.h>
26 #include <cobalt/kernel/select.h>
27 #include <rtdm/rtdm.h>
28 #include <rtdm/compat.h>
29 #include <rtdm/driver.h>
30 
31 #define RTIPC_IOV_FASTMAX 16
32 
33 struct rtipc_protocol;
34 
35 struct rtipc_private {
36  struct rtipc_protocol *proto;
37  DECLARE_XNSELECT(send_block);
38  DECLARE_XNSELECT(recv_block);
39  void *state;
40 };
41 
42 struct rtipc_protocol {
43  const char *proto_name;
44  int proto_statesz;
45  int (*proto_init)(void);
46  void (*proto_exit)(void);
47  struct {
48  int (*socket)(struct rtdm_fd *fd);
49  void (*close)(struct rtdm_fd *fd);
50  ssize_t (*recvmsg)(struct rtdm_fd *fd,
51  struct user_msghdr *msg, int flags);
52  ssize_t (*sendmsg)(struct rtdm_fd *fd,
53  const struct user_msghdr *msg, int flags);
54  ssize_t (*read)(struct rtdm_fd *fd,
55  void *buf, size_t len);
56  ssize_t (*write)(struct rtdm_fd *fd,
57  const void *buf, size_t len);
58  int (*ioctl)(struct rtdm_fd *fd,
59  unsigned int request, void *arg);
60  unsigned int (*pollstate)(struct rtdm_fd *fd);
61  } proto_ops;
62 };
63 
64 static inline void *rtipc_fd_to_state(struct rtdm_fd *fd)
65 {
66  struct rtipc_private *p = rtdm_fd_to_private(fd);
67  return p->state;
68 }
69 
70 static inline nanosecs_rel_t rtipc_timeval_to_ns(const struct timeval *tv)
71 {
72  nanosecs_rel_t ns = tv->tv_usec * 1000;
73 
74  if (tv->tv_sec)
75  ns += (nanosecs_rel_t)tv->tv_sec * 1000000000UL;
76 
77  return ns;
78 }
79 
80 static inline void rtipc_ns_to_timeval(struct timeval *tv, nanosecs_rel_t ns)
81 {
82  unsigned long nsecs;
83 
84  tv->tv_sec = xnclock_divrem_billion(ns, &nsecs);
85  tv->tv_usec = nsecs / 1000;
86 }
87 
88 int rtipc_get_iovec(struct rtdm_fd *fd, struct iovec **iov,
89  const struct user_msghdr *msg,
90  struct iovec *iov_fast);
91 
92 int rtipc_put_iovec(struct rtdm_fd *fd, struct iovec *iov,
93  const struct user_msghdr *msg,
94  struct iovec *iov_fast);
95 
96 static inline
97 void rtipc_drop_iovec(struct iovec *iov, struct iovec *iov_fast)
98 {
99  if (iov != iov_fast)
100  xnfree(iov);
101 }
102 
103 int rtipc_get_sockaddr(struct rtdm_fd *fd,
104  struct sockaddr_ipc **saddrp,
105  const void *arg);
106 
107 int rtipc_put_sockaddr(struct rtdm_fd *fd, void *arg,
108  const struct sockaddr_ipc *saddr);
109 
110 int rtipc_get_sockoptout(struct rtdm_fd *fd,
111  struct _rtdm_getsockopt_args *sopt,
112  const void *arg);
113 
114 int rtipc_put_sockoptout(struct rtdm_fd *fd, void *arg,
115  const struct _rtdm_getsockopt_args *sopt);
116 
117 int rtipc_get_sockoptin(struct rtdm_fd *fd,
118  struct _rtdm_setsockopt_args *sopt,
119  const void *arg);
120 
121 int rtipc_get_timeval(struct rtdm_fd *fd, struct timeval *tv,
122  const void *arg, size_t arglen);
123 
124 int rtipc_put_timeval(struct rtdm_fd *fd, void *arg,
125  const struct timeval *tv, size_t arglen);
126 
127 int rtipc_get_length(struct rtdm_fd *fd, size_t *lenp,
128  const void *arg, size_t arglen);
129 
130 int rtipc_get_arg(struct rtdm_fd *fd, void *dst, const void *src,
131  size_t len);
132 
133 int rtipc_put_arg(struct rtdm_fd *fd, void *dst, const void *src,
134  size_t len);
135 
136 ssize_t rtipc_get_iov_flatlen(struct iovec *iov, int iovlen);
137 
138 extern struct rtipc_protocol xddp_proto_driver;
139 
140 extern struct rtipc_protocol iddp_proto_driver;
141 
142 extern struct rtipc_protocol bufp_proto_driver;
143 
144 extern struct xnptree rtipc_ptree;
145 
146 #define rtipc_wait_context xnthread_wait_context
147 #define rtipc_prepare_wait xnthread_prepare_wait
148 #define rtipc_get_wait_context xnthread_get_wait_context
149 #define rtipc_peek_wait_head(obj) xnsynch_peek_pendq(&(obj)->synch_base)
150 
151 #define COMPAT_CASE(__op) case __op __COMPAT_CASE(__op ## _COMPAT)
152 
153 #endif /* !_RTIPC_INTERNAL_H */
Socket address structure for the RTIPC address family.
Definition: ipc.h:480
static void * rtdm_fd_to_private(struct rtdm_fd *fd)
Locate the driver private area associated to a device context structure.
Definition: driver.h:161
int64_t nanosecs_rel_t
RTDM type for representing relative intervals.
Definition: rtdm.h:49
Real-Time Driver Model for Xenomai, driver API header.