af_ipx.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:66k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Implements an IPX socket layer.
  3.  *
  4.  * This code is derived from work by
  5.  * Ross Biro :  Writing the original IP stack
  6.  * Fred Van Kempen : Tidying up the TCP/IP
  7.  *
  8.  * Many thanks go to Keith Baker, Institute For Industrial Information
  9.  * Technology Ltd, Swansea University for allowing me to work on this
  10.  * in my own time even though it was in some ways related to commercial
  11.  * work I am currently employed to do there.
  12.  *
  13.  * All the material in this file is subject to the Gnu license version 2.
  14.  * Neither Alan Cox nor the Swansea University Computer Society admit 
  15.  * liability nor provide warranty for any of this software. This material
  16.  * is provided as is and at no charge.
  17.  *
  18.  * Revision 0.21: Uses the new generic socket option code.
  19.  * Revision 0.22: Gcc clean ups and drop out device registration. Use the
  20.  * new multi-protocol edition of hard_header
  21.  * Revision 0.23:  IPX /proc by Mark Evans. Adding a route will
  22.  *      will overwrite any existing route to the same network.
  23.  * Revision 0.24: Supports new /proc with no 4K limit
  24.  * Revision 0.25: Add ephemeral sockets, passive local network
  25.  * identification, support for local net 0 and
  26.  * multiple datalinks <Greg Page>
  27.  * Revision 0.26:  Device drop kills IPX routes via it. (needed for module)
  28.  * Revision 0.27:  Autobind <Mark Evans>
  29.  * Revision 0.28:  Small fix for multiple local networks <Thomas Winder>
  30.  * Revision 0.29:  Assorted major errors removed <Mark Evans>
  31.  * Small correction to promisc mode error fix <Alan Cox>
  32.  * Asynchronous I/O support. Changed to use notifiers
  33.  * and the newer packet_type stuff. Assorted major
  34.  * fixes <Alejandro Liu>
  35.  * Revision 0.30: Moved to net/ipx/... <Alan Cox>
  36.  * Don't set address length on recvfrom that errors.
  37.  * Incorrect verify_area.
  38.  * Revision 0.31: New sk_buffs. This still needs a lot of 
  39.  * testing. <Alan Cox>
  40.  * Revision 0.32:  Using sock_alloc_send_skb, firewall hooks. <Alan Cox>
  41.  * Supports sendmsg/recvmsg
  42.  * Revision 0.33: Internal network support, routing changes, uses a
  43.  * protocol private area for ipx data.
  44.  * Revision 0.34: Module support. <Jim Freeman>
  45.  * Revision 0.35:  Checksum support. <Neil Turton>, hooked in by <Alan Cox>
  46.  * Handles WIN95 discovery packets <Volker Lendecke>
  47.  * Revision 0.36: Internal bump up for 2.1
  48.  * Revision 0.37: Began adding POSIXisms.
  49.  * Revision 0.38:  Asynchronous socket stuff made current.
  50.  * Revision 0.39:  SPX interfaces
  51.  * Revision 0.40:  Tiny SIOCGSTAMP fix (chris@cybernet.co.nz)
  52.  *      Revision 0.41:  802.2TR removed (p.norton@computer.org)
  53.  * Fixed connecting to primary net,
  54.  * Automatic binding on send & receive,
  55.  * Martijn van Oosterhout <kleptogimp@geocities.com>
  56.  * Revision 042:   Multithreading - use spinlocks and refcounting to
  57.  * protect some structures: ipx_interface sock list, list
  58.  * of ipx interfaces, etc. 
  59.  * Bugfixes - do refcounting on net_devices, check function
  60.  * results, etc. Thanks to davem and freitag for
  61.  * suggestions and guidance.
  62.  * Arnaldo Carvalho de Melo <acme@conectiva.com.br>,
  63.  * November, 2000
  64.  * Revision 043: Shared SKBs, don't mangle packets, some cleanups
  65.  * Arnaldo Carvalho de Melo <acme@conectiva.com.br>,
  66.  * December, 2000
  67.  * Revision 044: Call ipxitf_hold on NETDEV_UP (acme)
  68.  * Revision 045: fix PPROP routing bug (acme)
  69.  * Revision 046: Further fixes to PPROP, ipxitf_create_internal was
  70.  * doing an unneeded MOD_INC_USE_COUNT, implement
  71.  * sysctl for ipx_pprop_broacasting, fix the ipx sysctl
  72.  * handling, making it dynamic, some cleanups, thanks to
  73.  * Petr Vandrovec for review and good suggestions. (acme)
  74.  * Revision 047: Cleanups, CodingStyle changes, move the ncp connection
  75.  * hack out of line (acme)
  76.  *
  77.  * Protect the module by a MOD_INC_USE_COUNT/MOD_DEC_USE_COUNT
  78.  * pair. Also, now usage count is managed this way
  79.  * -Count one if the auto_interface mode is on
  80.  *      -Count one per configured interface
  81.  *
  82.  * Jacques Gelinas (jacques@solucorp.qc.ca)
  83.  *
  84.  *
  85.  *  Portions Copyright (c) 1995 Caldera, Inc. <greg@caldera.com>
  86.  * Neither Greg Page nor Caldera, Inc. admit liability nor provide
  87.  * warranty for any of this software. This material is provided
  88.  * "AS-IS" and at no charge.
  89.  */
  90. #include <linux/config.h>
  91. #include <linux/module.h>
  92. #include <linux/errno.h>
  93. #include <linux/types.h>
  94. #include <linux/socket.h>
  95. #include <linux/in.h>
  96. #include <linux/kernel.h>
  97. #include <linux/sched.h>
  98. #include <linux/timer.h>
  99. #include <linux/string.h>
  100. #include <linux/sockios.h>
  101. #include <linux/net.h>
  102. #include <linux/netdevice.h>
  103. #include <net/ipx.h>
  104. #include <linux/inet.h>
  105. #include <linux/route.h>
  106. #include <net/sock.h>
  107. #include <asm/uaccess.h>
  108. #include <asm/system.h>
  109. #include <linux/fcntl.h>
  110. #include <linux/mm.h>
  111. #include <linux/termios.h> /* For TIOCOUTQ/INQ */
  112. #include <linux/interrupt.h>
  113. #include <net/p8022.h>
  114. #include <net/psnap.h>
  115. #include <linux/proc_fs.h>
  116. #include <linux/stat.h>
  117. #include <linux/init.h>
  118. #include <linux/if_arp.h>
  119. #ifdef CONFIG_SYSCTL
  120. extern void ipx_register_sysctl(void);
  121. extern void ipx_unregister_sysctl(void);
  122. #else
  123. #define ipx_register_sysctl()
  124. #define ipx_unregister_sysctl()
  125. #endif
  126. /* Configuration Variables */
  127. static unsigned char ipxcfg_max_hops = 16;
  128. static char ipxcfg_auto_select_primary;
  129. static char ipxcfg_auto_create_interfaces;
  130. int sysctl_ipx_pprop_broadcasting = 1;
  131. /* Global Variables */
  132. static struct datalink_proto *p8022_datalink;
  133. static struct datalink_proto *pEII_datalink;
  134. static struct datalink_proto *p8023_datalink;
  135. static struct datalink_proto *pSNAP_datalink;
  136. static struct proto_ops ipx_dgram_ops;
  137. static struct net_proto_family *spx_family_ops;
  138. static ipx_route *ipx_routes;
  139. static rwlock_t ipx_routes_lock = RW_LOCK_UNLOCKED;
  140. static ipx_interface *ipx_interfaces;
  141. static spinlock_t ipx_interfaces_lock = SPIN_LOCK_UNLOCKED;
  142. static ipx_interface *ipx_primary_net;
  143. static ipx_interface *ipx_internal_net;
  144. #define IPX_SKB_CB(__skb) ((struct ipx_cb *)&((__skb)->cb[0]))
  145. #undef IPX_REFCNT_DEBUG
  146. #ifdef IPX_REFCNT_DEBUG
  147. atomic_t ipx_sock_nr;
  148. #endif
  149. static void ipxcfg_set_auto_create(char val)
  150. {
  151. if (ipxcfg_auto_create_interfaces != val) {
  152. if (val)
  153. MOD_INC_USE_COUNT;
  154. else
  155. MOD_DEC_USE_COUNT;
  156. ipxcfg_auto_create_interfaces = val;
  157. }
  158. }
  159. static void ipxcfg_set_auto_select(char val)
  160. {
  161. ipxcfg_auto_select_primary = val;
  162. if (val && !ipx_primary_net)
  163. ipx_primary_net = ipx_interfaces;
  164. }
  165. static int ipxcfg_get_config_data(ipx_config_data *arg)
  166. {
  167. ipx_config_data vals;
  168. vals.ipxcfg_auto_create_interfaces = ipxcfg_auto_create_interfaces;
  169. vals.ipxcfg_auto_select_primary    = ipxcfg_auto_select_primary;
  170. return copy_to_user(arg, &vals, sizeof(vals)) ? -EFAULT : 0;
  171. }
  172. /* Handlers for the socket list. */
  173. static inline void ipxitf_hold(ipx_interface *intrfc)
  174. {
  175. atomic_inc(&intrfc->refcnt);
  176. }
  177. static void ipxitf_down(ipx_interface *intrfc);
  178. static inline void ipxitf_put(ipx_interface *intrfc)
  179. {
  180. if (atomic_dec_and_test(&intrfc->refcnt))
  181. ipxitf_down(intrfc);
  182. }
  183. static void __ipxitf_down(ipx_interface *intrfc);
  184. static inline void __ipxitf_put(ipx_interface *intrfc)
  185. {
  186. if (atomic_dec_and_test(&intrfc->refcnt))
  187. __ipxitf_down(intrfc);
  188. }
  189. /*
  190.  * Note: Sockets may not be removed _during_ an interrupt or inet_bh
  191.  * handler using this technique. They can be added although we do not
  192.  * use this facility.
  193.  */
  194. void ipx_remove_socket(struct sock *sk)
  195. {
  196. struct sock *s;
  197. ipx_interface *intrfc;
  198. /* Determine interface with which socket is associated */
  199. intrfc = sk->protinfo.af_ipx.intrfc;
  200. if (!intrfc)
  201. goto out;
  202. ipxitf_hold(intrfc);
  203. spin_lock_bh(&intrfc->if_sklist_lock);
  204. s = intrfc->if_sklist;
  205. if (s == sk) {
  206. intrfc->if_sklist = s->next;
  207. goto out_unlock;
  208. }
  209. while (s && s->next) {
  210. if (s->next == sk) {
  211. s->next = sk->next;
  212. goto out_unlock;
  213. }
  214. s = s->next;
  215. }
  216. out_unlock:
  217. spin_unlock_bh(&intrfc->if_sklist_lock);
  218. sock_put(sk);
  219. ipxitf_put(intrfc);
  220. out: return;
  221. }
  222. static void ipx_destroy_socket(struct sock *sk)
  223. {
  224. ipx_remove_socket(sk);
  225. skb_queue_purge(&sk->receive_queue);
  226. #ifdef IPX_REFCNT_DEBUG
  227.         atomic_dec(&ipx_sock_nr);
  228.         printk(KERN_DEBUG "IPX socket %p released, %d are still aliven", sk,
  229. atomic_read(&ipx_sock_nr));
  230. if (atomic_read(&sk->refcnt) != 1)
  231. printk(KERN_DEBUG "Destruction sock ipx %p delayed, cnt=%dn",
  232. sk, atomic_read(&sk->refcnt));
  233. #endif
  234. sock_put(sk);
  235. }
  236. /* 
  237.  * The following code is used to support IPX Interfaces (IPXITF).  An
  238.  * IPX interface is defined by a physical device and a frame type.
  239.  */
  240. static ipx_route * ipxrtr_lookup(__u32);
  241. /* ipxitf_clear_primary_net has to be called with ipx_interfaces_lock held */
  242. static void ipxitf_clear_primary_net(void)
  243. {
  244. ipx_primary_net = ipxcfg_auto_select_primary ? ipx_interfaces : NULL;
  245. }
  246. static ipx_interface *__ipxitf_find_using_phys(struct net_device *dev,
  247. unsigned short datalink)
  248. {
  249. ipx_interface *i = ipx_interfaces;
  250. while (i && (i->if_dev != dev || i->if_dlink_type != datalink))
  251. i = i->if_next;
  252. return i;
  253. }
  254. static ipx_interface *ipxitf_find_using_phys(struct net_device *dev,
  255. unsigned short datalink)
  256. {
  257. ipx_interface *i;
  258. spin_lock_bh(&ipx_interfaces_lock);
  259. i = __ipxitf_find_using_phys(dev, datalink);
  260. if (i)
  261. ipxitf_hold(i);
  262. spin_unlock_bh(&ipx_interfaces_lock);
  263. return i;
  264. }
  265. static ipx_interface *ipxitf_find_using_net(__u32 net)
  266. {
  267. ipx_interface *i;
  268. spin_lock_bh(&ipx_interfaces_lock);
  269. if (net)
  270. for (i = ipx_interfaces; i && i->if_netnum != net;
  271.      i = i->if_next)
  272. ;
  273. else
  274. i = ipx_primary_net;
  275. if (i)
  276. ipxitf_hold(i);
  277. spin_unlock_bh(&ipx_interfaces_lock);
  278. return i;
  279. }
  280. /* Sockets are bound to a particular IPX interface. */
  281. static void ipxitf_insert_socket(ipx_interface *intrfc, struct sock *sk)
  282. {
  283. ipxitf_hold(intrfc);
  284. sock_hold(sk);
  285. spin_lock_bh(&intrfc->if_sklist_lock);
  286. sk->protinfo.af_ipx.intrfc = intrfc;
  287. sk->next = NULL;
  288. if (!intrfc->if_sklist)
  289. intrfc->if_sklist = sk;
  290. else {
  291. struct sock *s = intrfc->if_sklist;
  292. while (s->next)
  293. s = s->next;
  294. s->next = sk;
  295. }
  296. spin_unlock_bh(&intrfc->if_sklist_lock);
  297. ipxitf_put(intrfc);
  298. }
  299. /* caller must hold intrfc->if_sklist_lock */
  300. static struct sock *__ipxitf_find_socket(ipx_interface *intrfc,
  301.  unsigned short port)
  302. {
  303. struct sock *s = intrfc->if_sklist;
  304. while (s && s->protinfo.af_ipx.port != port)
  305.      s = s->next;
  306. return s;
  307. }
  308. /* caller must hold a reference to intrfc */
  309. static struct sock *ipxitf_find_socket(ipx_interface *intrfc,
  310. unsigned short port)
  311. {
  312. struct sock *s;
  313. spin_lock_bh(&intrfc->if_sklist_lock);
  314. s = __ipxitf_find_socket(intrfc, port);
  315. if (s)
  316. sock_hold(s);
  317. spin_unlock_bh(&intrfc->if_sklist_lock);
  318. return s;
  319. }
  320. #ifdef CONFIG_IPX_INTERN
  321. static struct sock *ipxitf_find_internal_socket(ipx_interface *intrfc,
  322.     unsigned char *node, unsigned short port)
  323. {
  324. struct sock *s;
  325. ipxitf_hold(intrfc);
  326. spin_lock_bh(&intrfc->if_sklist_lock);
  327. s = intrfc->if_sklist;
  328. while (s) {
  329. if (s->protinfo.af_ipx.port == port &&
  330.     !memcmp(node, s->protinfo.af_ipx.node, IPX_NODE_LEN))
  331. break;
  332. s = s->next;
  333. }
  334. spin_unlock_bh(&intrfc->if_sklist_lock);
  335. ipxitf_put(intrfc);
  336. return s;
  337. }
  338. #endif
  339. static void ipxrtr_del_routes(ipx_interface *);
  340. static void __ipxitf_down(ipx_interface *intrfc)
  341. {
  342. struct sock *s, *t;
  343. /* Delete all routes associated with this interface */
  344. ipxrtr_del_routes(intrfc);
  345. spin_lock_bh(&intrfc->if_sklist_lock);
  346. /* error sockets */
  347. for (s = intrfc->if_sklist; s;) {
  348. s->err = ENOLINK;
  349. s->error_report(s);
  350. s->protinfo.af_ipx.intrfc = NULL;
  351. s->protinfo.af_ipx.port   = 0;
  352. s->zapped = 1; /* Indicates it is no longer bound */
  353. t = s;
  354. s = s->next;
  355. t->next = NULL;
  356. }
  357. intrfc->if_sklist = NULL;
  358. spin_unlock_bh(&intrfc->if_sklist_lock);
  359. /* remove this interface from list */
  360. if (intrfc == ipx_interfaces)
  361. ipx_interfaces = intrfc->if_next;
  362. else {
  363. ipx_interface *i = ipx_interfaces;
  364. while (i && i->if_next != intrfc)
  365.      i = i->if_next;
  366. if (i && i->if_next == intrfc)
  367. i->if_next = intrfc->if_next;
  368. }
  369. /* remove this interface from *special* networks */
  370. if (intrfc == ipx_primary_net)
  371. ipxitf_clear_primary_net();
  372. if (intrfc == ipx_internal_net)
  373. ipx_internal_net = NULL;
  374. if (intrfc->if_dev)
  375. dev_put(intrfc->if_dev);
  376. kfree(intrfc);
  377. MOD_DEC_USE_COUNT;
  378. }
  379. static void ipxitf_down(ipx_interface *intrfc)
  380. {
  381. spin_lock_bh(&ipx_interfaces_lock);
  382. __ipxitf_down(intrfc);
  383. spin_unlock_bh(&ipx_interfaces_lock);
  384. }
  385. static int ipxitf_device_event(struct notifier_block *notifier,
  386. unsigned long event, void *ptr)
  387. {
  388. struct net_device *dev = ptr;
  389. ipx_interface *i, *tmp;
  390. if (event != NETDEV_DOWN && event != NETDEV_UP)
  391. goto out;
  392. spin_lock_bh(&ipx_interfaces_lock);
  393. for (i = ipx_interfaces; i;) {
  394. tmp = i->if_next;
  395. if (i->if_dev == dev) {
  396. if (event == NETDEV_UP)
  397. ipxitf_hold(i);
  398. else
  399. __ipxitf_put(i);
  400. }
  401. i = tmp;
  402. }
  403. spin_unlock_bh(&ipx_interfaces_lock);
  404. out: return NOTIFY_DONE;
  405. }
  406. static void ipxitf_def_skb_handler(struct sock *sock, struct sk_buff *skb)
  407. {
  408. if (sock_queue_rcv_skb(sock, skb) < 0)
  409. kfree_skb(skb);
  410. }
  411. /*
  412.  * On input skb->sk is NULL. Nobody is charged for the memory.
  413.  */
  414. /* caller must hold a reference to intrfc */
  415. #ifdef CONFIG_IPX_INTERN
  416. static int ipxitf_demux_socket(ipx_interface *intrfc, struct sk_buff *skb,
  417. int copy)
  418. {
  419. struct ipxhdr *ipx = skb->nh.ipxh;
  420. int is_broadcast = !memcmp(ipx->ipx_dest.node, ipx_broadcast_node,
  421.    IPX_NODE_LEN);
  422. struct sock *s;
  423. int ret;
  424. spin_lock_bh(&intrfc->if_sklist_lock);
  425. s = intrfc->if_sklist;
  426. while (s) {
  427. if (s->protinfo.af_ipx.port == ipx->ipx_dest.sock &&
  428.     (is_broadcast || !memcmp(ipx->ipx_dest.node,
  429.      s->protinfo.af_ipx.node,
  430.      IPX_NODE_LEN))) {
  431. /* We found a socket to which to send */
  432. struct sk_buff *skb1;
  433. if (copy) {
  434. skb1 = skb_clone(skb, GFP_ATOMIC);
  435. ret = -ENOMEM;
  436. if (!skb1)
  437. goto out;
  438. } else {
  439. skb1 = skb;
  440. copy = 1; /* skb may only be used once */
  441. }
  442. ipxitf_def_skb_handler(s, skb1);
  443. /* On an external interface, one socket can listen */
  444. if (intrfc != ipx_internal_net)
  445. break;
  446. }
  447. s = s->next;
  448. }
  449. /* skb was solely for us, and we did not make a copy, so free it. */
  450. if (!copy)
  451. kfree_skb(skb);
  452. ret = 0;
  453. out: spin_unlock_bh(&intrfc->if_sklist_lock);
  454. return ret;
  455. }
  456. #else
  457. static struct sock *ncp_connection_hack(ipx_interface *intrfc,
  458. struct ipxhdr *ipx)
  459. {
  460. /* The packet's target is a NCP connection handler. We want to hand it
  461.  * to the correct socket directly within the kernel, so that the
  462.  * mars_nwe packet distribution process does not have to do it. Here we
  463.  * only care about NCP and BURST packets.
  464.  *
  465.  * You might call this a hack, but believe me, you do not want a
  466.  * complete NCP layer in the kernel, and this is VERY fast as well. */
  467. struct sock *sk = NULL;
  468.   int connection = 0;
  469. u8 *ncphdr = (u8 *)(ipx + 1);
  470.   if (*ncphdr == 0x22 && *(ncphdr + 1) == 0x22) /* NCP request */
  471. connection = (((int) *(ncphdr + 5)) << 8) | (int) *(ncphdr + 3);
  472. else if (*ncphdr == 0x77 && *(ncphdr + 1) == 0x77) /* BURST packet */
  473. connection = (((int) *(ncphdr + 9)) << 8) | (int) *(ncphdr + 8);
  474. if (connection) {
  475. /* Now we have to look for a special NCP connection handling
  476.  * socket. Only these sockets have ipx_ncp_conn != 0, set by
  477.  * SIOCIPXNCPCONN. */
  478. spin_lock_bh(&intrfc->if_sklist_lock);
  479. for (sk = intrfc->if_sklist;
  480.      sk && sk->protinfo.af_ipx.ipx_ncp_conn != connection;
  481.      sk = sk->next);
  482. if (sk)
  483. sock_hold(sk);
  484. spin_unlock_bh(&intrfc->if_sklist_lock);
  485. }
  486. return sk;
  487. }
  488. static int ipxitf_demux_socket(ipx_interface *intrfc, struct sk_buff *skb,
  489. int copy)
  490. {
  491. struct ipxhdr *ipx = skb->nh.ipxh;
  492. struct sock *sock1 = NULL, *sock2 = NULL;
  493. struct sk_buff *skb1 = NULL, *skb2 = NULL;
  494. int ret;
  495. if (intrfc == ipx_primary_net && ntohs(ipx->ipx_dest.sock) == 0x451)
  496. sock1 = ncp_connection_hack(intrfc, ipx);
  497.         if (!sock1)
  498. /* No special socket found, forward the packet the normal way */
  499. sock1 = ipxitf_find_socket(intrfc, ipx->ipx_dest.sock);
  500. /*
  501.  * We need to check if there is a primary net and if
  502.  * this is addressed to one of the *SPECIAL* sockets because
  503.  * these need to be propagated to the primary net.
  504.  * The *SPECIAL* socket list contains: 0x452(SAP), 0x453(RIP) and
  505.  * 0x456(Diagnostic).
  506.  */
  507. if (ipx_primary_net && intrfc != ipx_primary_net) {
  508. const int dsock = ntohs(ipx->ipx_dest.sock);
  509. if (dsock == 0x452 || dsock == 0x453 || dsock == 0x456)
  510. /* The appropriate thing to do here is to dup the
  511.  * packet and route to the primary net interface via
  512.  * ipxitf_send; however, we'll cheat and just demux it
  513.  * here. */
  514. sock2 = ipxitf_find_socket(ipx_primary_net,
  515. ipx->ipx_dest.sock);
  516. }
  517. /*
  518.  * If there is nothing to do return. The kfree will cancel any charging.
  519.  */
  520. if (!sock1 && !sock2) {
  521. if (!copy)
  522. kfree_skb(skb);
  523. return 0;
  524. }
  525. /*
  526.  * This next segment of code is a little awkward, but it sets it up
  527.  * so that the appropriate number of copies of the SKB are made and
  528.  * that skb1 and skb2 point to it (them) so that it (they) can be
  529.  * demuxed to sock1 and/or sock2.  If we are unable to make enough
  530.  * copies, we do as much as is possible.
  531.  */
  532. if (copy)
  533. skb1 = skb_clone(skb, GFP_ATOMIC);
  534. else
  535. skb1 = skb;
  536. ret = -ENOMEM;
  537. if (!skb1)
  538. goto out;
  539. /* Do we need 2 SKBs? */
  540. if (sock1 && sock2)
  541. skb2 = skb_clone(skb1, GFP_ATOMIC);
  542. else
  543. skb2 = skb1;
  544. if (sock1)
  545. ipxitf_def_skb_handler(sock1, skb1);
  546. ret = -ENOMEM;
  547. if (!skb2)
  548. goto out;
  549. if (sock2)
  550. ipxitf_def_skb_handler(sock2, skb2);
  551. ret = 0;
  552. out: if (sock1)
  553. sock_put(sock1);
  554. if (sock2)
  555. sock_put(sock2);
  556. return ret;
  557. }
  558. #endif /* CONFIG_IPX_INTERN */
  559. static struct sk_buff *ipxitf_adjust_skbuff(ipx_interface *intrfc,
  560.     struct sk_buff *skb)
  561. {
  562. struct sk_buff *skb2;
  563. int in_offset = skb->h.raw - skb->head;
  564. int out_offset = intrfc->if_ipx_offset;
  565. int len;
  566. /* Hopefully, most cases */
  567. if (in_offset >= out_offset)
  568. return skb;
  569. /* Need new SKB */
  570. len  = skb->len + out_offset;
  571. skb2 = alloc_skb(len, GFP_ATOMIC);
  572. if (skb2) {
  573. skb_reserve(skb2, out_offset);
  574. skb2->nh.raw = skb2->h.raw = skb_put(skb2, skb->len);
  575. memcpy(skb2->h.raw, skb->h.raw, skb->len);
  576. memcpy(skb2->cb, skb->cb, sizeof(skb->cb));
  577. }
  578. kfree_skb(skb);
  579. return skb2;
  580. }
  581. /* caller must hold a reference to intrfc and the skb has to be unshared */
  582. static int ipxitf_send(ipx_interface *intrfc, struct sk_buff *skb, char *node)
  583. {
  584. struct ipxhdr *ipx = skb->nh.ipxh;
  585. struct net_device *dev = intrfc->if_dev;
  586. struct datalink_proto *dl = intrfc->if_dlink;
  587. char dest_node[IPX_NODE_LEN];
  588. int send_to_wire = 1;
  589. int addr_len;
  590. ipx->ipx_tctrl = IPX_SKB_CB(skb)->ipx_tctrl;
  591. ipx->ipx_dest.net = IPX_SKB_CB(skb)->ipx_dest_net;
  592. ipx->ipx_source.net = IPX_SKB_CB(skb)->ipx_source_net;
  593. /* see if we need to include the netnum in the route list */
  594. if (IPX_SKB_CB(skb)->last_hop.index >= 0) {
  595. u32 *last_hop = (u32 *)(((u8 *) skb->data) +
  596. sizeof(struct ipxhdr) +
  597. IPX_SKB_CB(skb)->last_hop.index *
  598. sizeof(u32));
  599. *last_hop = IPX_SKB_CB(skb)->last_hop.netnum;
  600. IPX_SKB_CB(skb)->last_hop.index = -1;
  601. }
  602. /* 
  603.  * We need to know how many skbuffs it will take to send out this
  604.  * packet to avoid unnecessary copies.
  605.  */
  606.  
  607. if (!dl || !dev || dev->flags & IFF_LOOPBACK) 
  608. send_to_wire = 0; /* No non looped */
  609. /*
  610.  * See if this should be demuxed to sockets on this interface 
  611.  *
  612.  * We want to ensure the original was eaten or that we only use
  613.  * up clones.
  614.  */
  615.  
  616. if (ipx->ipx_dest.net == intrfc->if_netnum) {
  617. /*
  618.  * To our own node, loop and free the original.
  619.  * The internal net will receive on all node address.
  620.  */
  621. if (intrfc == ipx_internal_net ||
  622.     !memcmp(intrfc->if_node, node, IPX_NODE_LEN)) {
  623. /* Don't charge sender */
  624. skb_orphan(skb);
  625. /* Will charge receiver */
  626. return ipxitf_demux_socket(intrfc, skb, 0);
  627. }
  628. /* Broadcast, loop and possibly keep to send on. */
  629. if (!memcmp(ipx_broadcast_node, node, IPX_NODE_LEN)) {
  630. if (!send_to_wire)
  631. skb_orphan(skb);
  632. ipxitf_demux_socket(intrfc, skb, send_to_wire);
  633. if (!send_to_wire)
  634. goto out;
  635. }
  636. }
  637. /*
  638.  * If the originating net is not equal to our net; this is routed
  639.  * We are still charging the sender. Which is right - the driver
  640.  * free will handle this fairly.
  641.  */
  642. if (ipx->ipx_source.net != intrfc->if_netnum) {
  643. /*
  644.  * Unshare the buffer before modifying the count in
  645.  * case its a flood or tcpdump
  646.  */
  647. skb = skb_unshare(skb, GFP_ATOMIC);
  648. if (!skb)
  649. goto out;
  650. if (++ipx->ipx_tctrl > ipxcfg_max_hops)
  651. send_to_wire = 0;
  652. }
  653. if (!send_to_wire) {
  654. kfree_skb(skb);
  655. goto out;
  656. }
  657. /* Determine the appropriate hardware address */
  658. addr_len = dev->addr_len;
  659. if (!memcmp(ipx_broadcast_node, node, IPX_NODE_LEN))
  660. memcpy(dest_node, dev->broadcast, addr_len);
  661. else
  662. memcpy(dest_node, &(node[IPX_NODE_LEN-addr_len]), addr_len);
  663. /* Make any compensation for differing physical/data link size */
  664. skb = ipxitf_adjust_skbuff(intrfc, skb);
  665. if (!skb)
  666. goto out;
  667. /* set up data link and physical headers */
  668. skb->dev = dev;
  669. skb->protocol = __constant_htons(ETH_P_IPX);
  670. dl->datalink_header(dl, skb, dest_node);
  671. /* Send it out */
  672. dev_queue_xmit(skb);
  673. out: return 0;
  674. }
  675. static int ipxrtr_add_route(__u32, ipx_interface *, unsigned char *);
  676. static int ipxitf_add_local_route(ipx_interface *intrfc)
  677. {
  678. return ipxrtr_add_route(intrfc->if_netnum, intrfc, NULL);
  679. }
  680. static const char * ipx_frame_name(unsigned short);
  681. static const char * ipx_device_name(ipx_interface *);
  682. static void ipxitf_discover_netnum(ipx_interface *intrfc, struct sk_buff *skb);
  683. static int ipxitf_pprop(ipx_interface *intrfc, struct sk_buff *skb);
  684. static int ipxitf_rcv(ipx_interface *intrfc, struct sk_buff *skb)
  685. {
  686. struct ipxhdr *ipx = skb->nh.ipxh;
  687. int ret = 0;
  688. ipxitf_hold(intrfc);
  689. /* See if we should update our network number */
  690. if (!intrfc->if_netnum) /* net number of intrfc not known yet */
  691.   ipxitf_discover_netnum(intrfc, skb);
  692. IPX_SKB_CB(skb)->last_hop.index = -1;
  693. if (ipx->ipx_type == IPX_TYPE_PPROP) {
  694. ret = ipxitf_pprop(intrfc, skb);
  695. if (ret)
  696. goto out_free_skb;
  697. }
  698. /* local processing follows */
  699. if (!IPX_SKB_CB(skb)->ipx_dest_net)
  700. IPX_SKB_CB(skb)->ipx_dest_net = intrfc->if_netnum;
  701. if (!IPX_SKB_CB(skb)->ipx_source_net)
  702. IPX_SKB_CB(skb)->ipx_source_net = intrfc->if_netnum;
  703. /* it doesn't make sense to route a pprop packet, there's no meaning
  704.  * in the ipx_dest_net for such packets */
  705. if (ipx->ipx_type != IPX_TYPE_PPROP &&
  706.     intrfc->if_netnum != IPX_SKB_CB(skb)->ipx_dest_net) {
  707. /* We only route point-to-point packets. */
  708. if (skb->pkt_type == PACKET_HOST) {
  709. skb = skb_unshare(skb, GFP_ATOMIC);
  710. if (skb)
  711. ret = ipxrtr_route_skb(skb);
  712. goto out_intrfc;
  713. }
  714. goto out_free_skb;
  715. }
  716. /* see if we should keep it */
  717. if (!memcmp(ipx_broadcast_node, ipx->ipx_dest.node, IPX_NODE_LEN) ||
  718.     !memcmp(intrfc->if_node, ipx->ipx_dest.node, IPX_NODE_LEN)) {
  719. ret = ipxitf_demux_socket(intrfc, skb, 0);
  720. goto out_intrfc;
  721. }
  722. /* we couldn't pawn it off so unload it */
  723. out_free_skb:
  724. kfree_skb(skb);
  725. out_intrfc:
  726. ipxitf_put(intrfc);
  727. return ret;
  728. }
  729. static void ipxitf_discover_netnum(ipx_interface *intrfc, struct sk_buff *skb)
  730. const struct ipx_cb *cb = IPX_SKB_CB(skb);
  731. /* see if this is an intra packet: source_net == dest_net */
  732. if (cb->ipx_source_net == cb->ipx_dest_net && cb->ipx_source_net) {
  733. ipx_interface *i = ipxitf_find_using_net(cb->ipx_source_net);
  734. /* NB: NetWare servers lie about their hop count so we
  735.  * dropped the test based on it. This is the best way
  736.  * to determine this is a 0 hop count packet. */
  737. if (!i) {
  738. intrfc->if_netnum = cb->ipx_source_net;
  739. ipxitf_add_local_route(intrfc);
  740. } else {
  741. printk(KERN_WARNING "IPX: Network number collision "
  742. "%lxn        %s %s and %s %sn",
  743. (unsigned long) htonl(cb->ipx_source_net),
  744. ipx_device_name(i),
  745. ipx_frame_name(i->if_dlink_type),
  746. ipx_device_name(intrfc),
  747. ipx_frame_name(intrfc->if_dlink_type));
  748. ipxitf_put(i);
  749. }
  750. }
  751. }
  752. /**
  753.  * ipxitf_pprop - Process packet propagation IPX packet type 0x14, used for
  754.  *    NetBIOS broadcasts
  755.  * @intrfc: IPX interface receiving this packet
  756.  * @skb: Received packet
  757.  *
  758.  * Checks if packet is valid: if its more than %IPX_MAX_PPROP_HOPS hops or if it
  759.  * is smaller than a IPX header + the room for %IPX_MAX_PPROP_HOPS hops we drop
  760.  * it, not even processing it locally, if it has exact %IPX_MAX_PPROP_HOPS we
  761.  * don't broadcast it, but process it locally. See chapter 5 of Novell's "IPX
  762.  * RIP and SAP Router Specification", Part Number 107-000029-001.
  763.  * 
  764.  * If it is valid, check if we have pprop broadcasting enabled by the user,
  765.  * if not, just return zero for local processing.
  766.  *
  767.  * If it is enabled check the packet and don't broadcast it if we have already
  768.  * seen this packet.
  769.  *
  770.  * Broadcast: send it to the interfaces that aren't on the packet visited nets
  771.  * array, just after the IPX header.
  772.  *
  773.  * Returns -EINVAL for invalid packets, so that the calling function drops
  774.  * the packet without local processing. 0 if packet is to be locally processed.
  775.  */
  776. static int ipxitf_pprop(ipx_interface *intrfc, struct sk_buff *skb)
  777. {
  778. struct ipxhdr *ipx = skb->nh.ipxh;
  779. int i, ret = -EINVAL;
  780. ipx_interface *ifcs;
  781. char *c;
  782. u32 *l;
  783. /* Illegal packet - too many hops or too short */
  784. /* We decide to throw it away: no broadcasting, no local processing.
  785.  * NetBIOS unaware implementations route them as normal packets -
  786.  * tctrl <= 15, any data payload... */
  787. if (IPX_SKB_CB(skb)->ipx_tctrl > IPX_MAX_PPROP_HOPS ||
  788.     ntohs(ipx->ipx_pktsize) < sizeof(struct ipxhdr) +
  789.      IPX_MAX_PPROP_HOPS * sizeof(u32))
  790. goto out;
  791. /* are we broadcasting this damn thing? */
  792. ret = 0;
  793. if (!sysctl_ipx_pprop_broadcasting)
  794. goto out;
  795. /* We do broadcast packet on the IPX_MAX_PPROP_HOPS hop, but we
  796.  * process it locally. All previous hops broadcasted it, and process it
  797.  * locally. */
  798. if (IPX_SKB_CB(skb)->ipx_tctrl == IPX_MAX_PPROP_HOPS)
  799. goto out;
  800. c = ((u8 *) ipx) + sizeof(struct ipxhdr);
  801. l = (u32 *) c;
  802. /* Don't broadcast packet if already seen this net */
  803. for (i = 0; i < IPX_SKB_CB(skb)->ipx_tctrl; i++)
  804. if (*l++ == intrfc->if_netnum)
  805. goto out;
  806. /* < IPX_MAX_PPROP_HOPS hops && input interface not in list. Save the
  807.  * position where we will insert recvd netnum into list, later on,
  808.  * in ipxitf_send */
  809. IPX_SKB_CB(skb)->last_hop.index = i;
  810. IPX_SKB_CB(skb)->last_hop.netnum = intrfc->if_netnum;
  811. /* xmit on all other interfaces... */
  812. spin_lock_bh(&ipx_interfaces_lock);
  813. for (ifcs = ipx_interfaces; ifcs; ifcs = ifcs->if_next) {
  814. /* Except unconfigured interfaces */
  815. if (!ifcs->if_netnum)
  816. continue;
  817. /* That aren't in the list */
  818. if (ifcs == intrfc)
  819. continue;
  820. l = (__u32 *) c;
  821. /* don't consider the last entry in the packet list,
  822.  * it is our netnum, and it is not there yet */
  823. for (i = 0; i < IPX_SKB_CB(skb)->ipx_tctrl; i++)
  824. if (ifcs->if_netnum == *l++)
  825. break;
  826. if (i == IPX_SKB_CB(skb)->ipx_tctrl) {
  827. struct sk_buff *s = skb_copy(skb, GFP_ATOMIC);
  828. if (s) {
  829. IPX_SKB_CB(s)->ipx_dest_net = ifcs->if_netnum;
  830. ipxrtr_route_skb(s);
  831. }
  832. }
  833. }
  834. spin_unlock_bh(&ipx_interfaces_lock);
  835. out: return ret;
  836. }
  837. static void ipxitf_insert(ipx_interface *intrfc)
  838. {
  839. intrfc->if_next = NULL;
  840. spin_lock_bh(&ipx_interfaces_lock);
  841. if (!ipx_interfaces)
  842. ipx_interfaces = intrfc;
  843. else {
  844. ipx_interface *i = ipx_interfaces;
  845. while (i->if_next)
  846. i = i->if_next;
  847. i->if_next = intrfc;
  848. }
  849. spin_unlock_bh(&ipx_interfaces_lock);
  850. if (ipxcfg_auto_select_primary && !ipx_primary_net)
  851. ipx_primary_net = intrfc;
  852. }
  853. static ipx_interface *ipxitf_alloc(struct net_device *dev, __u32 netnum,
  854.    unsigned short dlink_type,
  855.    struct datalink_proto *dlink,
  856.    unsigned char internal, int ipx_offset)
  857. {
  858. ipx_interface *intrfc = kmalloc(sizeof(*intrfc), GFP_ATOMIC);
  859. if (intrfc) {
  860. intrfc->if_dev = dev;
  861. intrfc->if_netnum = netnum;
  862. intrfc->if_dlink_type  = dlink_type;
  863. intrfc->if_dlink  = dlink;
  864. intrfc->if_internal  = internal;
  865. intrfc->if_ipx_offset  = ipx_offset;
  866. intrfc->if_sknum  = IPX_MIN_EPHEMERAL_SOCKET;
  867. intrfc->if_sklist  = NULL;
  868. atomic_set(&intrfc->refcnt, 1);
  869. spin_lock_init(&intrfc->if_sklist_lock);
  870. MOD_INC_USE_COUNT;
  871. }
  872. return intrfc;
  873. }
  874. static int ipxitf_create_internal(ipx_interface_definition *idef)
  875. {
  876. ipx_interface *intrfc;
  877. int ret = -EEXIST;
  878. /* Only one primary network allowed */
  879. if (ipx_primary_net)
  880. goto out;
  881. /* Must have a valid network number */
  882. ret = -EADDRNOTAVAIL;
  883. if (!idef->ipx_network)
  884. goto out;
  885. intrfc = ipxitf_find_using_net(idef->ipx_network);
  886. ret = -EADDRINUSE;
  887. if (intrfc) {
  888. ipxitf_put(intrfc);
  889. goto out;
  890. }
  891. intrfc = ipxitf_alloc(NULL, idef->ipx_network, 0, NULL, 1, 0);
  892. ret = -EAGAIN;
  893. if (!intrfc)
  894. goto out;
  895. memcpy((char *)&(intrfc->if_node), idef->ipx_node, IPX_NODE_LEN);
  896. ipx_internal_net = ipx_primary_net = intrfc;
  897. ipxitf_hold(intrfc);
  898. ipxitf_insert(intrfc);
  899. ret = ipxitf_add_local_route(intrfc);
  900. ipxitf_put(intrfc);
  901. out: return ret;
  902. }
  903. static int ipx_map_frame_type(unsigned char type)
  904. {
  905. int ret = 0;
  906. switch (type) {
  907. case IPX_FRAME_ETHERII:
  908. ret = __constant_htons(ETH_P_IPX);
  909. break;
  910. case IPX_FRAME_8022:
  911. ret = __constant_htons(ETH_P_802_2);
  912. break;
  913. case IPX_FRAME_SNAP:
  914. ret = __constant_htons(ETH_P_SNAP);
  915. break;
  916. case IPX_FRAME_8023:
  917. ret = __constant_htons(ETH_P_802_3);
  918. break;
  919. }
  920. return ret;
  921. }
  922. static int ipxitf_create(ipx_interface_definition *idef)
  923. {
  924. struct net_device *dev;
  925. unsigned short dlink_type = 0;
  926. struct datalink_proto *datalink = NULL;
  927. ipx_interface *intrfc;
  928. int err;
  929. if (idef->ipx_special == IPX_INTERNAL) {
  930. err = ipxitf_create_internal(idef);
  931. goto out;
  932. }
  933. err = -EEXIST;
  934. if (idef->ipx_special == IPX_PRIMARY && ipx_primary_net)
  935. goto out;
  936. intrfc = ipxitf_find_using_net(idef->ipx_network);
  937. err = -EADDRINUSE;
  938. if (idef->ipx_network && intrfc) {
  939. ipxitf_put(intrfc);
  940. goto out;
  941. }
  942. if (intrfc)
  943. ipxitf_put(intrfc);
  944. dev = dev_get_by_name(idef->ipx_device);
  945. err = -ENODEV;
  946. if (!dev)
  947. goto out;
  948. switch (idef->ipx_dlink_type) {
  949. case IPX_FRAME_TR_8022:
  950. printk(KERN_WARNING "IPX frame type 802.2TR is "
  951. "obsolete Use 802.2 instead.n");
  952. /* fall through */
  953. case IPX_FRAME_8022:
  954. dlink_type  = __constant_htons(ETH_P_802_2);
  955. datalink  = p8022_datalink;
  956. break;
  957. case IPX_FRAME_ETHERII:
  958. if (dev->type != ARPHRD_IEEE802) {
  959. dlink_type  = __constant_htons(ETH_P_IPX);
  960. datalink  = pEII_datalink;
  961. break;
  962. } else 
  963. printk(KERN_WARNING "IPX frame type EtherII "
  964. "over token-ring is obsolete. Use SNAP "
  965. "instead.n");
  966. /* fall through */
  967. case IPX_FRAME_SNAP:
  968. dlink_type  = __constant_htons(ETH_P_SNAP);
  969. datalink  = pSNAP_datalink;
  970. break;
  971. case IPX_FRAME_8023:
  972. dlink_type  = __constant_htons(ETH_P_802_3);
  973. datalink  = p8023_datalink;
  974. break;
  975. case IPX_FRAME_NONE:
  976. default:
  977. err = -EPROTONOSUPPORT;
  978. goto out_dev;
  979. }
  980. err = -ENETDOWN;
  981. if (!(dev->flags & IFF_UP))
  982. goto out_dev;
  983. /* Check addresses are suitable */
  984. err = -EINVAL;
  985. if (dev->addr_len > IPX_NODE_LEN)
  986. goto out_dev;
  987. intrfc = ipxitf_find_using_phys(dev, dlink_type);
  988. if (!intrfc) {
  989. /* Ok now create */
  990. intrfc = ipxitf_alloc(dev, idef->ipx_network, dlink_type,
  991.       datalink, 0, dev->hard_header_len +
  992. datalink->header_length);
  993. err = -EAGAIN;
  994. if (!intrfc)
  995. goto out_dev;
  996. /* Setup primary if necessary */
  997. if (idef->ipx_special == IPX_PRIMARY)
  998. ipx_primary_net = intrfc;
  999. if (!memcmp(idef->ipx_node, "000000000000",
  1000.     IPX_NODE_LEN)) {
  1001. memset(intrfc->if_node, 0, IPX_NODE_LEN);
  1002. memcpy(intrfc->if_node + IPX_NODE_LEN - dev->addr_len,
  1003. dev->dev_addr, dev->addr_len);
  1004. } else
  1005. memcpy(intrfc->if_node, idef->ipx_node, IPX_NODE_LEN);
  1006. ipxitf_hold(intrfc);
  1007. ipxitf_insert(intrfc);
  1008. }
  1009. /* If the network number is known, add a route */
  1010. err = 0;
  1011. if (!intrfc->if_netnum)
  1012. goto out_intrfc;
  1013. err = ipxitf_add_local_route(intrfc);
  1014. out_intrfc:
  1015. ipxitf_put(intrfc);
  1016. goto out;
  1017. out_dev:
  1018. dev_put(dev);
  1019. out: return err;
  1020. }
  1021. static int ipxitf_delete(ipx_interface_definition *idef)
  1022. {
  1023. struct net_device *dev = NULL;
  1024. unsigned short dlink_type = 0;
  1025. ipx_interface *intrfc;
  1026. int ret = 0;
  1027. spin_lock_bh(&ipx_interfaces_lock);
  1028. if (idef->ipx_special == IPX_INTERNAL) {
  1029. if (ipx_internal_net) {
  1030. __ipxitf_put(ipx_internal_net);
  1031. goto out;
  1032. }
  1033. ret = -ENOENT;
  1034. goto out;
  1035. }
  1036. dlink_type = ipx_map_frame_type(idef->ipx_dlink_type);
  1037. ret = -EPROTONOSUPPORT;
  1038. if (!dlink_type)
  1039. goto out;
  1040. dev = __dev_get_by_name(idef->ipx_device);
  1041. ret = -ENODEV;
  1042. if (!dev)
  1043. goto out;
  1044. intrfc = __ipxitf_find_using_phys(dev, dlink_type);
  1045. ret = -EINVAL;
  1046. if (!intrfc)
  1047. goto out;
  1048. __ipxitf_put(intrfc);
  1049. ret = 0;
  1050. out: spin_unlock_bh(&ipx_interfaces_lock);
  1051. return ret;
  1052. }
  1053. static ipx_interface *ipxitf_auto_create(struct net_device *dev, 
  1054.  unsigned short dlink_type)
  1055. {
  1056. ipx_interface *intrfc = NULL;
  1057. struct datalink_proto *datalink;
  1058. if (!dev)
  1059. goto out;
  1060. /* Check addresses are suitable */
  1061. if (dev->addr_len > IPX_NODE_LEN)
  1062. goto out;
  1063. switch (htons(dlink_type)) {
  1064. case ETH_P_IPX:
  1065. datalink = pEII_datalink;
  1066. break;
  1067. case ETH_P_802_2:
  1068. datalink = p8022_datalink;
  1069. break;
  1070. case ETH_P_SNAP:
  1071. datalink = pSNAP_datalink;
  1072. break;
  1073. case ETH_P_802_3:
  1074. datalink = p8023_datalink;
  1075. break;
  1076. default:
  1077. goto out;
  1078. }
  1079. intrfc = ipxitf_alloc(dev, 0, dlink_type, datalink, 0,
  1080. dev->hard_header_len + datalink->header_length);
  1081. if (intrfc) {
  1082. memset(intrfc->if_node, 0, IPX_NODE_LEN);
  1083. memcpy((char *)&(intrfc->if_node[IPX_NODE_LEN-dev->addr_len]),
  1084. dev->dev_addr, dev->addr_len);
  1085. spin_lock_init(&intrfc->if_sklist_lock);
  1086. atomic_set(&intrfc->refcnt, 1);
  1087. ipxitf_insert(intrfc);
  1088. dev_hold(dev);
  1089. }
  1090. out: return intrfc;
  1091. }
  1092. static int ipxitf_ioctl(unsigned int cmd, void *arg)
  1093. {
  1094. struct ifreq ifr;
  1095. int val;
  1096. switch (cmd) {
  1097. case SIOCSIFADDR: {
  1098. struct sockaddr_ipx *sipx;
  1099. ipx_interface_definition f;
  1100. if (copy_from_user(&ifr, arg, sizeof(ifr)))
  1101. return -EFAULT;
  1102. sipx = (struct sockaddr_ipx *)&ifr.ifr_addr;
  1103. if (sipx->sipx_family != AF_IPX)
  1104. return -EINVAL;
  1105. f.ipx_network = sipx->sipx_network;
  1106. memcpy(f.ipx_device, ifr.ifr_name,
  1107. sizeof(f.ipx_device));
  1108. memcpy(f.ipx_node, sipx->sipx_node, IPX_NODE_LEN);
  1109. f.ipx_dlink_type = sipx->sipx_type;
  1110. f.ipx_special = sipx->sipx_special;
  1111. if (sipx->sipx_action == IPX_DLTITF)
  1112. return ipxitf_delete(&f);
  1113. else
  1114. return ipxitf_create(&f);
  1115. }
  1116. case SIOCGIFADDR: {
  1117. int err = 0;
  1118. struct sockaddr_ipx *sipx;
  1119. ipx_interface *ipxif;
  1120. struct net_device *dev;
  1121. if (copy_from_user(&ifr, arg, sizeof(ifr)))
  1122. return -EFAULT;
  1123. sipx = (struct sockaddr_ipx *)&ifr.ifr_addr;
  1124. dev = __dev_get_by_name(ifr.ifr_name);
  1125. if (!dev)
  1126. return -ENODEV;
  1127. ipxif = ipxitf_find_using_phys(dev, ipx_map_frame_type(sipx->sipx_type));
  1128. if (!ipxif)
  1129. return -EADDRNOTAVAIL;
  1130. sipx->sipx_family = AF_IPX;
  1131. sipx->sipx_network = ipxif->if_netnum;
  1132. memcpy(sipx->sipx_node, ipxif->if_node,
  1133. sizeof(sipx->sipx_node));
  1134. if (copy_to_user(arg, &ifr, sizeof(ifr)))
  1135. err = -EFAULT;
  1136. ipxitf_put(ipxif);
  1137. return err;
  1138. }
  1139. case SIOCAIPXITFCRT: 
  1140. if (get_user(val, (unsigned char *) arg))
  1141. return -EFAULT;
  1142. ipxcfg_set_auto_create(val);
  1143. break;
  1144. case SIOCAIPXPRISLT: 
  1145. if (get_user(val, (unsigned char *) arg))
  1146. return -EFAULT;
  1147. ipxcfg_set_auto_select(val);
  1148. break;
  1149. default:
  1150. return -EINVAL;
  1151. }
  1152. return 0;
  1153. }
  1154. /* Routing tables for the IPX socket layer. */
  1155. static inline void ipxrtr_hold(ipx_route *rt)
  1156. {
  1157. atomic_inc(&rt->refcnt);
  1158. }
  1159. static inline void ipxrtr_put(ipx_route *rt)
  1160. {
  1161. if (atomic_dec_and_test(&rt->refcnt))
  1162. kfree(rt);
  1163. }
  1164. static ipx_route *ipxrtr_lookup(__u32 net)
  1165. {
  1166. ipx_route *r;
  1167. read_lock_bh(&ipx_routes_lock);
  1168. for (r = ipx_routes; r && r->ir_net != net; r = r->ir_next)
  1169. ;
  1170. if (r)
  1171. ipxrtr_hold(r);
  1172. read_unlock_bh(&ipx_routes_lock);
  1173. return r;
  1174. }
  1175. /* caller must hold a reference to intrfc */
  1176. static int ipxrtr_add_route(__u32 network, ipx_interface *intrfc,
  1177. unsigned char *node)
  1178. {
  1179. ipx_route *rt;
  1180. int ret;
  1181. /* Get a route structure; either existing or create */
  1182. rt = ipxrtr_lookup(network);
  1183. if (!rt) {
  1184. rt = kmalloc(sizeof(ipx_route), GFP_ATOMIC);
  1185. ret = -EAGAIN;
  1186. if (!rt)
  1187. goto out;
  1188. atomic_set(&rt->refcnt, 1);
  1189. ipxrtr_hold(rt);
  1190. write_lock_bh(&ipx_routes_lock);
  1191. rt->ir_next = ipx_routes;
  1192. ipx_routes = rt;
  1193. write_unlock_bh(&ipx_routes_lock);
  1194. } else {
  1195. ret = -EEXIST;
  1196. if (intrfc == ipx_internal_net)
  1197. goto out_put;
  1198. }
  1199. rt->ir_net  = network;
  1200. rt->ir_intrfc  = intrfc;
  1201. if (!node) {
  1202. memset(rt->ir_router_node, '', IPX_NODE_LEN);
  1203. rt->ir_routed = 0;
  1204. } else {
  1205. memcpy(rt->ir_router_node, node, IPX_NODE_LEN);
  1206. rt->ir_routed = 1;
  1207. }
  1208. ret = 0;
  1209. out_put:
  1210. ipxrtr_put(rt);
  1211. out: return ret;
  1212. }
  1213. static void ipxrtr_del_routes(ipx_interface *intrfc)
  1214. {
  1215. ipx_route **r, *tmp;
  1216. write_lock_bh(&ipx_routes_lock);
  1217. for (r = &ipx_routes; (tmp = *r) != NULL;) {
  1218. if (tmp->ir_intrfc == intrfc) {
  1219. *r = tmp->ir_next;
  1220. ipxrtr_put(tmp);
  1221. } else
  1222. r = &(tmp->ir_next);
  1223. }
  1224. write_unlock_bh(&ipx_routes_lock);
  1225. }
  1226. static int ipxrtr_create(ipx_route_definition *rd)
  1227. {
  1228. ipx_interface *intrfc;
  1229. int ret = -ENETUNREACH;
  1230. /* Find the appropriate interface */
  1231. intrfc = ipxitf_find_using_net(rd->ipx_router_network);
  1232. if (!intrfc)
  1233. goto out;
  1234. ret = ipxrtr_add_route(rd->ipx_network, intrfc, rd->ipx_router_node);
  1235. ipxitf_put(intrfc);
  1236. out: return ret;
  1237. }
  1238. static int ipxrtr_delete(long net)
  1239. {
  1240. ipx_route **r;
  1241. ipx_route *tmp;
  1242. int err;
  1243. write_lock_bh(&ipx_routes_lock);
  1244. for (r = &ipx_routes; (tmp = *r) != NULL;) {
  1245. if (tmp->ir_net == net) {
  1246. /* Directly connected; can't lose route */
  1247. err = -EPERM;
  1248. if (!tmp->ir_routed)
  1249. goto out;
  1250. *r = tmp->ir_next;
  1251. ipxrtr_put(tmp);
  1252. err = 0;
  1253. goto out;
  1254. }
  1255. r = &(tmp->ir_next);
  1256. }
  1257. err = -ENOENT;
  1258. out: write_unlock_bh(&ipx_routes_lock);
  1259. return err;
  1260. }
  1261. /*
  1262.  * Checksum routine for IPX
  1263.  */
  1264.  
  1265. /* Note: We assume ipx_tctrl==0 and htons(length)==ipx_pktsize */
  1266. /* This functions should *not* mess with packet contents */
  1267. static __u16 ipx_cksum(struct ipxhdr *packet, int length) 
  1268. {
  1269. /* 
  1270.  * NOTE: sum is a net byte order quantity, which optimizes the 
  1271.  * loop. This only works on big and little endian machines. (I
  1272.  * don't know of a machine that isn't.)
  1273.  */
  1274. /* start at ipx_dest - We skip the checksum field and start with
  1275.  * ipx_type before the loop, not considering ipx_tctrl in the calc */
  1276. __u16 *p = (__u16 *)&packet->ipx_dest;
  1277. __u32 i = (length >> 1) - 1; /* Number of complete words */
  1278. __u32 sum = packet->ipx_type << sizeof(packet->ipx_tctrl); 
  1279. /* Loop through all complete words except the checksum field,
  1280.  * ipx_type (accounted above) and ipx_tctrl (not used in the cksum) */
  1281. while (--i)
  1282. sum += *p++;
  1283. /* Add on the last part word if it exists */
  1284. if (packet->ipx_pktsize & __constant_htons(1))
  1285. sum += ntohs(0xff00) & *p;
  1286. /* Do final fixup */
  1287. sum = (sum & 0xffff) + (sum >> 16);
  1288. /* It's a pity there's no concept of carry in C */
  1289. if (sum >= 0x10000)
  1290. sum++;
  1291. return ~sum;
  1292. }
  1293. /*
  1294.  * Route an outgoing frame from a socket.
  1295.  */
  1296. static int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx,
  1297. struct iovec *iov, int len, int noblock)
  1298. {
  1299. struct sk_buff *skb;
  1300. ipx_interface *intrfc;
  1301. struct ipxhdr *ipx;
  1302. int size;
  1303. int ipx_offset;
  1304. ipx_route *rt = NULL;
  1305. int err;
  1306. /* Find the appropriate interface on which to send packet */
  1307. if (!usipx->sipx_network && ipx_primary_net) {
  1308. usipx->sipx_network = ipx_primary_net->if_netnum;
  1309. intrfc = ipx_primary_net;
  1310. } else {
  1311. rt = ipxrtr_lookup(usipx->sipx_network);
  1312. err = -ENETUNREACH;
  1313. if (!rt)
  1314. goto out;
  1315. intrfc = rt->ir_intrfc;
  1316. }
  1317. ipxitf_hold(intrfc);
  1318. ipx_offset = intrfc->if_ipx_offset;
  1319. size = sizeof(struct ipxhdr) + len + ipx_offset;
  1320. skb = sock_alloc_send_skb(sk, size, noblock, &err);
  1321. if (!skb)
  1322. goto out_put;
  1323. skb_reserve(skb, ipx_offset);
  1324. skb->sk = sk;
  1325. /* Fill in IPX header */
  1326. ipx = (struct ipxhdr *)skb_put(skb, sizeof(struct ipxhdr));
  1327. ipx->ipx_pktsize = htons(len + sizeof(struct ipxhdr));
  1328. IPX_SKB_CB(skb)->ipx_tctrl = 0;
  1329. ipx->ipx_type   = usipx->sipx_type;
  1330. skb->h.raw   = (void *)skb->nh.ipxh = ipx;
  1331. IPX_SKB_CB(skb)->last_hop.index = -1;
  1332. #ifdef CONFIG_IPX_INTERN
  1333. IPX_SKB_CB(skb)->ipx_source_net = sk->protinfo.af_ipx.intrfc->if_netnum;
  1334. memcpy(ipx->ipx_source.node, sk->protinfo.af_ipx.node, IPX_NODE_LEN);
  1335. #else
  1336. err = ntohs(sk->protinfo.af_ipx.port);
  1337. if (err == 0x453 || err == 0x452) {
  1338. /* RIP/SAP special handling for mars_nwe */
  1339. IPX_SKB_CB(skb)->ipx_source_net = intrfc->if_netnum;
  1340. memcpy(ipx->ipx_source.node, intrfc->if_node, IPX_NODE_LEN);
  1341. } else {
  1342. IPX_SKB_CB(skb)->ipx_source_net =
  1343. sk->protinfo.af_ipx.intrfc->if_netnum;
  1344. memcpy(ipx->ipx_source.node, sk->protinfo.af_ipx.intrfc->if_node, IPX_NODE_LEN);
  1345. }
  1346. #endif /* CONFIG_IPX_INTERN */
  1347. ipx->ipx_source.sock = sk->protinfo.af_ipx.port;
  1348. IPX_SKB_CB(skb)->ipx_dest_net = usipx->sipx_network;
  1349. memcpy(ipx->ipx_dest.node, usipx->sipx_node, IPX_NODE_LEN);
  1350. ipx->ipx_dest.sock = usipx->sipx_port;
  1351. err = memcpy_fromiovec(skb_put(skb, len), iov, len);
  1352. if (err) {
  1353. kfree_skb(skb);
  1354. goto out_put;
  1355. }
  1356. /* Apply checksum. Not allowed on 802.3 links. */
  1357. if (sk->no_check || intrfc->if_dlink_type == IPX_FRAME_8023)
  1358. ipx->ipx_checksum = 0xFFFF;
  1359. else
  1360. ipx->ipx_checksum = ipx_cksum(ipx, len + sizeof(struct ipxhdr));
  1361. err = ipxitf_send(intrfc, skb, (rt && rt->ir_routed) ? 
  1362. rt->ir_router_node : ipx->ipx_dest.node);
  1363. out_put:
  1364. ipxitf_put(intrfc);
  1365. if (rt)
  1366. ipxrtr_put(rt);
  1367. out: return err;
  1368. }
  1369. /* the skb has to be unshared, we'll end up calling ipxitf_send, that'll
  1370.  * modify the packet */
  1371. int ipxrtr_route_skb(struct sk_buff *skb)
  1372. {
  1373. struct ipxhdr *ipx = skb->nh.ipxh;
  1374. ipx_route *r = ipxrtr_lookup(IPX_SKB_CB(skb)->ipx_dest_net);
  1375. if (!r) { /* no known route */
  1376. kfree_skb(skb);
  1377. return 0;
  1378. }
  1379. ipxitf_hold(r->ir_intrfc);
  1380. ipxitf_send(r->ir_intrfc, skb, r->ir_routed ?
  1381. r->ir_router_node : ipx->ipx_dest.node);
  1382. ipxitf_put(r->ir_intrfc);
  1383. ipxrtr_put(r);
  1384. return 0;
  1385. }
  1386. /*
  1387.  * We use a normal struct rtentry for route handling
  1388.  */
  1389. static int ipxrtr_ioctl(unsigned int cmd, void *arg)
  1390. {
  1391. struct rtentry rt; /* Use these to behave like 'other' stacks */
  1392. struct sockaddr_ipx *sg, *st;
  1393. int ret = -EFAULT;
  1394. if (copy_from_user(&rt, arg, sizeof(rt)))
  1395. goto out;
  1396. sg = (struct sockaddr_ipx *)&rt.rt_gateway;
  1397. st = (struct sockaddr_ipx *)&rt.rt_dst;
  1398. ret = -EINVAL;
  1399. if (!(rt.rt_flags & RTF_GATEWAY) || /* Direct routes are fixed */
  1400.     sg->sipx_family != AF_IPX ||
  1401.     st->sipx_family != AF_IPX)
  1402. goto out;
  1403. switch (cmd) {
  1404. case SIOCDELRT:
  1405. ret = ipxrtr_delete(st->sipx_network);
  1406. break;
  1407. case SIOCADDRT: {
  1408. struct ipx_route_definition f;
  1409. f.ipx_network = st->sipx_network;
  1410. f.ipx_router_network = sg->sipx_network;
  1411. memcpy(f.ipx_router_node, sg->sipx_node, IPX_NODE_LEN);
  1412. ret = ipxrtr_create(&f);
  1413. break;
  1414. }
  1415. }
  1416. out: return ret;
  1417. }
  1418. static const char *ipx_frame_name(unsigned short frame)
  1419. {
  1420. char* ret = "None";
  1421. switch (ntohs(frame)) {
  1422. case ETH_P_IPX: ret = "EtherII"; break;
  1423. case ETH_P_802_2: ret = "802.2"; break;
  1424. case ETH_P_SNAP: ret = "SNAP"; break;
  1425. case ETH_P_802_3: ret = "802.3"; break;
  1426. case ETH_P_TR_802_2: ret = "802.2TR"; break;
  1427. }
  1428. return ret;
  1429. }
  1430. static const char *ipx_device_name(ipx_interface *intrfc)
  1431. {
  1432. return intrfc->if_internal ? "Internal" :
  1433. intrfc->if_dev ? intrfc->if_dev->name : "Unknown";
  1434. }
  1435. /* Called from proc fs */
  1436. static int ipx_interface_get_info(char *buffer, char **start, off_t offset,
  1437.   int length)
  1438. {
  1439. ipx_interface *i;
  1440. off_t begin = 0, pos = 0;
  1441. int len = 0;
  1442. /* Theory.. Keep printing in the same place until we pass offset */
  1443. len += sprintf(buffer, "%-11s%-15s%-9s%-11s%s", "Network",
  1444. "Node_Address", "Primary", "Device", "Frame_Type");
  1445. #ifdef IPX_REFCNT_DEBUG
  1446. len += sprintf(buffer + len, "  refcnt");
  1447. #endif
  1448. strcat(buffer + len++, "n");
  1449. spin_lock_bh(&ipx_interfaces_lock);
  1450. for (i = ipx_interfaces; i; i = i->if_next) {
  1451. len += sprintf(buffer + len, "%08lX   ",
  1452. (long unsigned int) ntohl(i->if_netnum));
  1453. len += sprintf(buffer + len, "%02X%02X%02X%02X%02X%02X   ",
  1454. i->if_node[0], i->if_node[1], i->if_node[2],
  1455. i->if_node[3], i->if_node[4], i->if_node[5]);
  1456. len += sprintf(buffer + len, "%-9s", i == ipx_primary_net ?
  1457. "Yes" : "No");
  1458. len += sprintf(buffer + len, "%-11s", ipx_device_name(i));
  1459. len += sprintf(buffer + len, "%-9s",
  1460. ipx_frame_name(i->if_dlink_type));
  1461. #ifdef IPX_REFCNT_DEBUG
  1462. len += sprintf(buffer + len, "%6d", atomic_read(&i->refcnt));
  1463. #endif
  1464. strcat(buffer + len++, "n");
  1465. /* Are we still dumping unwanted data then discard the record */
  1466. pos = begin + len;
  1467. if (pos < offset) {
  1468. len   = 0; /* Keep dumping into the buffer start */
  1469. begin = pos;
  1470. }
  1471. if (pos > offset + length) /* We have dumped enough */
  1472. break;
  1473. }
  1474. spin_unlock_bh(&ipx_interfaces_lock);
  1475. /* The data in question runs from begin to begin+len */
  1476. *start = buffer + (offset - begin); /* Start of wanted data */
  1477. len -= (offset - begin); /* Remove unwanted header data from length */
  1478. if (len > length)
  1479. len = length; /* Remove unwanted tail data from length */
  1480. return len;
  1481. }
  1482. static int ipx_get_info(char *buffer, char **start, off_t offset, int length)
  1483. {
  1484. struct sock *s;
  1485. ipx_interface *i;
  1486. off_t begin = 0, pos = 0;
  1487. int len = 0;
  1488. /* Theory.. Keep printing in the same place until we pass offset */
  1489. #ifdef CONFIG_IPX_INTERN
  1490. len += sprintf(buffer, "%-28s%-28s%-10s%-10s%-7s%sn", "Local_Address",
  1491. #else
  1492. len += sprintf(buffer, "%-15s%-28s%-10s%-10s%-7s%sn", "Local_Address",
  1493. #endif /* CONFIG_IPX_INTERN */
  1494. "Remote_Address", "Tx_Queue", "Rx_Queue",
  1495. "State", "Uid");
  1496. spin_lock_bh(&ipx_interfaces_lock);
  1497. for (i = ipx_interfaces; i; i = i->if_next) {
  1498. ipxitf_hold(i);
  1499. spin_lock_bh(&i->if_sklist_lock);
  1500. for (s = i->if_sklist; s; s = s->next) {
  1501. #ifdef CONFIG_IPX_INTERN
  1502. len += sprintf(buffer + len,
  1503.        "%08lX:%02X%02X%02X%02X%02X%02X:%04X  ",
  1504.                                        (unsigned long) htonl(s->protinfo.af_ipx.intrfc->if_netnum),
  1505.        s->protinfo.af_ipx.node[0],
  1506.        s->protinfo.af_ipx.node[1],
  1507.        s->protinfo.af_ipx.node[2],
  1508.        s->protinfo.af_ipx.node[3],
  1509.        s->protinfo.af_ipx.node[4],
  1510.        s->protinfo.af_ipx.node[5],
  1511.        htons(s->protinfo.af_ipx.port));
  1512. #else
  1513. len += sprintf(buffer + len, "%08lX:%04X  ",
  1514.        (unsigned long) htonl(i->if_netnum),
  1515.        htons(s->protinfo.af_ipx.port));
  1516. #endif /* CONFIG_IPX_INTERN */
  1517. if (s->state != TCP_ESTABLISHED)
  1518. len += sprintf(buffer + len, "%-28s",
  1519. "Not_Connected");
  1520. else {
  1521. len += sprintf(buffer + len,
  1522. "%08lX:%02X%02X%02X%02X%02X%02X:%04X  ",
  1523. (unsigned long) htonl(s->protinfo.af_ipx.dest_addr.net),
  1524. s->protinfo.af_ipx.dest_addr.node[0],
  1525. s->protinfo.af_ipx.dest_addr.node[1],
  1526. s->protinfo.af_ipx.dest_addr.node[2],
  1527. s->protinfo.af_ipx.dest_addr.node[3],
  1528. s->protinfo.af_ipx.dest_addr.node[4],
  1529. s->protinfo.af_ipx.dest_addr.node[5],
  1530. htons(s->protinfo.af_ipx.dest_addr.sock));
  1531. }
  1532. len += sprintf(buffer + len, "%08X  %08X  ",
  1533. atomic_read(&s->wmem_alloc),
  1534. atomic_read(&s->rmem_alloc));
  1535. len += sprintf(buffer + len, "%02X     %03dn",
  1536. s->state, SOCK_INODE(s->socket)->i_uid);
  1537. pos = begin + len;
  1538. if (pos < offset) {
  1539. len   = 0;
  1540. begin = pos;
  1541. }
  1542. if (pos > offset + length)  /* We have dumped enough */
  1543. break;
  1544. }
  1545. spin_unlock_bh(&i->if_sklist_lock);
  1546. ipxitf_put(i);
  1547. }
  1548. spin_unlock_bh(&ipx_interfaces_lock);
  1549. /* The data in question runs from begin to begin+len */
  1550. *start = buffer + offset - begin;
  1551. len -= (offset - begin);
  1552. if (len > length)
  1553. len = length;
  1554. return len;
  1555. }
  1556. static int ipx_rt_get_info(char *buffer, char **start, off_t offset, int length)
  1557. {
  1558. ipx_route *rt;
  1559. off_t begin = 0, pos = 0;
  1560. int len = 0;
  1561. len += sprintf(buffer, "%-11s%-13s%sn",
  1562. "Network", "Router_Net", "Router_Node");
  1563. read_lock_bh(&ipx_routes_lock);
  1564. for (rt = ipx_routes; rt; rt = rt->ir_next) {
  1565. len += sprintf(buffer + len, "%08lX   ",
  1566. (long unsigned int) ntohl(rt->ir_net));
  1567. if (rt->ir_routed) {
  1568. len += sprintf(buffer + len,
  1569. "%08lX     %02X%02X%02X%02X%02X%02Xn",
  1570. (long unsigned int) ntohl(rt->ir_intrfc->if_netnum),
  1571. rt->ir_router_node[0], rt->ir_router_node[1],
  1572. rt->ir_router_node[2], rt->ir_router_node[3],
  1573. rt->ir_router_node[4], rt->ir_router_node[5]);
  1574. } else {
  1575. len += sprintf(buffer + len, "%-13s%sn",
  1576. "Directly", "Connected");
  1577. }
  1578. pos = begin + len;
  1579. if (pos < offset) {
  1580. len = 0;
  1581. begin = pos;
  1582. }
  1583. if (pos > offset + length)
  1584. break;
  1585. }
  1586. read_unlock_bh(&ipx_routes_lock);
  1587. *start = buffer + (offset - begin);
  1588. len -= (offset - begin);
  1589. if (len > length)
  1590. len = length;
  1591. return len;
  1592. }
  1593. /* Handling for system calls applied via the various interfaces to an IPX
  1594.  * socket object. */
  1595. static int ipx_setsockopt(struct socket *sock, int level, int optname,
  1596.   char *optval, int optlen)
  1597. {
  1598. struct sock *sk = sock->sk;
  1599. int opt;
  1600. int ret = -EINVAL;
  1601. if (optlen != sizeof(int))
  1602. goto out;
  1603. ret = -EFAULT;
  1604. if (get_user(opt, (unsigned int *)optval))
  1605. goto out;
  1606. ret = -ENOPROTOOPT;
  1607. if (!(level == SOL_IPX && optname == IPX_TYPE))
  1608. goto out;
  1609. sk->protinfo.af_ipx.type = opt;
  1610. ret = 0;
  1611. out: return ret;
  1612. }
  1613. static int ipx_getsockopt(struct socket *sock, int level, int optname,
  1614. char *optval, int *optlen)
  1615. {
  1616. struct sock *sk = sock->sk;
  1617. int val = 0;
  1618. int len;
  1619. int ret = -ENOPROTOOPT;
  1620. if (!(level == SOL_IPX && optname == IPX_TYPE))
  1621. goto out;
  1622. val = sk->protinfo.af_ipx.type;
  1623. ret = -EFAULT;
  1624. if (get_user(len, optlen))
  1625. goto out;
  1626. len = min_t(unsigned int, len, sizeof(int));
  1627. ret = -EINVAL;
  1628. if(len < 0)
  1629. goto out;
  1630. ret = -EFAULT;
  1631. if (put_user(len, optlen) || copy_to_user(optval, &val, len))
  1632. goto out;
  1633. ret = 0;
  1634. out: return ret;
  1635. }
  1636. static int ipx_create(struct socket *sock, int protocol)
  1637. {
  1638. int ret = -ESOCKTNOSUPPORT;
  1639. struct sock *sk;
  1640. switch (sock->type) {
  1641. case SOCK_DGRAM:
  1642. sk = sk_alloc(PF_IPX, GFP_KERNEL, 1);
  1643.                  ret = -ENOMEM;
  1644. if (!sk)
  1645. goto out;
  1646.                         sock->ops = &ipx_dgram_ops;
  1647.                         break;
  1648. case SOCK_SEQPACKET:
  1649. /*
  1650.  * From this point on SPX sockets are handled
  1651.  * by af_spx.c and the methods replaced.
  1652.  */
  1653. if (spx_family_ops) {
  1654. ret = spx_family_ops->create(sock, protocol);
  1655. goto out;
  1656. }
  1657. /* Fall through if SPX is not loaded */
  1658. case SOCK_STREAM:       /* Allow higher levels to piggyback */
  1659. default:
  1660. goto out;
  1661. }
  1662. #ifdef IPX_REFCNT_DEBUG
  1663.         atomic_inc(&ipx_sock_nr);
  1664.         printk(KERN_DEBUG "IPX socket %p created, now we have %d aliven", sk,
  1665. atomic_read(&ipx_sock_nr));
  1666. #endif
  1667. sock_init_data(sock, sk);
  1668. sk->destruct = NULL;
  1669. sk->no_check  = 1; /* Checksum off by default */
  1670. MOD_INC_USE_COUNT;
  1671. ret = 0;
  1672. out: return ret;
  1673. }
  1674. static int ipx_release(struct socket *sock)
  1675. {
  1676. struct sock *sk = sock->sk;
  1677. if (!sk)
  1678. goto out;
  1679. if (!sk->dead)
  1680. sk->state_change(sk);
  1681. sk->dead = 1;
  1682. sock->sk = NULL;
  1683. ipx_destroy_socket(sk);
  1684. if (sock->type == SOCK_DGRAM)
  1685. MOD_DEC_USE_COUNT;
  1686. out: return 0;
  1687. }
  1688. /* caller must hold a reference to intrfc */
  1689. static unsigned short ipx_first_free_socketnum(ipx_interface *intrfc)
  1690. {
  1691. unsigned short socketNum = intrfc->if_sknum;
  1692. spin_lock_bh(&intrfc->if_sklist_lock);
  1693. if (socketNum < IPX_MIN_EPHEMERAL_SOCKET)
  1694. socketNum = IPX_MIN_EPHEMERAL_SOCKET;
  1695. while (__ipxitf_find_socket(intrfc, ntohs(socketNum)))
  1696. if (socketNum > IPX_MAX_EPHEMERAL_SOCKET)
  1697. socketNum = IPX_MIN_EPHEMERAL_SOCKET;
  1698. else
  1699. socketNum++;
  1700. spin_unlock_bh(&intrfc->if_sklist_lock);
  1701. intrfc->if_sknum = socketNum;
  1702. return ntohs(socketNum);
  1703. }
  1704. static int ipx_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
  1705. {
  1706. struct sock *sk = sock->sk;
  1707. ipx_interface *intrfc;
  1708. struct sockaddr_ipx *addr = (struct sockaddr_ipx *)uaddr;
  1709. int ret = -EINVAL;
  1710. if (!sk->zapped || addr_len != sizeof(struct sockaddr_ipx))
  1711. goto out;
  1712. intrfc = ipxitf_find_using_net(addr->sipx_network);
  1713. ret = -EADDRNOTAVAIL;
  1714. if (!intrfc)
  1715. goto out;
  1716. if (!addr->sipx_port) {
  1717. addr->sipx_port = ipx_first_free_socketnum(intrfc);
  1718. ret = -EINVAL;
  1719. if (!addr->sipx_port)
  1720. goto out_put;
  1721. }
  1722. /* protect IPX system stuff like routing/sap */
  1723. ret = -EACCES;
  1724. if (ntohs(addr->sipx_port) < IPX_MIN_EPHEMERAL_SOCKET &&
  1725.     !capable(CAP_NET_ADMIN))
  1726. goto out_put;
  1727. sk->protinfo.af_ipx.port = addr->sipx_port;
  1728. #ifdef CONFIG_IPX_INTERN
  1729. if (intrfc == ipx_internal_net) {
  1730. /* The source address is to be set explicitly if the
  1731.  * socket is to be bound on the internal network. If a
  1732.  * node number 0 was specified, the default is used.
  1733.  */
  1734. ret = -EINVAL;
  1735. if (!memcmp(addr->sipx_node, ipx_broadcast_node, IPX_NODE_LEN))
  1736. goto out_put;
  1737. if (!memcmp(addr->sipx_node, ipx_this_node, IPX_NODE_LEN))
  1738. memcpy(sk->protinfo.af_ipx.node, intrfc->if_node,
  1739.        IPX_NODE_LEN);
  1740. else
  1741. memcpy(sk->protinfo.af_ipx.node, addr->sipx_node,
  1742. IPX_NODE_LEN);
  1743. ret = -EADDRINUSE;
  1744. if (ipxitf_find_internal_socket(intrfc,
  1745. sk->protinfo.af_ipx.node,
  1746. sk->protinfo.af_ipx.port)) {
  1747. SOCK_DEBUG(sk,
  1748. "IPX: bind failed because port %X in use.n",
  1749. ntohs((int)addr->sipx_port));
  1750. goto out_put;
  1751. }
  1752. } else {
  1753. /* Source addresses are easy. It must be our
  1754.  * network:node pair for an interface routed to IPX
  1755.  * with the ipx routing ioctl()
  1756.  */
  1757. memcpy(sk->protinfo.af_ipx.node, intrfc->if_node,
  1758. IPX_NODE_LEN);
  1759. ret = -EADDRINUSE;
  1760. if (ipxitf_find_socket(intrfc, addr->sipx_port)) {
  1761. SOCK_DEBUG(sk,
  1762. "IPX: bind failed because port %X in use.n",
  1763. ntohs((int)addr->sipx_port));
  1764. goto out_put;
  1765. }
  1766. }
  1767. #else /* !def CONFIG_IPX_INTERN */
  1768. /* Source addresses are easy. It must be our network:node pair for
  1769.    an interface routed to IPX with the ipx routing ioctl() */
  1770. ret = -EADDRINUSE;
  1771. if (ipxitf_find_socket(intrfc, addr->sipx_port)) {
  1772. SOCK_DEBUG(sk, "IPX: bind failed because port %X in use.n",
  1773. ntohs((int)addr->sipx_port));
  1774. goto out_put;
  1775. }
  1776. #endif /* CONFIG_IPX_INTERN */
  1777. ipxitf_insert_socket(intrfc, sk);
  1778. sk->zapped = 0;
  1779. SOCK_DEBUG(sk, "IPX: bound socket 0x%04X.n", ntohs(addr->sipx_port) );
  1780. ret = 0;
  1781. out_put:
  1782. ipxitf_put(intrfc);
  1783. out: return ret;
  1784. }
  1785. static int ipx_connect(struct socket *sock, struct sockaddr *uaddr,
  1786. int addr_len, int flags)
  1787. {
  1788. struct sock *sk = sock->sk;
  1789. struct sockaddr_ipx *addr;
  1790. int ret = -EINVAL;
  1791. ipx_route *rt;
  1792. sk->state = TCP_CLOSE;
  1793. sock->state  = SS_UNCONNECTED;
  1794. if (addr_len != sizeof(*addr))
  1795. goto out;
  1796. addr = (struct sockaddr_ipx *)uaddr;
  1797. /* put the autobinding in */
  1798. if (!sk->protinfo.af_ipx.port) {
  1799. struct sockaddr_ipx uaddr;
  1800. uaddr.sipx_port = 0;
  1801. uaddr.sipx_network  = 0;
  1802. #ifdef CONFIG_IPX_INTERN
  1803. ret = -ENETDOWN;
  1804. if (!sk->protinfo.af_ipx.intrfc)
  1805. goto out; /* Someone zonked the iface */
  1806. memcpy(uaddr.sipx_node, sk->protinfo.af_ipx.intrfc->if_node,
  1807. IPX_NODE_LEN);
  1808. #endif /* CONFIG_IPX_INTERN */
  1809. ret = ipx_bind(sock, (struct sockaddr *)&uaddr,
  1810. sizeof(struct sockaddr_ipx));
  1811. if (ret)
  1812. goto out;
  1813. }
  1814.         /* We can either connect to primary network or somewhere
  1815.  * we can route to */
  1816. rt = ipxrtr_lookup(addr->sipx_network);
  1817. ret = -ENETUNREACH;
  1818. if (!rt && !(!addr->sipx_network && ipx_primary_net))
  1819. goto out;
  1820. sk->protinfo.af_ipx.dest_addr.net  = addr->sipx_network;
  1821. sk->protinfo.af_ipx.dest_addr.sock = addr->sipx_port;
  1822. memcpy(sk->protinfo.af_ipx.dest_addr.node,
  1823. addr->sipx_node, IPX_NODE_LEN);
  1824. sk->protinfo.af_ipx.type = addr->sipx_type;
  1825. if (sock->type == SOCK_DGRAM) {
  1826. sock->state  = SS_CONNECTED;
  1827. sk->state  = TCP_ESTABLISHED;
  1828. }
  1829. if (rt)
  1830. ipxrtr_put(rt);
  1831. ret = 0;
  1832. out: return ret;
  1833. }
  1834. static int ipx_getname(struct socket *sock, struct sockaddr *uaddr,
  1835. int *uaddr_len, int peer)
  1836. {
  1837. ipx_address *addr;
  1838. struct sockaddr_ipx sipx;
  1839. struct sock *sk = sock->sk;
  1840. int ret;
  1841. *uaddr_len = sizeof(struct sockaddr_ipx);
  1842. if (peer) {
  1843. ret = -ENOTCONN;
  1844. if (sk->state != TCP_ESTABLISHED)
  1845. goto out;
  1846. addr = &sk->protinfo.af_ipx.dest_addr;
  1847. sipx.sipx_network = addr->net;
  1848. sipx.sipx_port = addr->sock;
  1849. memcpy(sipx.sipx_node, addr->node, IPX_NODE_LEN);
  1850. } else {
  1851. if (sk->protinfo.af_ipx.intrfc) {
  1852. sipx.sipx_network =
  1853. sk->protinfo.af_ipx.intrfc->if_netnum;
  1854. #ifdef CONFIG_IPX_INTERN
  1855. memcpy(sipx.sipx_node, sk->protinfo.af_ipx.node,
  1856. IPX_NODE_LEN);
  1857. #else
  1858. memcpy(sipx.sipx_node,
  1859. sk->protinfo.af_ipx.intrfc->if_node,
  1860. IPX_NODE_LEN);
  1861. #endif /* CONFIG_IPX_INTERN */
  1862. } else {
  1863. sipx.sipx_network = 0;
  1864. memset(sipx.sipx_node, '', IPX_NODE_LEN);
  1865. }
  1866. sipx.sipx_port = sk->protinfo.af_ipx.port;
  1867. }
  1868. sipx.sipx_family = AF_IPX;
  1869. sipx.sipx_type  = sk->protinfo.af_ipx.type;
  1870. memcpy(uaddr, &sipx, sizeof(sipx));
  1871. ret = 0;
  1872. out: return ret;
  1873. }
  1874. int ipx_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt)
  1875. {
  1876. /* NULL here for pt means the packet was looped back */
  1877. ipx_interface *intrfc;
  1878. struct ipxhdr *ipx;
  1879. u16 ipx_pktsize;
  1880. int ret = 0;
  1881. /* Not ours */
  1882.         if (skb->pkt_type == PACKET_OTHERHOST)
  1883.          goto drop;
  1884. if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
  1885. goto out;
  1886. ipx = skb->nh.ipxh;
  1887. ipx_pktsize = ntohs(ipx->ipx_pktsize);
  1888. /* Too small or invalid header? */
  1889. if (ipx_pktsize < sizeof(struct ipxhdr) || ipx_pktsize > skb->len)
  1890. goto drop;
  1891.                         
  1892. if (ipx->ipx_checksum != IPX_NO_CHECKSUM &&
  1893.    ipx->ipx_checksum != ipx_cksum(ipx, ipx_pktsize))
  1894. goto drop;
  1895. IPX_SKB_CB(skb)->ipx_tctrl = ipx->ipx_tctrl;
  1896. IPX_SKB_CB(skb)->ipx_dest_net = ipx->ipx_dest.net;
  1897. IPX_SKB_CB(skb)->ipx_source_net = ipx->ipx_source.net;
  1898. /* Determine what local ipx endpoint this is */
  1899. intrfc = ipxitf_find_using_phys(dev, pt->type);
  1900. if (!intrfc) {
  1901. if (ipxcfg_auto_create_interfaces &&
  1902.    ntohl(IPX_SKB_CB(skb)->ipx_dest_net)) {
  1903. intrfc = ipxitf_auto_create(dev, pt->type);
  1904. if (intrfc)
  1905. ipxitf_hold(intrfc);
  1906. }
  1907. if (!intrfc) /* Not one of ours */
  1908. /* or invalid packet for auto creation */
  1909. goto drop;
  1910. }
  1911. ret = ipxitf_rcv(intrfc, skb);
  1912. ipxitf_put(intrfc);
  1913. goto out;
  1914. drop: kfree_skb(skb);
  1915. out: return ret;
  1916. }
  1917. static int ipx_sendmsg(struct socket *sock, struct msghdr *msg, int len,
  1918. struct scm_cookie *scm)
  1919. {
  1920. struct sock *sk = sock->sk;
  1921. struct sockaddr_ipx *usipx = (struct sockaddr_ipx *)msg->msg_name;
  1922. struct sockaddr_ipx local_sipx;
  1923. int ret = -EINVAL;
  1924. int flags = msg->msg_flags;
  1925. /* Socket gets bound below anyway */
  1926. /* if (sk->zapped)
  1927. return -EIO; */ /* Socket not bound */
  1928. if (flags & ~MSG_DONTWAIT)
  1929. goto out;
  1930. if (usipx) {
  1931. if (!sk->protinfo.af_ipx.port) {
  1932. struct sockaddr_ipx uaddr;
  1933. uaddr.sipx_port = 0;
  1934. uaddr.sipx_network = 0;
  1935. #ifdef CONFIG_IPX_INTERN
  1936. ret = -ENETDOWN;
  1937. if (!sk->protinfo.af_ipx.intrfc)
  1938. goto out; /* Someone zonked the iface */
  1939. memcpy(uaddr.sipx_node,
  1940. sk->protinfo.af_ipx.intrfc->if_node,
  1941. IPX_NODE_LEN);
  1942. #endif
  1943. ret = ipx_bind(sock, (struct sockaddr *)&uaddr,
  1944. sizeof(struct sockaddr_ipx));
  1945. if (ret)
  1946. goto out;
  1947. }
  1948. ret = -EINVAL;
  1949. if (msg->msg_namelen < sizeof(*usipx) ||
  1950.     usipx->sipx_family != AF_IPX)
  1951. goto out;
  1952. } else {
  1953. ret = -ENOTCONN;
  1954. if (sk->state != TCP_ESTABLISHED)
  1955. goto out;
  1956. usipx = &local_sipx;
  1957. usipx->sipx_family  = AF_IPX;
  1958. usipx->sipx_type  = sk->protinfo.af_ipx.type;
  1959. usipx->sipx_port  = sk->protinfo.af_ipx.dest_addr.sock;
  1960. usipx->sipx_network  = sk->protinfo.af_ipx.dest_addr.net;
  1961. memcpy(usipx->sipx_node, sk->protinfo.af_ipx.dest_addr.node,
  1962. IPX_NODE_LEN);
  1963. }
  1964. ret = ipxrtr_route_packet(sk, usipx, msg->msg_iov, len,
  1965.      flags & MSG_DONTWAIT);
  1966. if (ret >= 0)
  1967. ret = len;
  1968. out: return ret;
  1969. }
  1970. static int ipx_recvmsg(struct socket *sock, struct msghdr *msg, int size,
  1971. int flags, struct scm_cookie *scm)
  1972. {
  1973. struct sock *sk = sock->sk;
  1974. struct sockaddr_ipx *sipx = (struct sockaddr_ipx *)msg->msg_name;
  1975. struct ipxhdr *ipx = NULL;
  1976. struct sk_buff *skb;
  1977. int copied, err;
  1978. /* put the autobinding in */
  1979. if (!sk->protinfo.af_ipx.port) {
  1980. struct sockaddr_ipx uaddr;
  1981. uaddr.sipx_port = 0;
  1982. uaddr.sipx_network  = 0;
  1983. #ifdef CONFIG_IPX_INTERN
  1984. err = -ENETDOWN;
  1985. if (!sk->protinfo.af_ipx.intrfc)
  1986. goto out; /* Someone zonked the iface */
  1987. memcpy(uaddr.sipx_node,
  1988. sk->protinfo.af_ipx.intrfc->if_node, IPX_NODE_LEN);
  1989. #endif /* CONFIG_IPX_INTERN */
  1990. err = ipx_bind(sock, (struct sockaddr *)&uaddr,
  1991. sizeof(struct sockaddr_ipx));
  1992. if (err)
  1993. goto out;
  1994. }
  1995. err = -ENOTCONN;
  1996. if (sk->zapped)
  1997. goto out;
  1998. skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
  1999. flags & MSG_DONTWAIT, &err);
  2000. if (!skb)
  2001. goto out;
  2002. ipx  = skb->nh.ipxh;
  2003. copied  = ntohs(ipx->ipx_pktsize) - sizeof(struct ipxhdr);
  2004. if (copied > size) {
  2005. copied = size;
  2006. msg->msg_flags |= MSG_TRUNC;
  2007. }
  2008. err = skb_copy_datagram_iovec(skb, sizeof(struct ipxhdr), msg->msg_iov,
  2009. copied);
  2010. if (err)
  2011. goto out_free;
  2012. sk->stamp = skb->stamp;
  2013. msg->msg_namelen = sizeof(*sipx);
  2014. if (sipx) {
  2015. sipx->sipx_family = AF_IPX;
  2016. sipx->sipx_port = ipx->ipx_source.sock;
  2017. memcpy(sipx->sipx_node, ipx->ipx_source.node, IPX_NODE_LEN);
  2018. sipx->sipx_network = IPX_SKB_CB(skb)->ipx_source_net;
  2019. sipx->sipx_type  = ipx->ipx_type;
  2020. }
  2021. err = copied;
  2022. out_free:
  2023. skb_free_datagram(sk, skb);
  2024. out: return err;
  2025. }
  2026. static int ipx_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
  2027. {
  2028. long amount = 0;
  2029. struct sock *sk = sock->sk;
  2030. switch (cmd) {
  2031. case TIOCOUTQ:
  2032. amount = sk->sndbuf - atomic_read(&sk->wmem_alloc);
  2033. if (amount < 0)
  2034. amount = 0;
  2035. return put_user(amount, (int *)arg);
  2036. case TIOCINQ: {
  2037. struct sk_buff *skb = skb_peek(&sk->receive_queue);
  2038. /* These two are safe on a single CPU system as only
  2039.  * user tasks fiddle here */
  2040. if (skb)
  2041. amount = skb->len - sizeof(struct ipxhdr);
  2042. return put_user(amount, (int *)arg);
  2043. }
  2044. case SIOCADDRT:
  2045. case SIOCDELRT:
  2046. if (!capable(CAP_NET_ADMIN))
  2047. return -EPERM;
  2048. return ipxrtr_ioctl(cmd, (void *)arg);
  2049. case SIOCSIFADDR:
  2050. case SIOCAIPXITFCRT:
  2051. case SIOCAIPXPRISLT:
  2052. if (!capable(CAP_NET_ADMIN))
  2053. return -EPERM;
  2054. case SIOCGIFADDR:
  2055. return ipxitf_ioctl(cmd, (void *)arg);
  2056. case SIOCIPXCFGDATA:
  2057. return ipxcfg_get_config_data((void *)arg);
  2058. case SIOCIPXNCPCONN:
  2059. /*
  2060.  * This socket wants to take care of the NCP connection
  2061.  * handed to us in arg.
  2062.  */
  2063.                  if (!capable(CAP_NET_ADMIN))
  2064.                  return -EPERM;
  2065. return get_user(sk->protinfo.af_ipx.ipx_ncp_conn,
  2066. (const unsigned short *)(arg));
  2067. case SIOCGSTAMP: {
  2068. int ret = -EINVAL;
  2069. if (sk) {
  2070. if (!sk->stamp.tv_sec)
  2071. return -ENOENT;
  2072. ret = -EFAULT;
  2073. if (!copy_to_user((void *)arg, &sk->stamp,
  2074. sizeof(struct timeval)))
  2075. ret = 0;
  2076. }
  2077. return ret;
  2078. }
  2079. case SIOCGIFDSTADDR:
  2080. case SIOCSIFDSTADDR:
  2081. case SIOCGIFBRDADDR:
  2082. case SIOCSIFBRDADDR:
  2083. case SIOCGIFNETMASK:
  2084. case SIOCSIFNETMASK:
  2085. return -EINVAL;
  2086. default:
  2087. return dev_ioctl(cmd,(void *) arg);
  2088. }
  2089. /*NOT REACHED*/
  2090. return 0;
  2091. }
  2092. /*
  2093.  *      SPX interface support
  2094.  */
  2095. int ipx_register_spx(struct proto_ops **p, struct net_proto_family *spx)
  2096. {
  2097.         if (spx_family_ops)
  2098.                 return -EBUSY;
  2099.         cli();
  2100.         MOD_INC_USE_COUNT;
  2101.         *p = &ipx_dgram_ops;
  2102.         spx_family_ops = spx;
  2103.         sti();
  2104.         return 0;
  2105. }
  2106. int ipx_unregister_spx(void)
  2107. {
  2108.         spx_family_ops = NULL;
  2109.         MOD_DEC_USE_COUNT;
  2110.         return 0;
  2111. }
  2112. /*
  2113.  * Socket family declarations
  2114.  */
  2115. static struct net_proto_family ipx_family_ops = {
  2116. family: PF_IPX,
  2117. create: ipx_create,
  2118. };
  2119. static struct proto_ops SOCKOPS_WRAPPED(ipx_dgram_ops) = {
  2120. family: PF_IPX,
  2121. release: ipx_release,
  2122. bind: ipx_bind,
  2123. connect: ipx_connect,
  2124. socketpair: sock_no_socketpair,
  2125. accept: sock_no_accept,
  2126. getname: ipx_getname,
  2127. poll: datagram_poll,
  2128. ioctl: ipx_ioctl,
  2129. listen: sock_no_listen,
  2130. shutdown: sock_no_shutdown, /* FIXME: have to support shutdown */
  2131. setsockopt: ipx_setsockopt,
  2132. getsockopt: ipx_getsockopt,
  2133. sendmsg: ipx_sendmsg,
  2134. recvmsg: ipx_recvmsg,
  2135. mmap: sock_no_mmap,
  2136. sendpage: sock_no_sendpage,
  2137. };
  2138. #include <linux/smp_lock.h>
  2139. SOCKOPS_WRAP(ipx_dgram, PF_IPX);
  2140. static struct packet_type ipx_8023_packet_type = {
  2141. type: __constant_htons(ETH_P_802_3),
  2142. func: ipx_rcv,
  2143. data: (void *) 1, /* yap, I understand shared skbs :-) */
  2144. };
  2145. static struct packet_type ipx_dix_packet_type = {
  2146. type: __constant_htons(ETH_P_IPX),
  2147. func: ipx_rcv,
  2148. data: (void *) 1, /* yap, I understand shared skbs :-) */
  2149. };
  2150. static struct notifier_block ipx_dev_notifier = {
  2151. notifier_call: ipxitf_device_event,
  2152. };
  2153. extern struct datalink_proto *make_EII_client(void);
  2154. extern struct datalink_proto *make_8023_client(void);
  2155. extern void destroy_EII_client(struct datalink_proto *);
  2156. extern void destroy_8023_client(struct datalink_proto *);
  2157. static unsigned char ipx_8022_type = 0xE0;
  2158. static unsigned char ipx_snap_id[5] = { 0x0, 0x0, 0x0, 0x81, 0x37 };
  2159. static char banner[] __initdata =
  2160. KERN_INFO "NET4: Linux IPX 0.47 for NET4.0n"
  2161. KERN_INFO "IPX Portions Copyright (c) 1995 Caldera, Inc.n" 
  2162. KERN_INFO "IPX Portions Copyright (c) 2000, 2001 Conectiva, Inc.n";
  2163. static int __init ipx_init(void)
  2164. {
  2165. sock_register(&ipx_family_ops);
  2166. pEII_datalink = make_EII_client();
  2167. dev_add_pack(&ipx_dix_packet_type);
  2168. p8023_datalink = make_8023_client();
  2169. dev_add_pack(&ipx_8023_packet_type);
  2170. p8022_datalink = register_8022_client(ipx_8022_type, ipx_rcv);
  2171. if (!p8022_datalink)
  2172. printk(KERN_CRIT "IPX: Unable to register with 802.2n");
  2173. pSNAP_datalink = register_snap_client(ipx_snap_id, ipx_rcv);
  2174. if (!pSNAP_datalink)
  2175. printk(KERN_CRIT "IPX: Unable to register with SNAPn");
  2176. register_netdevice_notifier(&ipx_dev_notifier);
  2177. ipx_register_sysctl();
  2178. #ifdef CONFIG_PROC_FS
  2179. proc_net_create("ipx", 0, ipx_get_info);
  2180. proc_net_create("ipx_interface", 0, ipx_interface_get_info);
  2181. proc_net_create("ipx_route", 0, ipx_rt_get_info);
  2182. #endif
  2183. printk(banner);
  2184. return 0;
  2185. }
  2186. module_init(ipx_init);
  2187. /* Higher layers need this info to prep tx pkts */
  2188. int ipx_if_offset(unsigned long ipx_net_number)
  2189. {
  2190. ipx_route *rt = ipxrtr_lookup(ipx_net_number);
  2191. int ret = -ENETUNREACH;
  2192. if (!rt)
  2193. goto out;
  2194. ret = rt->ir_intrfc->if_ipx_offset;
  2195. ipxrtr_put(rt);
  2196. out: return ret;
  2197. }
  2198. /* Export symbols for higher layers */
  2199. EXPORT_SYMBOL(ipxrtr_route_skb);
  2200. EXPORT_SYMBOL(ipx_if_offset);
  2201. EXPORT_SYMBOL(ipx_remove_socket);
  2202. EXPORT_SYMBOL(ipx_register_spx);
  2203. EXPORT_SYMBOL(ipx_unregister_spx);
  2204. /* Note on MOD_{INC,DEC}_USE_COUNT:
  2205.  *
  2206.  * Use counts are incremented/decremented when
  2207.  * sockets are created/deleted.
  2208.  *
  2209.  * Routes are always associated with an interface, and
  2210.  * allocs/frees will remain properly accounted for by
  2211.  * their associated interfaces.
  2212.  *
  2213.  * Ergo, before the ipx module can be removed, all IPX
  2214.  * sockets be closed from user space.
  2215.  */
  2216. static void __exit ipx_proto_finito(void)
  2217. {
  2218. /* no need to worry about having anything on the ipx_interfaces
  2219.  * list, when a interface is created we increment the module
  2220.  * usage count, so the module will only be unloaded when there
  2221.  * are no more interfaces */
  2222. proc_net_remove("ipx_route");
  2223. proc_net_remove("ipx_interface");
  2224. proc_net_remove("ipx");
  2225. ipx_unregister_sysctl();
  2226. unregister_netdevice_notifier(&ipx_dev_notifier);
  2227. unregister_snap_client(ipx_snap_id);
  2228. pSNAP_datalink = NULL;
  2229. unregister_8022_client(ipx_8022_type);
  2230. p8022_datalink = NULL;
  2231. dev_remove_pack(&ipx_8023_packet_type);
  2232. destroy_8023_client(p8023_datalink);
  2233. p8023_datalink = NULL;
  2234. dev_remove_pack(&ipx_dix_packet_type);
  2235. destroy_EII_client(pEII_datalink);
  2236. pEII_datalink = NULL;
  2237. sock_unregister(ipx_family_ops.family);
  2238. }
  2239. module_exit(ipx_proto_finito);
  2240. MODULE_LICENSE("GPL");