Gilles Chanteperdrix wrote:
>
> Hi,
>
> the following patchset adds core support to Xenomai for select-like
> services,
The attached patch is a quick and dirty patch of RTnet to allow using
rtnet sockets of all types with the new select service.
--
Gilles Chanteperdrix.
Index: stack/ipv4/af_inet.c
===
--- stack/ipv4/af_inet.c(révision 6193)
+++ stack/ipv4/af_inet.c(copie de travail)
@@ -259,8 +259,6 @@ static void rt_ip_ifdown(struct rtnet_de
rt_ip_route_del_all(rtdev);
}
-
-
static struct rtdev_event_hook rtdev_hook = {
register_device:NULL,
unregister_device: NULL,
@@ -294,6 +292,7 @@ static struct rtdm_device ipv4_device =
ioctl_nrt: rt_udp_ioctl,
recvmsg_rt: rt_udp_recvmsg,
sendmsg_rt: rt_udp_sendmsg,
+ select_bind:rt_socket_select_bind,
#ifdef CONFIG_RTNET_RTDM_SELECT
poll_rt:rt_udp_poll,
/* there should be only the function poll() */
Index: stack/include/rtnet_socket.h
===
--- stack/include/rtnet_socket.h(révision 6193)
+++ stack/include/rtnet_socket.h(copie de travail)
@@ -51,7 +51,8 @@ struct rtsocket {
unsigned intpriority;
nanosecs_rel_t timeout;/* receive timeout, 0 for infinite */
-rtdm_sem_t pending_sem;
+rtdm_select_sem_t pending_sem;
+struct xnselect write_select;
#ifdef CONFIG_RTNET_RTDM_SELECT
wait_queue_primitive_t *wakeup_select; /* for selecting calls - this
SHOULD be the head of a wait
@@ -96,6 +97,10 @@ static inline struct rtdm_dev_context *r
atomic_dec(&(rt_socket_context(sock)->close_lock_count))
extern int rt_socket_init(struct rtdm_dev_context *context);
+extern int rt_socket_select_bind(struct rtdm_dev_context *context,
+struct xnselector *selector,
+unsigned type,
+unsigned index);
extern int rt_socket_cleanup(struct rtdm_dev_context *context);
extern int rt_socket_common_ioctl(struct rtdm_dev_context *context,
rtdm_user_info_t *user_info,
Index: stack/packet/af_packet.c
===
--- stack/packet/af_packet.c(révision 6193)
+++ stack/packet/af_packet.c(copie de travail)
@@ -467,7 +467,8 @@ static struct rtdm_device packet_proto
ioctl_rt: rt_packet_ioctl,
ioctl_nrt: rt_packet_ioctl,
recvmsg_rt: rt_packet_recvmsg,
-sendmsg_rt: rt_packet_sendmsg
+sendmsg_rt: rt_packet_sendmsg,
+ select_bind:rt_socket_select_bind,
},
device_class: RTDM_CLASS_NETWORK,
Index: stack/socket.c
===
--- stack/socket.c (révision 6193)
+++ stack/socket.c (copie de travail)
@@ -68,6 +68,7 @@ int rt_socket_init(struct rtdm_dev_conte
rtdm_lock_init(&sock->param_lock);
rtdm_sem_init(&sock->pending_sem, 0);
+xnselect_init(&sock->write_select);
if (test_bit(RTDM_CREATED_IN_NRT, &sockctx->context_flags))
pool_size = rtskb_pool_init(&sock->skb_pool, socket_rtskbs);
@@ -87,7 +88,44 @@ int rt_socket_init(struct rtdm_dev_conte
return 0;
}
+int rt_socket_select_bind(struct rtdm_dev_context *context,
+ struct xnselector *selector,
+ unsigned type,
+ unsigned index)
+{
+struct rtsocket *sock = (struct rtsocket *)&context->dev_private;
+
+switch(type) {
+case XNSELECT_READ:
+ return rtdm_select_sem_bind(&sock->pending_sem, selector, type, index);
+
+case XNSELECT_WRITE: {
+ struct xnselect_binding *binding;
+ int err;
+ spl_t s;
+
+ binding = xnmalloc(sizeof(*binding));
+ if (!binding)
+ return -ENOMEM;
+
+ xnlock_get_irqsave(&nklock, s);
+ /* Writing to a socket is always possible, so the state is 1, forever.
*/
+ err = xnselect_bind(&sock->write_select,
+ binding, selector, type, index, 1);
+ xnlock_put_irqrestore(&nklock, s);
+
+ if (err)
+ xnfree(binding);
+ return err;
+}
+case XNSELECT_EXCEPT:
+ return -EBADF;
+}
+
+return -EINVAL;
+}
+EXPORT_SYMBOL(rt_socket_select_bind);
/***
* rt_socket_cleanup - releases resources allocated for the socket
@@ -100,6 +138,7 @@ int rt_socket_cleanup(struct rtdm_dev_co
rtdm_sem_destroy(&sock->pending_sem);
+xnselect_destroy(&sock->write_select);
rtdm_lock_get_irqsave(&sock->param_lock, context);
___
Xenomai-core mailing list
Xeno