rxrpc: Separate local endpoint event handling out into its own file
authorDavid Howells <dhowells@redhat.com>
Mon, 4 Apr 2016 13:00:34 +0000 (14:00 +0100)
committerDavid Howells <dhowells@redhat.com>
Wed, 15 Jun 2016 14:37:12 +0000 (15:37 +0100)
Separate local endpoint event handling out into its own file preparatory to
overhauling the object management aspect (which remains in the original
file).

Signed-off-by: David Howells <dhowells@redhat.com>
net/rxrpc/Makefile
net/rxrpc/ar-internal.h
net/rxrpc/local_event.c [new file with mode: 0644]
net/rxrpc/local_object.c

index a6f6f21d8a5945ef35358a25db8f37238eb5f6b3..b005027f80cf3a664104bc59e02d44a5c0e8e9a6 100644 (file)
@@ -12,6 +12,7 @@ af-rxrpc-y := \
        input.o \
        insecure.o \
        key.o \
+       local_event.o \
        local_object.o \
        misc.o \
        output.o \
index a63bb7518fb57d0a8ada5b22ea5f6de5be1807eb..fa50b09eaa634e71015e16e564ce9526479eb4f0 100644 (file)
@@ -572,6 +572,11 @@ int rxrpc_server_keyring(struct rxrpc_sock *, char __user *, int);
 int rxrpc_get_server_data_key(struct rxrpc_connection *, const void *, time_t,
                              u32);
 
+/*
+ * local_event.c
+ */
+extern void rxrpc_process_local_events(struct work_struct *);
+
 /*
  * local_object.c
  */
diff --git a/net/rxrpc/local_event.c b/net/rxrpc/local_event.c
new file mode 100644 (file)
index 0000000..194db2e
--- /dev/null
@@ -0,0 +1,120 @@
+/* AF_RXRPC local endpoint management
+ *
+ * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/module.h>
+#include <linux/net.h>
+#include <linux/skbuff.h>
+#include <linux/slab.h>
+#include <linux/udp.h>
+#include <linux/ip.h>
+#include <net/sock.h>
+#include <net/af_rxrpc.h>
+#include <generated/utsrelease.h>
+#include "ar-internal.h"
+
+static const char rxrpc_version_string[65] = "linux-" UTS_RELEASE " AF_RXRPC";
+
+/*
+ * Reply to a version request
+ */
+static void rxrpc_send_version_request(struct rxrpc_local *local,
+                                      struct rxrpc_host_header *hdr,
+                                      struct sk_buff *skb)
+{
+       struct rxrpc_wire_header whdr;
+       struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
+       struct sockaddr_in sin;
+       struct msghdr msg;
+       struct kvec iov[2];
+       size_t len;
+       int ret;
+
+       _enter("");
+
+       sin.sin_family = AF_INET;
+       sin.sin_port = udp_hdr(skb)->source;
+       sin.sin_addr.s_addr = ip_hdr(skb)->saddr;
+
+       msg.msg_name    = &sin;
+       msg.msg_namelen = sizeof(sin);
+       msg.msg_control = NULL;
+       msg.msg_controllen = 0;
+       msg.msg_flags   = 0;
+
+       whdr.epoch      = htonl(sp->hdr.epoch);
+       whdr.cid        = htonl(sp->hdr.cid);
+       whdr.callNumber = htonl(sp->hdr.callNumber);
+       whdr.seq        = 0;
+       whdr.serial     = 0;
+       whdr.type       = RXRPC_PACKET_TYPE_VERSION;
+       whdr.flags      = RXRPC_LAST_PACKET | (~hdr->flags & RXRPC_CLIENT_INITIATED);
+       whdr.userStatus = 0;
+       whdr.securityIndex = 0;
+       whdr._rsvd      = 0;
+       whdr.serviceId  = htons(sp->hdr.serviceId);
+
+       iov[0].iov_base = &whdr;
+       iov[0].iov_len  = sizeof(whdr);
+       iov[1].iov_base = (char *)rxrpc_version_string;
+       iov[1].iov_len  = sizeof(rxrpc_version_string);
+
+       len = iov[0].iov_len + iov[1].iov_len;
+
+       _proto("Tx VERSION (reply)");
+
+       ret = kernel_sendmsg(local->socket, &msg, iov, 2, len);
+       if (ret < 0)
+               _debug("sendmsg failed: %d", ret);
+
+       _leave("");
+}
+
+/*
+ * Process event packets targetted at a local endpoint.
+ */
+void rxrpc_process_local_events(struct work_struct *work)
+{
+       struct rxrpc_local *local = container_of(work, struct rxrpc_local, event_processor);
+       struct sk_buff *skb;
+       char v;
+
+       _enter("");
+
+       atomic_inc(&local->usage);
+
+       while ((skb = skb_dequeue(&local->event_queue))) {
+               struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
+
+               _debug("{%d},{%u}", local->debug_id, sp->hdr.type);
+
+               switch (sp->hdr.type) {
+               case RXRPC_PACKET_TYPE_VERSION:
+                       if (skb_copy_bits(skb, 0, &v, 1) < 0)
+                               return;
+                       _proto("Rx VERSION { %02x }", v);
+                       if (v == 0)
+                               rxrpc_send_version_request(local, &sp->hdr, skb);
+                       break;
+
+               default:
+                       /* Just ignore anything we don't understand */
+                       break;
+               }
+
+               rxrpc_put_local(local);
+               rxrpc_free_skb(skb);
+       }
+
+       rxrpc_put_local(local);
+       _leave("");
+}
index 28f9efb3118fb4e9f8b1e7e84d092ba5fd0722c5..c1b8d745bf5e644697e6dc5e67427f9b82e30355 100644 (file)
@@ -1,12 +1,12 @@
-/* AF_RXRPC local endpoint management
+/* Local endpoint object management
  *
  * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
  * Written by David Howells (dhowells@redhat.com)
  *
  * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
+ * modify it under the terms of the GNU General Public Licence
  * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
+ * 2 of the Licence, or (at your option) any later version.
  */
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 #include <linux/ip.h>
 #include <net/sock.h>
 #include <net/af_rxrpc.h>
