Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rxrpc: Separate local endpoint event handling out into its own file

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>

+129 -102
+1
net/rxrpc/Makefile
··· 12 12 input.o \ 13 13 insecure.o \ 14 14 key.o \ 15 + local_event.o \ 15 16 local_object.o \ 16 17 misc.o \ 17 18 output.o \
+5
net/rxrpc/ar-internal.h
··· 573 573 u32); 574 574 575 575 /* 576 + * local_event.c 577 + */ 578 + extern void rxrpc_process_local_events(struct work_struct *); 579 + 580 + /* 576 581 * local_object.c 577 582 */ 578 583 extern rwlock_t rxrpc_local_lock;
+120
net/rxrpc/local_event.c
··· 1 + /* AF_RXRPC local endpoint management 2 + * 3 + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. 4 + * Written by David Howells (dhowells@redhat.com) 5 + * 6 + * This program is free software; you can redistribute it and/or 7 + * modify it under the terms of the GNU General Public License 8 + * as published by the Free Software Foundation; either version 9 + * 2 of the License, or (at your option) any later version. 10 + */ 11 + 12 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 13 + 14 + #include <linux/module.h> 15 + #include <linux/net.h> 16 + #include <linux/skbuff.h> 17 + #include <linux/slab.h> 18 + #include <linux/udp.h> 19 + #include <linux/ip.h> 20 + #include <net/sock.h> 21 + #include <net/af_rxrpc.h> 22 + #include <generated/utsrelease.h> 23 + #include "ar-internal.h" 24 + 25 + static const char rxrpc_version_string[65] = "linux-" UTS_RELEASE " AF_RXRPC"; 26 + 27 + /* 28 + * Reply to a version request 29 + */ 30 + static void rxrpc_send_version_request(struct rxrpc_local *local, 31 + struct rxrpc_host_header *hdr, 32 + struct sk_buff *skb) 33 + { 34 + struct rxrpc_wire_header whdr; 35 + struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 36 + struct sockaddr_in sin; 37 + struct msghdr msg; 38 + struct kvec iov[2]; 39 + size_t len; 40 + int ret; 41 + 42 + _enter(""); 43 + 44 + sin.sin_family = AF_INET; 45 + sin.sin_port = udp_hdr(skb)->source; 46 + sin.sin_addr.s_addr = ip_hdr(skb)->saddr; 47 + 48 + msg.msg_name = &sin; 49 + msg.msg_namelen = sizeof(sin); 50 + msg.msg_control = NULL; 51 + msg.msg_controllen = 0; 52 + msg.msg_flags = 0; 53 + 54 + whdr.epoch = htonl(sp->hdr.epoch); 55 + whdr.cid = htonl(sp->hdr.cid); 56 + whdr.callNumber = htonl(sp->hdr.callNumber); 57 + whdr.seq = 0; 58 + whdr.serial = 0; 59 + whdr.type = RXRPC_PACKET_TYPE_VERSION; 60 + whdr.flags = RXRPC_LAST_PACKET | (~hdr->flags & RXRPC_CLIENT_INITIATED); 61 + whdr.userStatus = 0; 62 + whdr.securityIndex = 0; 63 + whdr._rsvd = 0; 64 + whdr.serviceId = htons(sp->hdr.serviceId); 65 + 66 + iov[0].iov_base = &whdr; 67 + iov[0].iov_len = sizeof(whdr); 68 + iov[1].iov_base = (char *)rxrpc_version_string; 69 + iov[1].iov_len = sizeof(rxrpc_version_string); 70 + 71 + len = iov[0].iov_len + iov[1].iov_len; 72 + 73 + _proto("Tx VERSION (reply)"); 74 + 75 + ret = kernel_sendmsg(local->socket, &msg, iov, 2, len); 76 + if (ret < 0) 77 + _debug("sendmsg failed: %d", ret); 78 + 79 + _leave(""); 80 + } 81 + 82 + /* 83 + * Process event packets targetted at a local endpoint. 84 + */ 85 + void rxrpc_process_local_events(struct work_struct *work) 86 + { 87 + struct rxrpc_local *local = container_of(work, struct rxrpc_local, event_processor); 88 + struct sk_buff *skb; 89 + char v; 90 + 91 + _enter(""); 92 + 93 + atomic_inc(&local->usage); 94 + 95 + while ((skb = skb_dequeue(&local->event_queue))) { 96 + struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 97 + 98 + _debug("{%d},{%u}", local->debug_id, sp->hdr.type); 99 + 100 + switch (sp->hdr.type) { 101 + case RXRPC_PACKET_TYPE_VERSION: 102 + if (skb_copy_bits(skb, 0, &v, 1) < 0) 103 + return; 104 + _proto("Rx VERSION { %02x }", v); 105 + if (v == 0) 106 + rxrpc_send_version_request(local, &sp->hdr, skb); 107 + break; 108 + 109 + default: 110 + /* Just ignore anything we don't understand */ 111 + break; 112 + } 113 + 114 + rxrpc_put_local(local); 115 + rxrpc_free_skb(skb); 116 + } 117 + 118 + rxrpc_put_local(local); 119 + _leave(""); 120 + }
+3 -102
net/rxrpc/local_object.c
··· 1 - /* AF_RXRPC local endpoint management 1 + /* Local endpoint object management 2 2 * 3 3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. 4 4 * Written by David Howells (dhowells@redhat.com) 5 5 * 6 6 * This program is free software; you can redistribute it and/or 7 - * modify it under the terms of the GNU General Public License 7 + * modify it under the terms of the GNU General Public Licence 8 8 * as published by the Free Software Foundation; either version 9 - * 2 of the License, or (at your option) any later version. 9 + * 2 of the Licence, or (at your option) any later version. 10 10 */ 11 11 12 12 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt ··· 19 19 #include <linux/ip.h> 20 20 #include <net/sock.h> 21 21 #include <net/af_rxrpc.h> 22 - #include <generated/utsrelease.h> 23 22 #include "ar-internal.h" 24 - 25 - static const char rxrpc_version_string[65] = "linux-" UTS_RELEASE " AF_RXRPC"; 26 23 27 24 static LIST_HEAD(rxrpc_locals); 28 25 DEFINE_RWLOCK(rxrpc_local_lock); ··· 27 30 static DECLARE_WAIT_QUEUE_HEAD(rxrpc_local_wq); 28 31 29 32 static void rxrpc_destroy_local(struct work_struct *work); 30 - static void rxrpc_process_local_events(struct work_struct *work); 31 33 32 34 /* 33 35 * allocate a new local ··· 314 318 set_current_state(TASK_RUNNING); 315 319 } 316 320 317 - _leave(""); 318 - } 319 - 320 - /* 321 - * Reply to a version request 322 - */ 323 - static void rxrpc_send_version_request(struct rxrpc_local *local, 324 - struct rxrpc_host_header *hdr, 325 - struct sk_buff *skb) 326 - { 327 - struct rxrpc_wire_header whdr; 328 - struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 329 - struct sockaddr_in sin; 330 - struct msghdr msg; 331 - struct kvec iov[2]; 332 - size_t len; 333 - int ret; 334 - 335 - _enter(""); 336 - 337 - sin.sin_family = AF_INET; 338 - sin.sin_port = udp_hdr(skb)->source; 339 - sin.sin_addr.s_addr = ip_hdr(skb)->saddr; 340 - 341 - msg.msg_name = &sin; 342 - msg.msg_namelen = sizeof(sin); 343 - msg.msg_control = NULL; 344 - msg.msg_controllen = 0; 345 - msg.msg_flags = 0; 346 - 347 - whdr.epoch = htonl(sp->hdr.epoch); 348 - whdr.cid = htonl(sp->hdr.cid); 349 - whdr.callNumber = htonl(sp->hdr.callNumber); 350 - whdr.seq = 0; 351 - whdr.serial = 0; 352 - whdr.type = RXRPC_PACKET_TYPE_VERSION; 353 - whdr.flags = RXRPC_LAST_PACKET | (~hdr->flags & RXRPC_CLIENT_INITIATED); 354 - whdr.userStatus = 0; 355 - whdr.securityIndex = 0; 356 - whdr._rsvd = 0; 357 - whdr.serviceId = htons(sp->hdr.serviceId); 358 - 359 - iov[0].iov_base = &whdr; 360 - iov[0].iov_len = sizeof(whdr); 361 - iov[1].iov_base = (char *)rxrpc_version_string; 362 - iov[1].iov_len = sizeof(rxrpc_version_string); 363 - 364 - len = iov[0].iov_len + iov[1].iov_len; 365 - 366 - _proto("Tx VERSION (reply)"); 367 - 368 - ret = kernel_sendmsg(local->socket, &msg, iov, 2, len); 369 - if (ret < 0) 370 - _debug("sendmsg failed: %d", ret); 371 - 372 - _leave(""); 373 - } 374 - 375 - /* 376 - * Process event packets targetted at a local endpoint. 377 - */ 378 - static void rxrpc_process_local_events(struct work_struct *work) 379 - { 380 - struct rxrpc_local *local = container_of(work, struct rxrpc_local, event_processor); 381 - struct sk_buff *skb; 382 - char v; 383 - 384 - _enter(""); 385 - 386 - atomic_inc(&local->usage); 387 - 388 - while ((skb = skb_dequeue(&local->event_queue))) { 389 - struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 390 - 391 - _debug("{%d},{%u}", local->debug_id, sp->hdr.type); 392 - 393 - switch (sp->hdr.type) { 394 - case RXRPC_PACKET_TYPE_VERSION: 395 - if (skb_copy_bits(skb, 0, &v, 1) < 0) 396 - return; 397 - _proto("Rx VERSION { %02x }", v); 398 - if (v == 0) 399 - rxrpc_send_version_request(local, &sp->hdr, skb); 400 - break; 401 - 402 - default: 403 - /* Just ignore anything we don't understand */ 404 - break; 405 - } 406 - 407 - rxrpc_put_local(local); 408 - rxrpc_free_skb(skb); 409 - } 410 - 411 - rxrpc_put_local(local); 412 321 _leave(""); 413 322 }