summaryrefslogtreecommitdiff
path: root/include/rxrpc/transport.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/rxrpc/transport.h')
-rw-r--r--include/rxrpc/transport.h106
1 files changed, 106 insertions, 0 deletions
diff --git a/include/rxrpc/transport.h b/include/rxrpc/transport.h
new file mode 100644
index 000000000000..7c7b9683fa39
--- /dev/null
+++ b/include/rxrpc/transport.h
@@ -0,0 +1,106 @@
+/* transport.h: Rx transport management
+ *
+ * Copyright (C) 2002 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.
+ */
+
+#ifndef _LINUX_RXRPC_TRANSPORT_H
+#define _LINUX_RXRPC_TRANSPORT_H
+
+#include <rxrpc/types.h>
+#include <rxrpc/krxiod.h>
+#include <rxrpc/rxrpc.h>
+#include <linux/skbuff.h>
+#include <linux/rwsem.h>
+
+typedef int (*rxrpc_newcall_fnx_t)(struct rxrpc_call *call);
+
+extern wait_queue_head_t rxrpc_krxiod_wq;
+
+/*****************************************************************************/
+/*
+ * Rx operation specification
+ * - tables of these must be sorted by op ID so that they can be binary-chop searched
+ */
+struct rxrpc_operation
+{
+ unsigned id; /* operation ID */
+ size_t asize; /* minimum size of argument block */
+ const char *name; /* name of operation */
+ void *user; /* initial user data */
+};
+
+/*****************************************************************************/
+/*
+ * Rx transport service record
+ */
+struct rxrpc_service
+{
+ struct list_head link; /* link in services list on transport */
+ struct module *owner; /* owner module */
+ rxrpc_newcall_fnx_t new_call; /* new call handler function */
+ const char *name; /* name of service */
+ unsigned short service_id; /* Rx service ID */
+ rxrpc_call_attn_func_t attn_func; /* call requires attention callback */
+ rxrpc_call_error_func_t error_func; /* call error callback */
+ rxrpc_call_aemap_func_t aemap_func; /* abort -> errno mapping callback */
+
+ const struct rxrpc_operation *ops_begin; /* beginning of operations table */
+ const struct rxrpc_operation *ops_end; /* end of operations table */
+};
+
+/*****************************************************************************/
+/*
+ * Rx transport endpoint record
+ */
+struct rxrpc_transport
+{
+ atomic_t usage;
+ struct socket *socket; /* my UDP socket */
+ struct list_head services; /* services listening on this socket */
+ struct list_head link; /* link in transport list */
+ struct list_head proc_link; /* link in transport proc list */
+ struct list_head krxiodq_link; /* krxiod attention queue link */
+ spinlock_t lock; /* access lock */
+ struct list_head peer_active; /* active peers connected to over this socket */
+ struct list_head peer_graveyard; /* inactive peer list */
+ spinlock_t peer_gylock; /* peer graveyard lock */
+ wait_queue_head_t peer_gy_waitq; /* wait queue hit when peer graveyard is empty */
+ rwlock_t peer_lock; /* peer list access lock */
+ atomic_t peer_count; /* number of peers */
+ struct rxrpc_peer_ops *peer_ops; /* default peer operations */
+ unsigned short port; /* port upon which listening */
+ volatile char error_rcvd; /* T if received ICMP error outstanding */
+};
+
+extern int rxrpc_create_transport(unsigned short port,
+ struct rxrpc_transport **_trans);
+
+static inline void rxrpc_get_transport(struct rxrpc_transport *trans)
+{
+ BUG_ON(atomic_read(&trans->usage) <= 0);
+ atomic_inc(&trans->usage);
+ //printk("rxrpc_get_transport(%p{u=%d})\n",
+ // trans, atomic_read(&trans->usage));
+}
+
+extern void rxrpc_put_transport(struct rxrpc_transport *trans);
+
+extern int rxrpc_add_service(struct rxrpc_transport *trans,
+ struct rxrpc_service *srv);
+
+extern void rxrpc_del_service(struct rxrpc_transport *trans,
+ struct rxrpc_service *srv);
+
+extern void rxrpc_trans_receive_packet(struct rxrpc_transport *trans);
+
+extern int rxrpc_trans_immediate_abort(struct rxrpc_transport *trans,
+ struct rxrpc_message *msg,
+ int error);
+
+#endif /* _LINUX_RXRPC_TRANSPORT_H */