-#include <generated/utsrelease.h>
 #include "ar-internal.h"
 
-static const char rxrpc_version_string[65] = "linux-" UTS_RELEASE " AF_RXRPC";
-
 static LIST_HEAD(rxrpc_locals);
 DEFINE_RWLOCK(rxrpc_local_lock);
 static DECLARE_RWSEM(rxrpc_local_sem);
 static DECLARE_WAIT_QUEUE_HEAD(rxrpc_local_wq);
 
 static void rxrpc_destroy_local(struct work_struct *work);
-static void rxrpc_process_local_events(struct work_struct *work);
 
 /*
  * allocate a new local
@@ -320,98 +316,3 @@ void __exit rxrpc_destroy_all_locals(void)
 
        _leave("");
 }
-
-/*
- * Reply to a version request
- */
-static void rxrpc_send_version_request(struct rxrpc_local *local,
-                                      struct rxrpc_host_header *hdr,
-                                      struct sk_buff *skb)
-{
-       struct rxrpc_wire_header whdr;
-       struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
-       struct sockaddr_in sin;
-       struct msghdr msg;
-       struct kvec iov[2];
-       size_t len;
-       int ret;
-
-       _enter("");
-
-       sin.sin_family = AF_INET;
-       sin.sin_port = udp_hdr(skb)->source;
-       sin.sin_addr.s_addr = ip_hdr(skb)->saddr;
-
-       msg.msg_name    = &sin;
-       msg.msg_namelen = sizeof(sin);
-       msg.msg_control = NULL;
-       msg.msg_controllen = 0;
-       msg.msg_flags   = 0;
-
-       whdr.epoch      = htonl(sp->hdr.epoch);
-       whdr.cid        = htonl(sp->hdr.cid);
-       whdr.callNumber = htonl(sp->hdr.callNumber);
-       whdr.seq        = 0;
-       whdr.serial     = 0;
-       whdr.type       = RXRPC_PACKET_TYPE_VERSION;
-       whdr.flags      = RXRPC_LAST_PACKET | (~hdr->flags & RXRPC_CLIENT_INITIATED);
-       whdr.userStatus = 0;
-       whdr.securityIndex = 0;
-       whdr._rsvd      = 0;
-       whdr.serviceId  = htons(sp->hdr.serviceId);
-
-       iov[0].iov_base = &whdr;
-       iov[0].iov_len  = sizeof(whdr);
-       iov[1].iov_base = (char *)rxrpc_version_string;
-       iov[1].iov_len  = sizeof(rxrpc_version_string);
-
-       len = iov[0].iov_len + iov[1].iov_len;
-
-       _proto("Tx VERSION (reply)");
-
-       ret = kernel_sendmsg(local->socket, &msg, iov, 2, len);
-       if (ret < 0)
-               _debug("sendmsg failed: %d", ret);
-
-       _leave("");
-}
-
-/*
- * Process event packets targetted at a local endpoint.
- */
-static void rxrpc_process_local_events(struct work_struct *work)
-{
-       struct rxrpc_local *local = container_of(work, struct rxrpc_local, event_processor);
-       struct sk_buff *skb;
-       char v;
-
-       _enter("");
-
-       atomic_inc(&local->usage);
-
-       while ((skb = skb_dequeue(&local->event_queue))) {
-               struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
-
-               _debug("{%d},{%u}", local->debug_id, sp->hdr.type);
-
-               switch (sp->hdr.type) {
-               case RXRPC_PACKET_TYPE_VERSION:
-                       if (skb_copy_bits(skb, 0, &v, 1) < 0)
-                               return;
-                       _proto("Rx VERSION { %02x }", v);
-                       if (v == 0)
-                               rxrpc_send_version_request(local, &sp->hdr, skb);
-                       break;
-
-               default:
-                       /* Just ignore anything we don't understand */
-                       break;
-               }
-
-               rxrpc_put_local(local);
-               rxrpc_free_skb(skb);
-       }
-
-       rxrpc_put_local(local);
-       _leave("");
-}