Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ipx.h
Go to the documentation of this file.
1 #ifndef _NET_INET_IPX_H_
2 #define _NET_INET_IPX_H_
3 /*
4  * The following information is in its entirety obtained from:
5  *
6  * Novell 'IPX Router Specification' Version 1.10
7  * Part No. 107-000029-001
8  *
9  * Which is available from ftp.novell.com
10  */
11 
12 #include <linux/netdevice.h>
13 #include <net/datalink.h>
14 #include <linux/ipx.h>
15 #include <linux/list.h>
16 #include <linux/slab.h>
17 
18 struct ipx_address {
22 };
23 
24 #define ipx_broadcast_node "\377\377\377\377\377\377"
25 #define ipx_this_node "\0\0\0\0\0\0"
26 
27 #define IPX_MAX_PPROP_HOPS 8
28 
29 struct ipxhdr {
30  __be16 ipx_checksum __packed;
31 #define IPX_NO_CHECKSUM cpu_to_be16(0xFFFF)
32  __be16 ipx_pktsize __packed;
35 #define IPX_TYPE_UNKNOWN 0x00
36 #define IPX_TYPE_RIP 0x01 /* may also be 0 */
37 #define IPX_TYPE_SAP 0x04 /* may also be 0 */
38 #define IPX_TYPE_SPX 0x05 /* SPX protocol */
39 #define IPX_TYPE_NCP 0x11 /* $lots for docs on this (SPIT) */
40 #define IPX_TYPE_PPROP 0x14 /* complicated flood fill brdcast */
41  struct ipx_address ipx_dest __packed;
42  struct ipx_address ipx_source __packed;
43 };
44 
45 static __inline__ struct ipxhdr *ipx_hdr(struct sk_buff *skb)
46 {
47  return (struct ipxhdr *)skb_transport_header(skb);
48 }
49 
50 struct ipx_interface {
51  /* IPX address */
53  unsigned char if_node[IPX_NODE_LEN];
55 
56  /* physical device info */
57  struct net_device *if_dev;
60 
61  /* socket support */
62  unsigned short if_sknum;
65 
66  /* administrative overhead */
68  unsigned char if_internal;
69  unsigned char if_primary;
70 
71  struct list_head node; /* node in ipx_interfaces list */
72 };
73 
74 struct ipx_route {
77  unsigned char ir_routed;
78  unsigned char ir_router_node[IPX_NODE_LEN];
79  struct list_head node; /* node in ipx_routes list */
81 };
82 
83 struct ipx_cb {
87  struct {
89  int index;
90  } last_hop;
91 };
92 
93 #include <net/sock.h>
94 
95 struct ipx_sock {
96  /* struct sock has to be the first member of ipx_sock */
97  struct sock sk;
101 #ifdef CONFIG_IPX_INTERN
102  unsigned char node[IPX_NODE_LEN];
103 #endif
104  unsigned short type;
105  /*
106  * To handle special ncp connection-handling sockets for mars_nwe,
107  * the connection number must be stored in the socket.
108  */
109  unsigned short ipx_ncp_conn;
110 };
111 
112 static inline struct ipx_sock *ipx_sk(struct sock *sk)
113 {
114  return (struct ipx_sock *)sk;
115 }
116 
117 #define IPX_SKB_CB(__skb) ((struct ipx_cb *)&((__skb)->cb[0]))
118 
119 #define IPX_MIN_EPHEMERAL_SOCKET 0x4000
120 #define IPX_MAX_EPHEMERAL_SOCKET 0x7fff
121 
122 extern struct list_head ipx_routes;
124 
125 extern struct list_head ipx_interfaces;
126 extern struct ipx_interface *ipx_interfaces_head(void);
128 
129 extern struct ipx_interface *ipx_primary_net;
130 
131 extern int ipx_proc_init(void);
132 extern void ipx_proc_exit(void);
133 
134 extern const char *ipx_frame_name(__be16);
135 extern const char *ipx_device_name(struct ipx_interface *intrfc);
136 
137 static __inline__ void ipxitf_hold(struct ipx_interface *intrfc)
138 {
139  atomic_inc(&intrfc->refcnt);
140 }
141 
142 extern void ipxitf_down(struct ipx_interface *intrfc);
143 
144 static __inline__ void ipxitf_put(struct ipx_interface *intrfc)
145 {
146  if (atomic_dec_and_test(&intrfc->refcnt))
147  ipxitf_down(intrfc);
148 }
149 
150 static __inline__ void ipxrtr_hold(struct ipx_route *rt)
151 {
152  atomic_inc(&rt->refcnt);
153 }
154 
155 static __inline__ void ipxrtr_put(struct ipx_route *rt)
156 {
157  if (atomic_dec_and_test(&rt->refcnt))
158  kfree(rt);
159 }
160 #endif /* _NET_INET_IPX_H_ */