Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame^] | 1 | /* |
| 2 | * IrNET protocol module : Synchronous PPP over an IrDA socket. |
| 3 | * |
| 4 | * Jean II - HPL `00 - <jt@hpl.hp.com> |
| 5 | * |
| 6 | * This file contains all definitions and declarations necessary for the |
| 7 | * IRDA part of the IrNET module (dealing with IrTTP, IrIAS and co). |
| 8 | * This file is a private header, so other modules don't want to know |
| 9 | * what's in there... |
| 10 | */ |
| 11 | |
| 12 | #ifndef IRNET_IRDA_H |
| 13 | #define IRNET_IRDA_H |
| 14 | |
| 15 | /***************************** INCLUDES *****************************/ |
| 16 | /* Please add other headers in irnet.h */ |
| 17 | |
| 18 | #include "irnet.h" /* Module global include */ |
| 19 | |
| 20 | /************************ CONSTANTS & MACROS ************************/ |
| 21 | |
| 22 | /* |
| 23 | * Name of the service (socket name) used by IrNET |
| 24 | */ |
| 25 | /* IAS object name (or part of it) */ |
| 26 | #define IRNET_SERVICE_NAME "IrNetv1" |
| 27 | /* IAS attribute */ |
| 28 | #define IRNET_IAS_VALUE "IrDA:TinyTP:LsapSel" |
| 29 | /* LMP notify name for client (only for /proc/net/irda/irlmp) */ |
| 30 | #define IRNET_NOTIFY_NAME "IrNET socket" |
| 31 | /* LMP notify name for server (only for /proc/net/irda/irlmp) */ |
| 32 | #define IRNET_NOTIFY_NAME_SERV "IrNET server" |
| 33 | |
| 34 | /****************************** TYPES ******************************/ |
| 35 | |
| 36 | /* |
| 37 | * This is the main structure where we store all the data pertaining to |
| 38 | * the IrNET server (listen for connection requests) and the root |
| 39 | * of the IrNET socket list |
| 40 | */ |
| 41 | typedef struct irnet_root |
| 42 | { |
| 43 | irnet_socket s; /* To pretend we are a client... */ |
| 44 | |
| 45 | /* Generic stuff */ |
| 46 | int magic; /* Paranoia */ |
| 47 | int running; /* Are we operational ? */ |
| 48 | |
| 49 | /* Link list of all IrNET instances opened */ |
| 50 | hashbin_t * list; |
| 51 | spinlock_t spinlock; /* Serialize access to the list */ |
| 52 | /* Note : the way hashbin has been designed is absolutely not |
| 53 | * reentrant, beware... So, we blindly protect all with spinlock */ |
| 54 | |
| 55 | /* Handle for the hint bit advertised in IrLMP */ |
| 56 | void * skey; |
| 57 | |
| 58 | /* Server socket part */ |
| 59 | struct ias_object * ias_obj; /* Our service name + lsap in IAS */ |
| 60 | |
| 61 | } irnet_root; |
| 62 | |
| 63 | |
| 64 | /**************************** PROTOTYPES ****************************/ |
| 65 | |
| 66 | /* ----------------------- CONTROL CHANNEL ----------------------- */ |
| 67 | static void |
| 68 | irnet_post_event(irnet_socket *, |
| 69 | irnet_event, |
| 70 | __u32, |
| 71 | __u32, |
| 72 | char *, |
| 73 | __u16); |
| 74 | /* ----------------------- IRDA SUBROUTINES ----------------------- */ |
| 75 | static inline int |
| 76 | irnet_open_tsap(irnet_socket *); |
| 77 | static inline __u8 |
| 78 | irnet_ias_to_tsap(irnet_socket *, |
| 79 | int, |
| 80 | struct ias_value *); |
| 81 | static inline int |
| 82 | irnet_find_lsap_sel(irnet_socket *); |
| 83 | static inline int |
| 84 | irnet_connect_tsap(irnet_socket *); |
| 85 | static inline int |
| 86 | irnet_discover_next_daddr(irnet_socket *); |
| 87 | static inline int |
| 88 | irnet_discover_daddr_and_lsap_sel(irnet_socket *); |
| 89 | static inline int |
| 90 | irnet_dname_to_daddr(irnet_socket *); |
| 91 | /* ------------------------ SERVER SOCKET ------------------------ */ |
| 92 | static inline int |
| 93 | irnet_daddr_to_dname(irnet_socket *); |
| 94 | static inline irnet_socket * |
| 95 | irnet_find_socket(irnet_socket *); |
| 96 | static inline int |
| 97 | irnet_connect_socket(irnet_socket *, |
| 98 | irnet_socket *, |
| 99 | struct qos_info *, |
| 100 | __u32, |
| 101 | __u8); |
| 102 | static inline void |
| 103 | irnet_disconnect_server(irnet_socket *, |
| 104 | struct sk_buff *); |
| 105 | static inline int |
| 106 | irnet_setup_server(void); |
| 107 | static inline void |
| 108 | irnet_destroy_server(void); |
| 109 | /* ---------------------- IRDA-TTP CALLBACKS ---------------------- */ |
| 110 | static int |
| 111 | irnet_data_indication(void *, /* instance */ |
| 112 | void *, /* sap */ |
| 113 | struct sk_buff *); |
| 114 | static void |
| 115 | irnet_disconnect_indication(void *, |
| 116 | void *, |
| 117 | LM_REASON, |
| 118 | struct sk_buff *); |
| 119 | static void |
| 120 | irnet_connect_confirm(void *, |
| 121 | void *, |
| 122 | struct qos_info *, |
| 123 | __u32, |
| 124 | __u8, |
| 125 | struct sk_buff *); |
| 126 | static void |
| 127 | irnet_flow_indication(void *, |
| 128 | void *, |
| 129 | LOCAL_FLOW); |
| 130 | static void |
| 131 | irnet_status_indication(void *, |
| 132 | LINK_STATUS, |
| 133 | LOCK_STATUS); |
| 134 | static void |
| 135 | irnet_connect_indication(void *, |
| 136 | void *, |
| 137 | struct qos_info *, |
| 138 | __u32, |
| 139 | __u8, |
| 140 | struct sk_buff *); |
| 141 | /* -------------------- IRDA-IAS/LMP CALLBACKS -------------------- */ |
| 142 | static void |
| 143 | irnet_getvalue_confirm(int, |
| 144 | __u16, |
| 145 | struct ias_value *, |
| 146 | void *); |
| 147 | static void |
| 148 | irnet_discovervalue_confirm(int, |
| 149 | __u16, |
| 150 | struct ias_value *, |
| 151 | void *); |
| 152 | #ifdef DISCOVERY_EVENTS |
| 153 | static void |
| 154 | irnet_discovery_indication(discinfo_t *, |
| 155 | DISCOVERY_MODE, |
| 156 | void *); |
| 157 | static void |
| 158 | irnet_expiry_indication(discinfo_t *, |
| 159 | DISCOVERY_MODE, |
| 160 | void *); |
| 161 | #endif |
| 162 | /* -------------------------- PROC ENTRY -------------------------- */ |
| 163 | #ifdef CONFIG_PROC_FS |
| 164 | static int |
| 165 | irnet_proc_read(char *, |
| 166 | char **, |
| 167 | off_t, |
| 168 | int); |
| 169 | #endif /* CONFIG_PROC_FS */ |
| 170 | |
| 171 | /**************************** VARIABLES ****************************/ |
| 172 | |
| 173 | /* |
| 174 | * The IrNET server. Listen to connection requests and co... |
| 175 | */ |
| 176 | static struct irnet_root irnet_server; |
| 177 | |
| 178 | /* Control channel stuff (note : extern) */ |
| 179 | struct irnet_ctrl_channel irnet_events; |
| 180 | |
| 181 | /* The /proc/net/irda directory, defined elsewhere... */ |
| 182 | #ifdef CONFIG_PROC_FS |
| 183 | extern struct proc_dir_entry *proc_irda; |
| 184 | #endif /* CONFIG_PROC_FS */ |
| 185 | |
| 186 | #endif /* IRNET_IRDA_H */ |