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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * DECnet       An implementation of the DECnet protocol suite for the LINUX
  3.  *              operating system.  DECnet is implemented using the  BSD Socket
  4.  *              interface as the means of communication with the user level.
  5.  *
  6.  *              DECnet Socket Layer Interface
  7.  *
  8.  * Authors:     Eduardo Marcelo Serrat <emserrat@geocities.com>
  9.  *              Patrick Caulfield <patrick@pandh.demon.co.uk>
  10.  *
  11.  * Changes:
  12.  *        Steve Whitehouse: Copied from Eduardo Serrat and Patrick Caulfield's
  13.  *                          version of the code. Original copyright preserved
  14.  *                          below.
  15.  *        Steve Whitehouse: Some bug fixes, cleaning up some code to make it
  16.  *                          compatible with my routing layer.
  17.  *        Steve Whitehouse: Merging changes from Eduardo Serrat and Patrick
  18.  *                          Caulfield.
  19.  *        Steve Whitehouse: Further bug fixes, checking module code still works
  20.  *                          with new routing layer.
  21.  *        Steve Whitehouse: Additional set/get_sockopt() calls.
  22.  *        Steve Whitehouse: Fixed TIOCINQ ioctl to be same as Eduardo's new
  23.  *                          code.
  24.  *        Steve Whitehouse: recvmsg() changed to try and behave in a POSIX like
  25.  *                          way. Didn't manage it entirely, but its better.
  26.  *        Steve Whitehouse: ditto for sendmsg().
  27.  *        Steve Whitehouse: A selection of bug fixes to various things.
  28.  *        Steve Whitehouse: Added TIOCOUTQ ioctl.
  29.  *        Steve Whitehouse: Fixes to username2sockaddr & sockaddr2username.
  30.  *        Steve Whitehouse: Fixes to connect() error returns.
  31.  *       Patrick Caulfield: Fixes to delayed acceptance logic.
  32.  *         David S. Miller: New socket locking
  33.  *        Steve Whitehouse: Socket list hashing/locking
  34.  *         Arnaldo C. Melo: use capable, not suser
  35.  *        Steve Whitehouse: Removed unused code. Fix to use sk->allocation
  36.  *                          when required.
  37.  *       Patrick Caulfield: /proc/net/decnet now has object name/number
  38.  *        Steve Whitehouse: Fixed local port allocation, hashed sk list
  39.  */
  40. /******************************************************************************
  41.     (c) 1995-1998 E.M. Serrat emserrat@geocities.com
  42.     
  43.     This program is free software; you can redistribute it and/or modify
  44.     it under the terms of the GNU General Public License as published by
  45.     the Free Software Foundation; either version 2 of the License, or
  46.     any later version.
  47.     This program is distributed in the hope that it will be useful,
  48.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  49.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  50.     GNU General Public License for more details.
  51. HISTORY:
  52. Version           Kernel     Date       Author/Comments
  53. -------           ------     ----       ---------------
  54. Version 0.0.1     2.0.30    01-dic-97 Eduardo Marcelo Serrat
  55. (emserrat@geocities.com)
  56.                                         First Development of DECnet Socket La-
  57. yer for Linux. Only supports outgoing
  58. connections.
  59. Version 0.0.2   2.1.105   20-jun-98   Patrick J. Caulfield
  60. (patrick@pandh.demon.co.uk)
  61. Port to new kernel development version.
  62. Version 0.0.3     2.1.106   25-jun-98   Eduardo Marcelo Serrat
  63. (emserrat@geocities.com)
  64. _
  65.                                         Added support for incoming connections
  66.                                         so we can start developing server apps
  67.                                         on Linux.
  68. -
  69. Module Support
  70. Version 0.0.4     2.1.109   21-jul-98   Eduardo Marcelo Serrat
  71.                                        (emserrat@geocities.com)
  72.                                        _
  73.                                         Added support for X11R6.4. Now we can 
  74.                                         use DECnet transport for X on Linux!!!
  75.                                        -
  76. Version 0.0.5    2.1.110   01-aug-98   Eduardo Marcelo Serrat
  77.                                        (emserrat@geocities.com)
  78.                                        Removed bugs on flow control
  79.                                        Removed bugs on incoming accessdata
  80.                                        order
  81.                                        -
  82. Version 0.0.6    2.1.110   07-aug-98   Eduardo Marcelo Serrat
  83.                                        dn_recvmsg fixes
  84.                                         Patrick J. Caulfield
  85.                                        dn_bind fixes
  86. *******************************************************************************/
  87. #include <linux/config.h>
  88. #include <linux/module.h>
  89. #include <linux/errno.h>
  90. #include <linux/types.h>
  91. #include <linux/socket.h>
  92. #include <linux/in.h>
  93. #include <linux/kernel.h>
  94. #include <linux/sched.h>
  95. #include <linux/timer.h>
  96. #include <linux/string.h>
  97. #include <linux/sockios.h>
  98. #include <linux/net.h>
  99. #include <linux/netdevice.h>
  100. #include <linux/inet.h>
  101. #include <linux/route.h>
  102. #include <linux/netfilter.h>
  103. #include <net/sock.h>
  104. #include <asm/segment.h>
  105. #include <asm/system.h>
  106. #include <asm/ioctls.h>
  107. #include <linux/mm.h>
  108. #include <linux/interrupt.h>
  109. #include <linux/proc_fs.h>
  110. #include <linux/stat.h>
  111. #include <linux/init.h>
  112. #include <linux/poll.h>
  113. #include <net/neighbour.h>
  114. #include <net/dst.h>
  115. #include <net/dn.h>
  116. #include <net/dn_nsp.h>
  117. #include <net/dn_dev.h>
  118. #include <net/dn_route.h>
  119. #include <net/dn_fib.h>
  120. #include <net/dn_neigh.h>
  121. static void dn_keepalive(struct sock *sk);
  122. /*
  123.  * decnet_address is kept in network order, decnet_ether_address is kept
  124.  * as a string of bytes.
  125.  */
  126. dn_address decnet_address = 0;
  127. unsigned char decnet_ether_address[ETH_ALEN] = { 0xAA, 0x00, 0x04, 0x00, 0x00, 0x00 };
  128. #define DN_SK_HASH_SHIFT 8
  129. #define DN_SK_HASH_SIZE (1 << DN_SK_HASH_SHIFT)
  130. #define DN_SK_HASH_MASK (DN_SK_HASH_SIZE - 1)
  131. static struct proto_ops dn_proto_ops;
  132. rwlock_t dn_hash_lock = RW_LOCK_UNLOCKED;
  133. static struct sock *dn_sk_hash[DN_SK_HASH_SIZE];
  134. static struct sock *dn_wild_sk;
  135. static int __dn_setsockopt(struct socket *sock, int level, int optname, char *optval, int optlen, int flags);
  136. static int __dn_getsockopt(struct socket *sock, int level, int optname, char *optval, int *optlen, int flags);
  137. static struct sock **dn_find_list(struct sock *sk)
  138. {
  139. struct dn_scp *scp = DN_SK(sk);
  140. if (scp->addr.sdn_flags & SDF_WILD)
  141. return dn_wild_sk ? NULL : &dn_wild_sk;
  142. return &dn_sk_hash[scp->addrloc & DN_SK_HASH_MASK];
  143. }
  144. /* 
  145.  * Valid ports are those greater than zero and not already in use.
  146.  */
  147. static int check_port(unsigned short port)
  148. {
  149. struct sock *sk = dn_sk_hash[port & DN_SK_HASH_MASK];
  150. if (port == 0)
  151. return -1;
  152. while(sk) {
  153. struct dn_scp *scp = DN_SK(sk);
  154. if (scp->addrloc == port)
  155. return -1;
  156. sk = sk->next;
  157. }
  158. return 0;
  159. }
  160. static unsigned short port_alloc(struct sock *sk)
  161. {
  162. struct dn_scp *scp = DN_SK(sk);
  163. static unsigned short port = 0x2000;
  164. unsigned short i_port = port;
  165. while(check_port(++port) != 0) {
  166. if (port == i_port)
  167. return 0;
  168. }
  169. scp->addrloc = port;
  170. return 1;
  171. }
  172. /*
  173.  * Since this is only ever called from user
  174.  * level, we don't need a write_lock() version
  175.  * of this.
  176.  */
  177. static int dn_hash_sock(struct sock *sk)
  178. {
  179. struct dn_scp *scp = DN_SK(sk);
  180. struct sock **skp;
  181. int rv = -EUSERS;
  182. if (sk->next)
  183. BUG();
  184. if (sk->pprev)
  185. BUG();
  186. write_lock_bh(&dn_hash_lock);
  187. if (!scp->addrloc && !port_alloc(sk))
  188. goto out;
  189. rv = -EADDRINUSE;
  190. if ((skp = dn_find_list(sk)) == NULL)
  191. goto out;
  192. sk->next = *skp;
  193. sk->pprev = skp;
  194. *skp = sk;
  195. rv = 0;
  196. out:
  197. write_unlock_bh(&dn_hash_lock);
  198. return rv;
  199. }
  200. static void dn_unhash_sock(struct sock *sk)
  201. {
  202. struct sock **skp = sk->pprev;
  203. if (skp == NULL)
  204. return;
  205. write_lock(&dn_hash_lock);
  206. while(*skp != sk)
  207. skp = &((*skp)->next);
  208. *skp = sk->next;
  209. write_unlock(&dn_hash_lock);
  210. sk->next = NULL;
  211. sk->pprev = NULL;
  212. }
  213. static void dn_unhash_sock_bh(struct sock *sk)
  214. {
  215. struct sock **skp = sk->pprev;
  216. if (skp == NULL)
  217. return;
  218. write_lock_bh(&dn_hash_lock);
  219. while(*skp != sk)
  220. skp = &((*skp)->next);
  221. *skp = sk->next;
  222. write_unlock_bh(&dn_hash_lock);
  223. sk->next = NULL;
  224. sk->pprev = NULL;
  225. }
  226. struct sock **listen_hash(struct sockaddr_dn *addr)
  227. {
  228. int i;
  229. unsigned hash = addr->sdn_objnum;
  230. if (hash == 0) {
  231. hash = addr->sdn_objnamel;
  232. for(i = 0; i < addr->sdn_objnamel; i++) {
  233. hash ^= addr->sdn_objname[i];
  234. hash ^= (hash << 3);
  235. }
  236. }
  237. return &dn_sk_hash[hash & DN_SK_HASH_MASK];
  238. }
  239. /*
  240.  * Called to transform a socket from bound (i.e. with a local address)
  241.  * into a listening socket (doesn't need a local port number) and rehashes
  242.  * based upon the object name/number.
  243.  */
  244. static void dn_rehash_sock(struct sock *sk)
  245. {
  246. struct sock **skp = sk->pprev;
  247. struct dn_scp *scp = DN_SK(sk);
  248. if (scp->addr.sdn_flags & SDF_WILD)
  249. return;
  250. write_lock_bh(&dn_hash_lock);
  251. while(*skp != sk)
  252. skp = &((*skp)->next);
  253. *skp = sk->next;
  254. DN_SK(sk)->addrloc = 0;
  255. skp = listen_hash(&DN_SK(sk)->addr);
  256. sk->next = *skp;
  257. sk->pprev = skp;
  258. *skp = sk;
  259. write_unlock_bh(&dn_hash_lock);
  260. }
  261. int dn_sockaddr2username(struct sockaddr_dn *sdn, unsigned char *buf, unsigned char type)
  262. {
  263. int len = 2;
  264. *buf++ = type;
  265. switch(type) {
  266. case 0:
  267. *buf++ = sdn->sdn_objnum;
  268. break;
  269. case 1:
  270. *buf++ = 0;
  271. *buf++ = dn_ntohs(sdn->sdn_objnamel);
  272. memcpy(buf, sdn->sdn_objname, dn_ntohs(sdn->sdn_objnamel));
  273. len = 3 + dn_ntohs(sdn->sdn_objnamel);
  274. break;
  275. case 2:
  276. memset(buf, 0, 5);
  277. buf += 5;
  278. *buf++ = dn_ntohs(sdn->sdn_objnamel);
  279. memcpy(buf, sdn->sdn_objname, dn_ntohs(sdn->sdn_objnamel));
  280. len = 7 + dn_ntohs(sdn->sdn_objnamel);
  281. break;
  282. }
  283. return len;
  284. }
  285. /*
  286.  * On reception of usernames, we handle types 1 and 0 for destination
  287.  * addresses only. Types 2 and 4 are used for source addresses, but the
  288.  * UIC, GIC are ignored and they are both treated the same way. Type 3
  289.  * is never used as I've no idea what its purpose might be or what its
  290.  * format is.
  291.  */
  292. int dn_username2sockaddr(unsigned char *data, int len, struct sockaddr_dn *sdn, unsigned char *fmt)
  293. {
  294. unsigned char type;
  295. int size = len;
  296. int namel = 12;
  297. sdn->sdn_objnum = 0;
  298. sdn->sdn_objnamel = dn_htons(0);
  299. memset(sdn->sdn_objname, 0, DN_MAXOBJL);
  300. if (len < 2)
  301. return -1;
  302. len -= 2;
  303. *fmt = *data++;
  304. type = *data++;
  305. switch(*fmt) {
  306. case 0:
  307. sdn->sdn_objnum = type;
  308. return 2;
  309. case 1:
  310. namel = 16;
  311. break;
  312. case 2:
  313. len  -= 4;
  314. data += 4;
  315. break;
  316. case 4:
  317. len  -= 8;
  318. data += 8;
  319. break;
  320. default:
  321. return -1;
  322. }
  323. len -= 1;
  324. if (len < 0)
  325. return -1;
  326. sdn->sdn_objnamel = dn_htons(*data++);
  327. len -= dn_ntohs(sdn->sdn_objnamel);
  328. if ((len < 0) || (dn_ntohs(sdn->sdn_objnamel) > namel))
  329. return -1;
  330. memcpy(sdn->sdn_objname, data, dn_ntohs(sdn->sdn_objnamel));
  331. return size - len;
  332. }
  333. struct sock *dn_sklist_find_listener(struct sockaddr_dn *addr)
  334. {
  335. struct sock **skp = listen_hash(addr);
  336. struct sock *sk;
  337. read_lock(&dn_hash_lock);
  338. for(sk = *skp; sk != NULL; sk = sk->next) {
  339. struct dn_scp *scp = DN_SK(sk);
  340. if (sk->state != TCP_LISTEN)
  341. continue;
  342. if (scp->addr.sdn_objnum) {
  343. if (scp->addr.sdn_objnum != addr->sdn_objnum)
  344. continue;
  345. } else {
  346. if (addr->sdn_objnum)
  347. continue;
  348. if (scp->addr.sdn_objnamel != addr->sdn_objnamel)
  349. continue;
  350. if (memcmp(scp->addr.sdn_objname, addr->sdn_objname, dn_ntohs(addr->sdn_objnamel)) != 0)
  351. continue;
  352. }
  353. sock_hold(sk);
  354. read_unlock(&dn_hash_lock);
  355. return sk;
  356. }
  357. if (dn_wild_sk && (dn_wild_sk->state == TCP_LISTEN))
  358. sock_hold((sk = dn_wild_sk));
  359. read_unlock(&dn_hash_lock);
  360. return sk;
  361. }
  362. struct sock *dn_find_by_skb(struct sk_buff *skb)
  363. {
  364. struct dn_skb_cb *cb = DN_SKB_CB(skb);
  365. struct sock *sk;
  366. struct dn_scp *scp;
  367. read_lock(&dn_hash_lock);
  368. sk = dn_sk_hash[cb->dst_port & DN_SK_HASH_MASK];
  369. for (; sk != NULL; sk = sk->next) {
  370. scp = DN_SK(sk);
  371. if (cb->src != dn_saddr2dn(&scp->peer))
  372. continue;
  373. if (cb->dst_port != scp->addrloc)
  374. continue;
  375. if (scp->addrrem && (cb->src_port != scp->addrrem))
  376. continue;
  377. break;
  378. }
  379. if (sk)
  380. sock_hold(sk);
  381. read_unlock(&dn_hash_lock);
  382. return sk;
  383. }
  384. static void dn_destruct(struct sock *sk)
  385. {
  386. struct dn_scp *scp = DN_SK(sk);
  387. skb_queue_purge(&scp->data_xmit_queue);
  388. skb_queue_purge(&scp->other_xmit_queue);
  389. skb_queue_purge(&scp->other_receive_queue);
  390. dst_release(xchg(&sk->dst_cache, NULL));
  391. MOD_DEC_USE_COUNT;
  392. }
  393. struct sock *dn_alloc_sock(struct socket *sock, int gfp)
  394. {
  395. struct sock *sk;
  396. struct dn_scp *scp;
  397. if  ((sk = sk_alloc(PF_DECnet, gfp, 1)) == NULL) 
  398. goto no_sock;
  399. if (sock) {
  400. sock->ops = &dn_proto_ops;
  401. }
  402. sock_init_data(sock,sk);
  403. scp = DN_SK(sk);
  404. sk->backlog_rcv = dn_nsp_backlog_rcv;
  405. sk->destruct    = dn_destruct;
  406. sk->no_check    = 1;
  407. sk->family      = PF_DECnet;
  408. sk->protocol    = 0;
  409. sk->allocation  = gfp;
  410. /* Initialization of DECnet Session Control Port */
  411. scp->state = DN_O; /* Open */
  412. scp->numdat = 1; /* Next data seg to tx */
  413. scp->numoth = 1; /* Next oth data to tx  */
  414. scp->ackxmt_dat = 0; /* Last data seg ack'ed */
  415. scp->ackxmt_oth = 0; /* Last oth data ack'ed */
  416. scp->ackrcv_dat = 0; /* Highest data ack recv*/
  417. scp->ackrcv_oth = 0; /* Last oth data ack rec*/
  418.         scp->flowrem_sw = DN_SEND;
  419. scp->flowloc_sw = DN_SEND;
  420. scp->flowrem_dat = 0;
  421. scp->flowrem_oth = 1;
  422. scp->flowloc_dat = 0;
  423. scp->flowloc_oth = 1;
  424. scp->services_rem = 0;
  425. scp->services_loc = 1 | NSP_FC_NONE;
  426. scp->info_rem = 0;
  427. scp->info_loc = 0x03; /* NSP version 4.1 */
  428. scp->segsize_rem = 230; /* Default: Updated by remote segsize */
  429. scp->segsize_loc = 1450; /* Best guess for ethernet */
  430. scp->nonagle = 0;
  431. scp->multi_ireq = 1;
  432. scp->accept_mode = ACC_IMMED;
  433. scp->addr.sdn_family    = AF_DECnet;
  434. scp->peer.sdn_family    = AF_DECnet;
  435. scp->accessdata.acc_accl = 5;
  436. memcpy(scp->accessdata.acc_acc, "LINUX", 5);
  437. scp->max_window   = NSP_MAX_WINDOW;
  438. scp->snd_window   = NSP_MIN_WINDOW;
  439. scp->nsp_srtt     = NSP_INITIAL_SRTT;
  440. scp->nsp_rttvar   = NSP_INITIAL_RTTVAR;
  441. scp->nsp_rxtshift = 0;
  442. skb_queue_head_init(&scp->data_xmit_queue);
  443. skb_queue_head_init(&scp->other_xmit_queue);
  444. skb_queue_head_init(&scp->other_receive_queue);
  445. scp->persist = 0;
  446. scp->persist_fxn = NULL;
  447. scp->keepalive = 10 * HZ;
  448. scp->keepalive_fxn = dn_keepalive;
  449. init_timer(&scp->delack_timer);
  450. scp->delack_pending = 0;
  451. scp->delack_fxn = dn_nsp_delayed_ack;
  452. dn_start_slow_timer(sk);
  453. MOD_INC_USE_COUNT;
  454. return sk;
  455. no_sock:
  456. return NULL;
  457. }
  458. /*
  459.  * Keepalive timer.
  460.  * FIXME: Should respond to SO_KEEPALIVE etc.
  461.  */
  462. static void dn_keepalive(struct sock *sk)
  463. {
  464. struct dn_scp *scp = DN_SK(sk);
  465. /*
  466.  * By checking the other_data transmit queue is empty
  467.  * we are double checking that we are not sending too
  468.  * many of these keepalive frames.
  469.  */
  470. if (skb_queue_len(&scp->other_xmit_queue) == 0)
  471. dn_nsp_send_link(sk, DN_NOCHANGE, 0);
  472. }
  473. /*
  474.  * Timer for shutdown/destroyed sockets.
  475.  * When socket is dead & no packets have been sent for a
  476.  * certain amount of time, they are removed by this
  477.  * routine. Also takes care of sending out DI & DC
  478.  * frames at correct times.
  479.  */
  480. int dn_destroy_timer(struct sock *sk)
  481. {
  482. struct dn_scp *scp = DN_SK(sk);
  483. scp->persist = dn_nsp_persist(sk);
  484. switch(scp->state) {
  485. case DN_DI:
  486. dn_nsp_send_disc(sk, NSP_DISCINIT, 0, GFP_ATOMIC);
  487. if (scp->nsp_rxtshift >= decnet_di_count)
  488. scp->state = DN_CN;
  489. return 0;
  490. case DN_DR:
  491. dn_nsp_send_disc(sk, NSP_DISCINIT, 0, GFP_ATOMIC);
  492. if (scp->nsp_rxtshift >= decnet_dr_count)
  493. scp->state = DN_DRC;
  494. return 0;
  495. case DN_DN:
  496. if (scp->nsp_rxtshift < decnet_dn_count) {
  497. /* printk(KERN_DEBUG "dn_destroy_timer: DNn"); */
  498. dn_nsp_send_disc(sk, NSP_DISCCONF, NSP_REASON_DC, GFP_ATOMIC);
  499. return 0;
  500. }
  501. }
  502. scp->persist = (HZ * decnet_time_wait);
  503. if (sk->socket)
  504. return 0;
  505. dn_stop_fast_timer(sk); /* unlikely, but possible that this is runninng */
  506. if ((jiffies - scp->stamp) >= (HZ * decnet_time_wait)) {
  507. dn_unhash_sock(sk);
  508. sock_put(sk);
  509. return 1;
  510. }
  511. return 0;
  512. }
  513. static void dn_destroy_sock(struct sock *sk)
  514. {
  515. struct dn_scp *scp = DN_SK(sk);
  516. scp->nsp_rxtshift = 0; /* reset back off */
  517. if (sk->socket) {
  518. if (sk->socket->state != SS_UNCONNECTED)
  519. sk->socket->state = SS_DISCONNECTING;
  520. }
  521. sk->state = TCP_CLOSE;
  522. switch(scp->state) {
  523. case DN_DN:
  524. dn_nsp_send_disc(sk, NSP_DISCCONF, NSP_REASON_DC, sk->allocation);
  525. scp->persist_fxn = dn_destroy_timer;
  526. scp->persist = dn_nsp_persist(sk);
  527. break;
  528. case DN_CR:
  529. scp->state = DN_DR;
  530. goto disc_reject;
  531. case DN_RUN:
  532. scp->state = DN_DI;
  533. case DN_DI:
  534. case DN_DR:
  535. disc_reject:
  536. dn_nsp_send_disc(sk, NSP_DISCINIT, 0, sk->allocation);
  537. case DN_NC:
  538. case DN_NR:
  539. case DN_RJ:
  540. case DN_DIC:
  541. case DN_CN:
  542. case DN_DRC:
  543. case DN_CI:
  544. case DN_CD:
  545. scp->persist_fxn = dn_destroy_timer;
  546. scp->persist = dn_nsp_persist(sk);
  547. break;
  548. default:
  549. printk(KERN_DEBUG "DECnet: dn_destroy_sock passed socket in invalid staten");
  550. case DN_O:
  551. dn_stop_fast_timer(sk);
  552. dn_stop_slow_timer(sk);
  553. dn_unhash_sock_bh(sk);
  554. sock_put(sk);
  555. break;
  556. }
  557. }
  558. char *dn_addr2asc(dn_address addr, char *buf)
  559. {
  560. unsigned short node, area;
  561. node = addr & 0x03ff;
  562. area = addr >> 10;
  563. sprintf(buf, "%hd.%hd", area, node);
  564. return buf;
  565. }
  566. static char *dn_state2asc(unsigned char state)
  567. {
  568. switch(state) {
  569. case DN_O:
  570. return "OPEN";
  571. case DN_CR:
  572. return "  CR";
  573. case DN_DR:
  574. return "  DR";
  575. case DN_DRC:
  576. return " DRC";
  577. case DN_CC:
  578. return "  CC";
  579. case DN_CI:
  580. return "  CI";
  581. case DN_NR:
  582. return "  NR";
  583. case DN_NC:
  584. return "  NC";
  585. case DN_CD:
  586. return "  CD";
  587. case DN_RJ:
  588. return "  RJ";
  589. case DN_RUN:
  590. return " RUN";
  591. case DN_DI:
  592. return "  DI";
  593. case DN_DIC:
  594. return " DIC";
  595. case DN_DN:
  596. return "  DN";
  597. case DN_CL:
  598. return "  CL";
  599. case DN_CN:
  600. return "  CN";
  601. }
  602. return "????";
  603. }
  604. static int dn_create(struct socket *sock, int protocol)
  605. {
  606. struct sock *sk;
  607. switch(sock->type) {
  608. case SOCK_SEQPACKET:
  609. if (protocol != DNPROTO_NSP)
  610. return -EPROTONOSUPPORT;
  611. break;
  612. case SOCK_STREAM:
  613. break;
  614. default:
  615. return -ESOCKTNOSUPPORT;
  616. }
  617. if ((sk = dn_alloc_sock(sock, GFP_KERNEL)) == NULL) 
  618. return -ENOBUFS;
  619. sk->protocol = protocol;
  620. return 0;
  621. }
  622. static int
  623. dn_release(struct socket *sock)
  624. {
  625. struct sock *sk = sock->sk;
  626. if (sk) {
  627. sock_orphan(sk);
  628. sock_hold(sk);
  629. lock_sock(sk);
  630. dn_destroy_sock(sk);
  631. release_sock(sk);
  632. sock_put(sk);
  633. }
  634.         return 0;
  635. }
  636. static int dn_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
  637. {
  638. struct sock *sk = sock->sk;
  639. struct dn_scp *scp = DN_SK(sk);
  640. struct sockaddr_dn *saddr = (struct sockaddr_dn *)uaddr;
  641. struct net_device *dev;
  642. int rv;
  643. if (sk->zapped == 0)
  644. return -EINVAL;
  645. if (addr_len != sizeof(struct sockaddr_dn))
  646. return -EINVAL;
  647. if (saddr->sdn_family != AF_DECnet)
  648. return -EINVAL;
  649. if (dn_ntohs(saddr->sdn_nodeaddrl) && (dn_ntohs(saddr->sdn_nodeaddrl) != 2))
  650. return -EINVAL;
  651. if (saddr->sdn_objnum && !capable(CAP_NET_BIND_SERVICE))
  652. return -EPERM;
  653. if (dn_ntohs(saddr->sdn_objnamel) > DN_MAXOBJL)
  654. return -EINVAL;
  655. if (saddr->sdn_flags & ~SDF_WILD)
  656. return -EINVAL;
  657. if (saddr->sdn_flags & SDF_WILD) {
  658. if (!capable(CAP_NET_BIND_SERVICE))
  659. return -EPERM;
  660. } else {
  661. if (dn_ntohs(saddr->sdn_nodeaddrl)) {
  662. read_lock(&dev_base_lock);
  663. for(dev = dev_base; dev; dev = dev->next) {
  664. if (!dev->dn_ptr)
  665. continue;
  666. if (dn_dev_islocal(dev, dn_saddr2dn(saddr)))
  667. break;
  668. }
  669. read_unlock(&dev_base_lock);
  670. if (dev == NULL)
  671. return -EADDRNOTAVAIL;
  672. }
  673. }
  674. memcpy(&scp->addr, saddr, addr_len);
  675. sk->zapped = 0;
  676. if ((rv = dn_hash_sock(sk)) != 0)
  677. sk->zapped = 1;
  678.         return rv;
  679. }
  680. static int dn_auto_bind(struct socket *sock)
  681. {
  682. struct sock *sk = sock->sk;
  683. struct dn_scp *scp = DN_SK(sk);
  684. sk->zapped = 0;
  685. scp->addr.sdn_flags  = 0;
  686. scp->addr.sdn_objnum = 0;
  687. /*
  688.  * This stuff is to keep compatibility with Eduardo's
  689.  * patch. I hope I can dispense with it shortly...
  690.  */
  691. if ((scp->accessdata.acc_accl != 0) &&
  692. (scp->accessdata.acc_accl <= 12)) {
  693. scp->addr.sdn_objnamel = dn_htons(scp->accessdata.acc_accl);
  694. memcpy(scp->addr.sdn_objname, scp->accessdata.acc_acc, dn_ntohs(scp->addr.sdn_objnamel));
  695. scp->accessdata.acc_accl = 0;
  696. memset(scp->accessdata.acc_acc, 0, 40);
  697. }
  698. scp->addr.sdn_add.a_len = dn_htons(2);
  699. *(dn_address *)scp->addr.sdn_add.a_addr = decnet_address;
  700. dn_hash_sock(sk);
  701. return 0;
  702. }
  703. static int dn_connect(struct socket *sock, struct sockaddr *uaddr, int addr_len, int flags)
  704. {
  705. struct sockaddr_dn *addr = (struct sockaddr_dn *)uaddr;
  706. struct sock *sk = sock->sk;
  707. struct dn_scp *scp = DN_SK(sk);
  708. int err = -EISCONN;
  709. lock_sock(sk);
  710. if (sock->state == SS_CONNECTED) 
  711. goto out;
  712. if (sock->state == SS_CONNECTING) {
  713. err = 0;
  714. if (sk->state == TCP_ESTABLISHED)
  715. goto out;
  716. err = -ECONNREFUSED;
  717. if (sk->state == TCP_CLOSE)
  718. goto out;
  719. }
  720. err = -EINVAL;
  721. if (DN_SK(sk)->state != DN_O)
  722. goto out;
  723. if (addr_len != sizeof(struct sockaddr_dn))
  724. goto out;
  725. if (addr->sdn_family != AF_DECnet)
  726. goto out;
  727. if (addr->sdn_flags & SDF_WILD)
  728. goto out;
  729. err = -EADDRNOTAVAIL;
  730. if (sk->zapped && (err = dn_auto_bind(sock)))
  731. goto out;
  732. memcpy(&scp->peer, addr, addr_len);
  733. err = -EHOSTUNREACH;
  734. if (dn_route_output(&sk->dst_cache, dn_saddr2dn(&scp->peer), dn_saddr2dn(&scp->addr), 0) < 0)
  735. goto out;
  736. sk->state   = TCP_SYN_SENT;
  737. sock->state = SS_CONNECTING;
  738. DN_SK(sk)->state = DN_CI;
  739. dn_nsp_send_conninit(sk, NSP_CI);
  740. err = -EINPROGRESS;
  741. if ((sk->state == TCP_SYN_SENT) && (flags & O_NONBLOCK))
  742. goto out;
  743. while(sk->state == TCP_SYN_SENT) {
  744. err = -ERESTARTSYS;
  745. if (signal_pending(current))
  746. goto out;
  747. if ((err = sock_error(sk)) != 0) {
  748. sock->state = SS_UNCONNECTED;
  749. goto out;
  750. }
  751. SOCK_SLEEP_PRE(sk);
  752. if (sk->state == TCP_SYN_SENT)
  753. schedule();
  754. SOCK_SLEEP_POST(sk);
  755. }
  756. if (sk->state != TCP_ESTABLISHED) {
  757. sock->state = SS_UNCONNECTED;
  758. err = sock_error(sk);
  759. goto out;
  760. }
  761. err = 0;
  762. sock->state = SS_CONNECTED;
  763. out:
  764. release_sock(sk);
  765.         return err;
  766. }
  767. static void dn_access_copy(struct sk_buff *skb, struct accessdata_dn *acc)
  768. {
  769.         unsigned char *ptr = skb->data;
  770.         acc->acc_userl = *ptr++;
  771.         memcpy(&acc->acc_user, ptr, acc->acc_userl);
  772.         ptr += acc->acc_userl;
  773.         acc->acc_passl = *ptr++;
  774.         memcpy(&acc->acc_pass, ptr, acc->acc_passl);
  775.         ptr += acc->acc_passl;
  776.         acc->acc_accl = *ptr++;
  777.         memcpy(&acc->acc_acc, ptr, acc->acc_accl);
  778.         skb_pull(skb, acc->acc_accl + acc->acc_passl + acc->acc_userl + 3);
  779. }
  780. static void dn_user_copy(struct sk_buff *skb, struct optdata_dn *opt)
  781. {
  782.         unsigned char *ptr = skb->data;
  783.         
  784.         opt->opt_optl   = *ptr++;
  785.         opt->opt_status = 0;
  786.         memcpy(opt->opt_data, ptr, opt->opt_optl);
  787.         skb_pull(skb, opt->opt_optl + 1);
  788. }
  789. /*
  790.  * This is here for use in the sockopt() call as well as
  791.  * in accept(). Must be called with a locked socket.
  792.  */
  793. static int dn_wait_accept(struct socket *sock, int flags)
  794. {
  795.         struct sock *sk = sock->sk;
  796.         while(sk->state == TCP_LISTEN) {
  797.                 if (flags & O_NONBLOCK) {
  798.                         return -EAGAIN;
  799.                 }
  800. SOCK_SLEEP_PRE(sk)
  801. if (sk->state == TCP_LISTEN)
  802. schedule();
  803. SOCK_SLEEP_POST(sk)
  804.                 if (signal_pending(current))
  805.                         return -ERESTARTSYS; /* But of course you don't! */
  806.         }
  807.         if ((DN_SK(sk)->state != DN_RUN) && (DN_SK(sk)->state != DN_DRC)) {
  808.                 sock->state = SS_UNCONNECTED;
  809.                 return sock_error(sk);
  810.         }
  811. sock->state = SS_CONNECTED;
  812.         return 0;
  813. }
  814. static int dn_accept(struct socket *sock, struct socket *newsock, int flags)
  815. {
  816. struct sock *sk = sock->sk, *newsk;
  817. struct sk_buff *skb = NULL;
  818. struct dn_skb_cb *cb;
  819. unsigned char menuver;
  820. int err = 0;
  821. unsigned char type;
  822. lock_sock(sk);
  823.         if (sk->state != TCP_LISTEN) {
  824. release_sock(sk);
  825. return -EINVAL;
  826. }
  827. if (DN_SK(sk)->state != DN_O) {
  828. release_sock(sk);
  829. return -EINVAL;
  830. }
  831.         do
  832.         {
  833.                 if ((skb = skb_dequeue(&sk->receive_queue)) == NULL)
  834.                 {
  835.                         if (flags & O_NONBLOCK)
  836.                         {
  837.                                 release_sock(sk);
  838.                                 return -EAGAIN;
  839.                         }
  840. SOCK_SLEEP_PRE(sk);
  841. if (!skb_peek(&sk->receive_queue))
  842. schedule();
  843. SOCK_SLEEP_POST(sk);
  844.                         if (signal_pending(current))
  845.                         {
  846. release_sock(sk);
  847.                                 return -ERESTARTSYS;
  848.                         }
  849.                 }
  850.         } while (skb == NULL);
  851. cb = DN_SKB_CB(skb);
  852. if ((newsk = dn_alloc_sock(newsock, sk->allocation)) == NULL) {
  853. release_sock(sk);
  854. kfree_skb(skb);
  855. return -ENOBUFS;
  856. }
  857. sk->ack_backlog--;
  858. release_sock(sk);
  859. dst_release(xchg(&newsk->dst_cache, skb->dst));
  860. skb->dst = NULL;
  861.         DN_SK(newsk)->state        = DN_CR;
  862. DN_SK(newsk)->addrrem      = cb->src_port;
  863. DN_SK(newsk)->services_rem = cb->services;
  864. DN_SK(newsk)->info_rem     = cb->info;
  865. DN_SK(newsk)->segsize_rem  = cb->segsize;
  866. DN_SK(newsk)->accept_mode  = DN_SK(sk)->accept_mode;
  867. if (DN_SK(newsk)->segsize_rem < 230)
  868. DN_SK(newsk)->segsize_rem = 230;
  869. if ((DN_SK(newsk)->services_rem & NSP_FC_MASK) == NSP_FC_NONE)
  870. DN_SK(newsk)->max_window = decnet_no_fc_max_cwnd;
  871. newsk->state  = TCP_LISTEN;
  872. newsk->zapped = 0;
  873. memcpy(&(DN_SK(newsk)->addr), &(DN_SK(sk)->addr), sizeof(struct sockaddr_dn));
  874. /*
  875.  * If we are listening on a wild socket, we don't want
  876.  * the newly created socket on the wrong hash queue.
  877.  */
  878. DN_SK(newsk)->addr.sdn_flags &= ~SDF_WILD;
  879. skb_pull(skb, dn_username2sockaddr(skb->data, skb->len, &(DN_SK(newsk)->addr), &type));
  880. skb_pull(skb, dn_username2sockaddr(skb->data, skb->len, &(DN_SK(newsk)->peer), &type));
  881. *(dn_address *)(DN_SK(newsk)->peer.sdn_add.a_addr) = cb->src;
  882. *(dn_address *)(DN_SK(newsk)->addr.sdn_add.a_addr) = cb->dst;
  883. menuver = *skb->data;
  884. skb_pull(skb, 1);
  885. if (menuver & DN_MENUVER_ACC)
  886. dn_access_copy(skb, &(DN_SK(newsk)->accessdata));
  887. if (menuver & DN_MENUVER_USR)
  888. dn_user_copy(skb, &(DN_SK(newsk)->conndata_in));
  889. if (menuver & DN_MENUVER_PRX)
  890. DN_SK(newsk)->peer.sdn_flags |= SDF_PROXY;
  891. if (menuver & DN_MENUVER_UIC)
  892. DN_SK(newsk)->peer.sdn_flags |= SDF_UICPROXY;
  893. kfree_skb(skb);
  894. memcpy(&(DN_SK(newsk)->conndata_out), &(DN_SK(sk)->conndata_out),
  895. sizeof(struct optdata_dn));
  896. memcpy(&(DN_SK(newsk)->discdata_out), &(DN_SK(sk)->discdata_out),
  897. sizeof(struct optdata_dn));
  898. lock_sock(newsk);
  899. /*
  900.  * FIXME: This can fail if we've run out of local ports....
  901.  */
  902. dn_hash_sock(newsk);
  903. dn_send_conn_ack(newsk);
  904. /*
  905.  * Here we use sk->allocation since although the conn conf is
  906.  * for the newsk, the context is the old socket.
  907.  */
  908. if (DN_SK(newsk)->accept_mode == ACC_IMMED) {
  909. DN_SK(newsk)->state = DN_CC;
  910.          dn_send_conn_conf(newsk, sk->allocation);
  911. err = dn_wait_accept(newsock, flags);
  912. }
  913. release_sock(newsk);
  914.         return err;
  915. }
  916. static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int *uaddr_len,int peer)
  917. {
  918. struct sockaddr_dn *sa = (struct sockaddr_dn *)uaddr;
  919. struct sock *sk = sock->sk;
  920. struct dn_scp *scp = DN_SK(sk);
  921. *uaddr_len = sizeof(struct sockaddr_dn);
  922. lock_sock(sk);
  923. if (peer) {
  924. if ((sock->state != SS_CONNECTED && 
  925.      sock->state != SS_CONNECTING) && 
  926.     scp->accept_mode == ACC_IMMED)
  927. return -ENOTCONN;
  928. memcpy(sa, &scp->peer, sizeof(struct sockaddr_dn));
  929. } else {
  930. memcpy(sa, &scp->addr, sizeof(struct sockaddr_dn));
  931. }
  932. release_sock(sk);
  933.         return 0;
  934. }
  935. static unsigned int dn_poll(struct file *file, struct socket *sock, poll_table  *wait)
  936. {
  937. struct sock *sk = sock->sk;
  938. struct dn_scp *scp = DN_SK(sk);
  939. int mask = datagram_poll(file, sock, wait);
  940. if (skb_queue_len(&scp->other_receive_queue))
  941. mask |= POLLRDBAND;
  942. return mask;
  943. }
  944. static int dn_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
  945. {
  946. struct sock *sk = sock->sk;
  947. struct dn_scp *scp = DN_SK(sk);
  948. int err = -EOPNOTSUPP;
  949. unsigned long amount = 0;
  950. struct sk_buff *skb;
  951. int val;
  952. switch(cmd)
  953. {
  954. case SIOCGIFADDR:
  955. case SIOCSIFADDR:
  956. return dn_dev_ioctl(cmd, (void *)arg);
  957. case SIOCATMARK:
  958. lock_sock(sk);
  959. val = (skb_queue_len(&scp->other_receive_queue) != 0);
  960. if (scp->state != DN_RUN)
  961. val = -ENOTCONN;
  962. release_sock(sk);
  963. return val;
  964. #ifdef CONFIG_DECNET_ROUTER
  965. case SIOCADDRT:
  966. case SIOCDELRT:
  967. return dn_fib_ioctl(sock, cmd, arg);
  968. #endif /* CONFIG_DECNET_ROUTER */
  969. case OSIOCSNETADDR:
  970. if (!capable(CAP_NET_ADMIN)) {
  971. err = -EPERM;
  972. break;
  973. }
  974. dn_dev_devices_off();
  975. decnet_address = (unsigned short)arg;
  976. dn_dn2eth(decnet_ether_address, dn_ntohs(decnet_address));
  977. dn_dev_devices_on();
  978. err = 0;
  979. break;
  980. case OSIOCGNETADDR:
  981. err = put_user(decnet_address, (unsigned short *)arg);
  982. break;
  983.         case SIOCGIFCONF:
  984.         case SIOCGIFFLAGS:
  985.         case SIOCGIFBRDADDR:
  986.                 return dev_ioctl(cmd,(void *)arg);
  987. case TIOCOUTQ:
  988. amount = sk->sndbuf - atomic_read(&sk->wmem_alloc);
  989. if (amount < 0)
  990. amount = 0;
  991. err = put_user(amount, (int *)arg);
  992. break;
  993. case TIOCINQ:
  994. lock_sock(sk);
  995. if ((skb = skb_peek(&scp->other_receive_queue)) != NULL) {
  996. amount = skb->len;
  997. } else {
  998. struct sk_buff *skb = sk->receive_queue.next;
  999. for(;;) {
  1000. if (skb == (struct sk_buff *)&sk->receive_queue)
  1001. break;
  1002. amount += skb->len;
  1003. skb = skb->next;
  1004. }
  1005. }
  1006. release_sock(sk);
  1007. err = put_user(amount, (int *)arg);
  1008. break;
  1009. }
  1010. return err;
  1011. }
  1012. static int dn_listen(struct socket *sock, int backlog)
  1013. {
  1014. struct sock *sk = sock->sk;
  1015. int err = -EINVAL;
  1016. lock_sock(sk);
  1017. if (sk->zapped)
  1018. goto out;
  1019. if ((DN_SK(sk)->state != DN_O) || (sk->state == TCP_LISTEN))
  1020. goto out;
  1021. sk->max_ack_backlog = backlog;
  1022. sk->ack_backlog     = 0;
  1023. sk->state           = TCP_LISTEN;
  1024. err                 = 0;
  1025. dn_rehash_sock(sk);
  1026. out:
  1027. release_sock(sk);
  1028.         return err;
  1029. }
  1030. static int dn_shutdown(struct socket *sock, int how)
  1031. {
  1032. struct sock *sk = sock->sk;
  1033. struct dn_scp *scp = DN_SK(sk);
  1034. int err = -ENOTCONN;
  1035. lock_sock(sk);
  1036. if (sock->state == SS_UNCONNECTED)
  1037. goto out;
  1038. err = 0;
  1039. if (sock->state == SS_DISCONNECTING)
  1040. goto out;
  1041. err = -EINVAL;
  1042. if (scp->state == DN_O)
  1043. goto out;
  1044. if (how != SHUTDOWN_MASK)
  1045. goto out;
  1046. sk->shutdown = how;
  1047. dn_destroy_sock(sk);
  1048. err = 0;
  1049. out:
  1050. release_sock(sk);
  1051. return err;
  1052. }
  1053. static int dn_setsockopt(struct socket *sock, int level, int optname, char *optval, int optlen)
  1054. {
  1055. struct sock *sk = sock->sk;
  1056. int err;
  1057. lock_sock(sk);
  1058. err = __dn_setsockopt(sock, level, optname, optval, optlen, 0);
  1059. release_sock(sk);
  1060. return err;
  1061. }
  1062. static int __dn_setsockopt(struct socket *sock, int level,int optname, char *optval, int optlen, int flags) 
  1063. {
  1064. struct sock *sk = sock->sk;
  1065. struct dn_scp *scp = DN_SK(sk);
  1066. union {
  1067. struct optdata_dn opt;
  1068. struct accessdata_dn acc;
  1069. int mode;
  1070. unsigned long win;
  1071. int val;
  1072. unsigned char services;
  1073. unsigned char info;
  1074. } u;
  1075. int err;
  1076. if (optlen && !optval)
  1077. return -EINVAL;
  1078. if (optlen > sizeof(u))
  1079. return -EINVAL;
  1080. if (copy_from_user(&u, optval, optlen))
  1081. return -EFAULT;
  1082. switch(optname) {
  1083. case DSO_CONDATA:
  1084. if (sock->state == SS_CONNECTED) 
  1085. return -EISCONN;
  1086. if ((scp->state != DN_O) && (scp->state != DN_CR))
  1087. return -EINVAL;
  1088. if (optlen != sizeof(struct optdata_dn))
  1089. return -EINVAL;
  1090. if (u.opt.opt_optl > 16)
  1091. return -EINVAL;
  1092. memcpy(&scp->conndata_out, &u.opt, optlen);
  1093. break;
  1094. case DSO_DISDATA:
  1095.             if (sock->state != SS_CONNECTED && scp->accept_mode == ACC_IMMED)
  1096. return -ENOTCONN;
  1097. if (optlen != sizeof(struct optdata_dn))
  1098. return -EINVAL;
  1099. if (u.opt.opt_optl > 16)
  1100. return -EINVAL;
  1101. memcpy(&scp->discdata_out, &u.opt, optlen);
  1102. break;
  1103. case DSO_CONACCESS:
  1104. if (sock->state == SS_CONNECTED) 
  1105. return -EISCONN;
  1106. if (scp->state != DN_O)
  1107. return -EINVAL;
  1108. if (optlen != sizeof(struct accessdata_dn))
  1109. return -EINVAL;
  1110. if ((u.acc.acc_accl > DN_MAXACCL) ||
  1111. (u.acc.acc_passl > DN_MAXACCL) ||
  1112. (u.acc.acc_userl > DN_MAXACCL))
  1113. return -EINVAL;
  1114. memcpy(&scp->accessdata, &u.acc, optlen);
  1115. break;
  1116. case DSO_ACCEPTMODE:
  1117. if (sock->state == SS_CONNECTED)
  1118. return -EISCONN;
  1119. if (scp->state != DN_O)
  1120. return -EINVAL;
  1121. if (optlen != sizeof(int))
  1122. return -EINVAL;
  1123. if ((u.mode != ACC_IMMED) && (u.mode != ACC_DEFER))
  1124. return -EINVAL;
  1125. scp->accept_mode = (unsigned char)u.mode;
  1126. break;
  1127. case DSO_CONACCEPT:
  1128. if (scp->state != DN_CR)
  1129. return -EINVAL;
  1130. scp->state = DN_CC;
  1131. dn_send_conn_conf(sk, sk->allocation);
  1132. err = dn_wait_accept(sock, sock->file->f_flags);
  1133. return err;
  1134. case DSO_CONREJECT:
  1135. if (scp->state != DN_CR)
  1136. return -EINVAL;
  1137. scp->state = DN_DR;
  1138. sk->shutdown = SHUTDOWN_MASK;
  1139. dn_nsp_send_disc(sk, 0x38, 0, sk->allocation);
  1140. break;
  1141. default:
  1142. #ifdef CONFIG_NETFILTER
  1143. return nf_setsockopt(sk, PF_DECnet, optname, optval, optlen);
  1144. #endif
  1145. case DSO_LINKINFO:
  1146. case DSO_STREAM:
  1147. case DSO_SEQPACKET:
  1148. return -ENOPROTOOPT;
  1149. case DSO_MAXWINDOW:
  1150. if (optlen != sizeof(unsigned long))
  1151. return -EINVAL;
  1152. if (u.win > NSP_MAX_WINDOW)
  1153. u.win = NSP_MAX_WINDOW;
  1154. if (u.win == 0)
  1155. return -EINVAL;
  1156. scp->max_window = u.win;
  1157. if (scp->snd_window > u.win)
  1158. scp->snd_window = u.win;
  1159. break;
  1160. case DSO_NODELAY:
  1161. if (optlen != sizeof(int))
  1162. return -EINVAL;
  1163. if (scp->nonagle == 2)
  1164. return -EINVAL;
  1165. scp->nonagle = (u.val == 0) ? 0 : 1;
  1166. /* if (scp->nonagle == 1) { Push pending frames } */
  1167. break;
  1168. case DSO_CORK:
  1169. if (optlen != sizeof(int))
  1170. return -EINVAL;
  1171. if (scp->nonagle == 1)
  1172. return -EINVAL;
  1173. scp->nonagle = (u.val == 0) ? 0 : 2;
  1174. /* if (scp->nonagle == 0) { Push pending frames } */
  1175. break;
  1176. case DSO_SERVICES:
  1177. if (optlen != sizeof(unsigned char))
  1178. return -EINVAL;
  1179. if ((u.services & ~NSP_FC_MASK) != 0x01)
  1180. return -EINVAL;
  1181. if ((u.services & NSP_FC_MASK) == NSP_FC_MASK)
  1182. return -EINVAL;
  1183. scp->services_loc = u.services;
  1184. break;
  1185. case DSO_INFO:
  1186. if (optlen != sizeof(unsigned char))
  1187. return -EINVAL;
  1188. if (u.info & 0xfc)
  1189. return -EINVAL;
  1190. scp->info_loc = u.info;
  1191. break;
  1192. }
  1193. return 0;
  1194. }
  1195. static int dn_getsockopt(struct socket *sock, int level, int optname, char *optval, int *optlen)
  1196. {
  1197. struct sock *sk = sock->sk;
  1198. int err;
  1199. lock_sock(sk);
  1200. err = __dn_getsockopt(sock, level, optname, optval, optlen, 0);
  1201. release_sock(sk);
  1202. return err;
  1203. }
  1204. static int __dn_getsockopt(struct socket *sock, int level,int optname, char *optval,int *optlen, int flags)
  1205. {
  1206. struct sock *sk = sock->sk;
  1207. struct dn_scp *scp = DN_SK(sk);
  1208. struct linkinfo_dn link;
  1209. unsigned int r_len;
  1210. void *r_data = NULL;
  1211. unsigned int val;
  1212. if(get_user(r_len , optlen))
  1213. return -EFAULT;
  1214. switch(optname) {
  1215. case DSO_CONDATA:
  1216. if (r_len > sizeof(struct optdata_dn))
  1217. r_len = sizeof(struct optdata_dn);
  1218. r_data = &scp->conndata_in;
  1219. break;
  1220. case DSO_DISDATA:
  1221. if (r_len > sizeof(struct optdata_dn))
  1222. r_len = sizeof(struct optdata_dn);
  1223. r_data = &scp->discdata_in;
  1224. break;
  1225. case DSO_CONACCESS:
  1226. if (r_len > sizeof(struct accessdata_dn))
  1227. r_len = sizeof(struct accessdata_dn);
  1228. r_data = &scp->accessdata;
  1229. break;
  1230. case DSO_ACCEPTMODE:
  1231. if (r_len > sizeof(unsigned char))
  1232. r_len = sizeof(unsigned char);
  1233. r_data = &scp->accept_mode;
  1234. break;
  1235. case DSO_LINKINFO:
  1236. if (r_len > sizeof(struct linkinfo_dn))
  1237. r_len = sizeof(struct linkinfo_dn);
  1238. switch(sock->state) {
  1239. case SS_CONNECTING:
  1240. link.idn_linkstate = LL_CONNECTING;
  1241. break;
  1242. case SS_DISCONNECTING:
  1243. link.idn_linkstate = LL_DISCONNECTING;
  1244. break;
  1245. case SS_CONNECTED:
  1246. link.idn_linkstate = LL_RUNNING;
  1247. break;
  1248. default:
  1249. link.idn_linkstate = LL_INACTIVE;
  1250. }
  1251. link.idn_segsize = scp->segsize_rem;
  1252. r_data = &link;
  1253. break;
  1254. default:
  1255. #ifdef CONFIG_NETFILTER
  1256. {
  1257. int val, len;
  1258. if(get_user(len, optlen))
  1259. return -EFAULT;
  1260. val = nf_getsockopt(sk, PF_DECnet, optname, 
  1261. optval, &len);
  1262. if (val >= 0)
  1263. val = put_user(len, optlen);
  1264. return val;
  1265. }
  1266. #endif
  1267. case DSO_STREAM:
  1268. case DSO_SEQPACKET:
  1269. case DSO_CONACCEPT:
  1270. case DSO_CONREJECT:
  1271.          return -ENOPROTOOPT;
  1272. case DSO_MAXWINDOW:
  1273. if (r_len > sizeof(unsigned long))
  1274. r_len = sizeof(unsigned long);
  1275. r_data = &scp->max_window;
  1276. break;
  1277. case DSO_NODELAY:
  1278. if (r_len > sizeof(int))
  1279. r_len = sizeof(int);
  1280. val = (scp->nonagle == 1);
  1281. r_data = &val;
  1282. break;
  1283. case DSO_CORK:
  1284. if (r_len > sizeof(int))
  1285. r_len = sizeof(int);
  1286. val = (scp->nonagle == 2);
  1287. r_data = &val;
  1288. break;
  1289. case DSO_SERVICES:
  1290. if (r_len > sizeof(unsigned char))
  1291. r_len = sizeof(unsigned char);
  1292. r_data = &scp->services_rem;
  1293. break;
  1294. case DSO_INFO:
  1295. if (r_len > sizeof(unsigned char))
  1296. r_len = sizeof(unsigned char);
  1297. r_data = &scp->info_rem;
  1298. break;
  1299. }
  1300. if (r_data) {
  1301. if (copy_to_user(optval, r_data, r_len))
  1302. return -EFAULT;
  1303. if (put_user(r_len, optlen))
  1304. return -EFAULT;
  1305. }
  1306. return 0;
  1307. }
  1308. /*
  1309.  * Used by send/recvmsg to wait until the socket is connected
  1310.  * before passing data.
  1311.  */
  1312. static int dn_wait_run(struct sock *sk, int flags)
  1313. {
  1314. struct dn_scp *scp = DN_SK(sk);
  1315. int err = 0;
  1316. switch(scp->state) {
  1317. case DN_RUN:
  1318. return 0;
  1319. case DN_CR:
  1320. scp->state = DN_CC;
  1321. dn_send_conn_conf(sk, sk->allocation);
  1322. return dn_wait_accept(sk->socket, (flags & MSG_DONTWAIT) ? O_NONBLOCK : 0);
  1323. case DN_CI:
  1324. case DN_CC:
  1325. break;
  1326. default:
  1327. return -ENOTCONN;
  1328. }
  1329. if (flags & MSG_DONTWAIT)
  1330. return -EWOULDBLOCK;
  1331. do {
  1332. if ((err = sock_error(sk)) != 0)
  1333. break;
  1334. if (signal_pending(current)) {
  1335. err = -ERESTARTSYS;
  1336. break;
  1337. }
  1338. SOCK_SLEEP_PRE(sk)
  1339. if (scp->state != DN_RUN)
  1340. schedule();
  1341. SOCK_SLEEP_POST(sk)
  1342. } while(scp->state != DN_RUN);
  1343. return 0;
  1344. }
  1345. static int dn_data_ready(struct sock *sk, struct sk_buff_head *q, int flags, int target)
  1346. {
  1347. struct sk_buff *skb = q->next;
  1348. int len = 0;
  1349. if (flags & MSG_OOB)
  1350. return skb_queue_len(q) ? 1 : 0;
  1351. while(skb != (struct sk_buff *)q) {
  1352. struct dn_skb_cb *cb = DN_SKB_CB(skb);
  1353. len += skb->len;
  1354. if (cb->nsp_flags & 0x40) {
  1355. /* SOCK_SEQPACKET reads to EOM */
  1356. if (sk->type == SOCK_SEQPACKET)
  1357. return 1;
  1358. /* so does SOCK_STREAM unless WAITALL is specified */
  1359. if (!(flags & MSG_WAITALL))
  1360. return 1;
  1361. }
  1362. /* minimum data length for read exceeded */
  1363. if (len >= target)
  1364. return 1;
  1365. skb = skb->next;
  1366. }
  1367. return 0;
  1368. }
  1369. static int dn_recvmsg(struct socket *sock, struct msghdr *msg, int size,
  1370. int flags, struct scm_cookie *scm)
  1371. {
  1372. struct sock *sk = sock->sk;
  1373. struct dn_scp *scp = DN_SK(sk);
  1374. struct sk_buff_head *queue = &sk->receive_queue;
  1375. int target = size > 1 ? 1 : 0;
  1376. int copied = 0;
  1377. int rv = 0;
  1378. struct sk_buff *skb, *nskb;
  1379. struct dn_skb_cb *cb = NULL;
  1380. unsigned char eor = 0;
  1381. lock_sock(sk);
  1382. if (sk->zapped) {
  1383. rv = -EADDRNOTAVAIL;
  1384. goto out;
  1385. }
  1386. if ((rv = dn_wait_run(sk, flags)) != 0)
  1387. goto out;
  1388. if (sk->shutdown & RCV_SHUTDOWN) {
  1389. send_sig(SIGPIPE, current, 0);
  1390. rv = -EPIPE;
  1391. goto out;
  1392. }
  1393. if (flags & ~(MSG_PEEK|MSG_OOB|MSG_WAITALL|MSG_DONTWAIT)) {
  1394. rv = -EOPNOTSUPP;
  1395. goto out;
  1396. }
  1397. if (flags & MSG_OOB)
  1398. queue = &scp->other_receive_queue;
  1399. if (flags & MSG_WAITALL)
  1400. target = size;
  1401. /*
  1402.  * See if there is data ready to read, sleep if there isn't
  1403.  */
  1404. for(;;) {
  1405. if (sk->err)
  1406. goto out;
  1407. if (skb_queue_len(&scp->other_receive_queue)) {
  1408. if (!(flags & MSG_OOB)) {
  1409. msg->msg_flags |= MSG_OOB;
  1410. if (!scp->other_report) {
  1411. scp->other_report = 1;
  1412. goto out;
  1413. }
  1414. }
  1415. }
  1416. if (scp->state != DN_RUN)
  1417. goto out;
  1418. if (signal_pending(current)) {
  1419. rv = -ERESTARTSYS;
  1420. goto out;
  1421. }
  1422. if (dn_data_ready(sk, queue, flags, target))
  1423. break;
  1424. if (flags & MSG_DONTWAIT) {
  1425. rv = -EWOULDBLOCK;
  1426. goto out;
  1427. }
  1428. set_bit(SOCK_ASYNC_WAITDATA, &sock->flags);
  1429. SOCK_SLEEP_PRE(sk)
  1430. if (!dn_data_ready(sk, queue, flags, target))
  1431. schedule();
  1432. SOCK_SLEEP_POST(sk)
  1433. clear_bit(SOCK_ASYNC_WAITDATA, &sock->flags);
  1434. }
  1435. for(skb = queue->next; skb != (struct sk_buff *)queue; skb = nskb) {
  1436. int chunk = skb->len;
  1437. cb = DN_SKB_CB(skb);
  1438. if ((chunk + copied) > size)
  1439. chunk = size - copied;
  1440. if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) {
  1441. rv = -EFAULT;
  1442. break;
  1443. }
  1444. copied += chunk;
  1445. if (!(flags & MSG_PEEK))
  1446. skb_pull(skb, chunk);
  1447. eor = cb->nsp_flags & 0x40;
  1448. nskb = skb->next;
  1449. if (skb->len == 0) {
  1450. skb_unlink(skb);
  1451. kfree_skb(skb);
  1452. /* 
  1453.  * N.B. Don't refer to skb or cb after this point
  1454.  * in loop.
  1455.  */
  1456. if ((scp->flowloc_sw == DN_DONTSEND) && !dn_congested(sk)) {
  1457. scp->flowloc_sw = DN_SEND;
  1458. dn_nsp_send_link(sk, DN_SEND, 0);
  1459. }
  1460. }
  1461. if (eor) { 
  1462. if (sk->type == SOCK_SEQPACKET)
  1463. break;
  1464. if (!(flags & MSG_WAITALL))
  1465. break;
  1466. }
  1467. if (flags & MSG_OOB)
  1468. break;
  1469. if (copied >= target)
  1470. break;
  1471. }
  1472. rv = copied;
  1473. if (eor && (sk->type == SOCK_SEQPACKET))
  1474. msg->msg_flags |= MSG_EOR;
  1475. out:
  1476. if (rv == 0)
  1477. rv = (flags & MSG_PEEK) ? -sk->err : sock_error(sk);
  1478. if ((rv >= 0) && msg->msg_name) {
  1479. memcpy(msg->msg_name, &scp->peer, sizeof(struct sockaddr_dn));
  1480. msg->msg_namelen = sizeof(struct sockaddr_dn);
  1481. }
  1482. release_sock(sk);
  1483. return rv;
  1484. }
  1485. static inline int dn_queue_too_long(struct dn_scp *scp, struct sk_buff_head *queue, int flags)
  1486. {
  1487. unsigned char fctype = scp->services_rem & NSP_FC_MASK;
  1488. if (skb_queue_len(queue) >= scp->snd_window)
  1489. return 1;
  1490. if (fctype != NSP_FC_NONE) {
  1491. if (flags & MSG_OOB) {
  1492. if (scp->flowrem_oth == 0)
  1493. return 1;
  1494. } else {
  1495. if (scp->flowrem_dat == 0)
  1496. return 1;
  1497. }
  1498. }
  1499. return 0;
  1500. }
  1501. static int dn_sendmsg(struct socket *sock, struct msghdr *msg, int size, 
  1502.    struct scm_cookie *scm)
  1503. {
  1504. struct sock *sk = sock->sk;
  1505. struct dn_scp *scp = DN_SK(sk);
  1506. int mss;
  1507. struct sk_buff_head *queue = &scp->data_xmit_queue;
  1508. int flags = msg->msg_flags;
  1509. int err = 0;
  1510. int sent = 0;
  1511. int addr_len = msg->msg_namelen;
  1512. struct sockaddr_dn *addr = (struct sockaddr_dn *)msg->msg_name;
  1513. struct sk_buff *skb = NULL;
  1514. struct dn_skb_cb *cb;
  1515. unsigned char msgflg;
  1516. unsigned char *ptr;
  1517. unsigned short ack;
  1518. int len;
  1519. unsigned char fctype;
  1520. if (flags & ~(MSG_TRYHARD|MSG_OOB|MSG_DONTWAIT|MSG_EOR))
  1521. return -EOPNOTSUPP;
  1522. if (addr_len && (addr_len != sizeof(struct sockaddr_dn)))
  1523. return -EINVAL;
  1524. if (sk->zapped && dn_auto_bind(sock))  {
  1525. err = -EADDRNOTAVAIL;
  1526. goto out;
  1527. }
  1528. if (scp->state == DN_O) {
  1529. if (!addr_len || !addr) {
  1530. err = -ENOTCONN;
  1531. goto out;
  1532. }
  1533. if ((err = dn_connect(sock, (struct sockaddr *)addr, addr_len, (flags & MSG_DONTWAIT) ? O_NONBLOCK : 0)) < 0)
  1534. goto out;
  1535. }
  1536. lock_sock(sk);
  1537. if ((err = dn_wait_run(sk, flags)) < 0)
  1538. goto out;
  1539. if (sk->shutdown & SEND_SHUTDOWN) {
  1540. send_sig(SIGPIPE, current, 0);
  1541. err = -EPIPE;
  1542. goto out;
  1543. }
  1544. if ((flags & MSG_TRYHARD) && sk->dst_cache)
  1545. dst_negative_advice(&sk->dst_cache);
  1546. mss = scp->segsize_rem;
  1547. fctype = scp->services_rem & NSP_FC_MASK;
  1548. if (sk->dst_cache && sk->dst_cache->neighbour) {
  1549. struct dn_neigh *dn = (struct dn_neigh *)sk->dst_cache->neighbour;
  1550. if (dn->blksize < (mss + 11))
  1551. mss = dn->blksize - 11;
  1552. }
  1553. /*
  1554.  * The only difference between SEQPACKET & STREAM sockets under DECnet
  1555.  * is that SEQPACKET sockets set the MSG_EOR flag for the last
  1556.  * session control message segment. 
  1557.  */
  1558. if (flags & MSG_OOB) {
  1559. mss = 16;
  1560. queue = &scp->other_xmit_queue;
  1561. if (size > mss) {
  1562. err = -EMSGSIZE;
  1563. goto out;
  1564. }
  1565. }
  1566. scp->persist_fxn = dn_nsp_xmit_timeout;
  1567. while(sent < size) {
  1568. err = sock_error(sk);
  1569. if (err)
  1570. goto out;
  1571. if (signal_pending(current)) {
  1572. err = -ERESTARTSYS;
  1573. goto out;
  1574. }
  1575. /*
  1576.  * Calculate size that we wish to send.
  1577.  */
  1578. len = size - sent;
  1579. if (len > mss)
  1580. len = mss;
  1581. /*
  1582.  * Wait for queue size to go down below the window
  1583.  * size.
  1584.  */
  1585. if (dn_queue_too_long(scp, queue, flags)) {
  1586. if (flags & MSG_DONTWAIT) {
  1587. err = -EWOULDBLOCK;
  1588. goto out;
  1589. }
  1590. SOCK_SLEEP_PRE(sk)
  1591. if (dn_queue_too_long(scp, queue, flags))
  1592. schedule();
  1593. SOCK_SLEEP_POST(sk)
  1594. continue;
  1595. }
  1596. /*
  1597.  * Get a suitably sized skb.
  1598.  */
  1599. skb = dn_alloc_send_skb(sk, &len, flags & MSG_DONTWAIT, &err);
  1600. if (err)
  1601. break;
  1602. if (!skb)
  1603. continue;
  1604. cb = DN_SKB_CB(skb);
  1605. ptr = skb_put(skb, 9);
  1606. if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
  1607. err = -EFAULT;
  1608. goto out;
  1609. }
  1610. if (flags & MSG_OOB) {
  1611. cb->segnum = scp->numoth;
  1612. seq_add(&scp->numoth, 1);
  1613. msgflg = 0x30;
  1614. ack = (scp->numoth_rcv & 0x0FFF) | 0x8000;
  1615. scp->ackxmt_oth = scp->numoth_rcv;
  1616. if (fctype != NSP_FC_NONE)
  1617. scp->flowrem_oth--;
  1618. } else {
  1619. cb->segnum = scp->numdat;
  1620. seq_add(&scp->numdat, 1);
  1621. msgflg = 0x00;
  1622. if (sock->type == SOCK_STREAM)
  1623. msgflg = 0x60;
  1624. if (scp->seg_total == 0)
  1625. msgflg |= 0x20;
  1626. scp->seg_total += len;
  1627. if (((sent + len) == size) && (flags & MSG_EOR)) {
  1628. msgflg |= 0x40;
  1629. scp->seg_total = 0;
  1630. if (fctype == NSP_FC_SCMC)
  1631. scp->flowrem_dat--;
  1632. }
  1633. ack = (scp->numdat_rcv & 0x0FFF) | 0x8000;
  1634. scp->ackxmt_dat = scp->numdat_rcv;
  1635. if (fctype == NSP_FC_SRC)
  1636. scp->flowrem_dat--;
  1637. }
  1638. *ptr++ = msgflg;
  1639. *(__u16 *)ptr = scp->addrrem;
  1640. ptr += 2;
  1641. *(__u16 *)ptr = scp->addrloc;
  1642. ptr += 2;
  1643. *(__u16 *)ptr = dn_htons(ack);
  1644. ptr += 2;
  1645. *(__u16 *)ptr = dn_htons(cb->segnum);
  1646. sent += len;
  1647. dn_nsp_queue_xmit(sk, skb, sk->allocation, flags & MSG_OOB);
  1648. skb = NULL;
  1649. scp->persist = dn_nsp_persist(sk);
  1650. }
  1651. out:
  1652. if (skb)
  1653. kfree_skb(skb);
  1654. release_sock(sk);
  1655. return sent ? sent : err;
  1656. }
  1657. static int dn_device_event(struct notifier_block *this, unsigned long event,
  1658. void *ptr)
  1659. {
  1660. struct net_device *dev = (struct net_device *)ptr;
  1661. switch(event) {
  1662. case NETDEV_UP:
  1663. dn_dev_up(dev);
  1664. break;
  1665. case NETDEV_DOWN:
  1666. dn_dev_down(dev);
  1667. break;
  1668. default:
  1669. break;
  1670. }
  1671. return NOTIFY_DONE;
  1672. }
  1673. static struct notifier_block dn_dev_notifier = {
  1674. notifier_call: dn_device_event,
  1675. };
  1676. extern int dn_route_rcv(struct sk_buff *, struct net_device *, struct packet_type *);
  1677. static struct packet_type dn_dix_packet_type = {
  1678. type: __constant_htons(ETH_P_DNA_RT),
  1679. dev: NULL, /* All devices */
  1680. func: dn_route_rcv,
  1681. data: (void*)1,
  1682. };
  1683. #define IS_NOT_PRINTABLE(x) ((x) < 32 || (x) > 126)
  1684. static void dn_printable_object(struct sockaddr_dn *dn, unsigned char *buf)
  1685. {
  1686. int i;
  1687.     
  1688. switch (dn_ntohs(dn->sdn_objnamel)) {
  1689. case 0:
  1690. sprintf(buf, "%d", dn->sdn_objnum);
  1691. break;
  1692. default:
  1693. for (i = 0; i < dn_ntohs(dn->sdn_objnamel); i++) {
  1694. buf[i] = dn->sdn_objname[i];
  1695. if (IS_NOT_PRINTABLE(buf[i]))
  1696. buf[i] = '.';
  1697. }
  1698. buf[i] = 0;
  1699.      }
  1700. }
  1701. static int dn_get_info(char *buffer, char **start, off_t offset, int length)
  1702. {
  1703. struct sock *sk;
  1704. struct dn_scp *scp;
  1705. int len = 0;
  1706. off_t pos = 0;
  1707. off_t begin = 0;
  1708. char buf1[DN_ASCBUF_LEN];
  1709. char buf2[DN_ASCBUF_LEN];
  1710. char local_object[DN_MAXOBJL+3];
  1711. char remote_object[DN_MAXOBJL+3];
  1712. int i;
  1713. len += sprintf(buffer + len, "Local                                              Remoten");
  1714. read_lock(&dn_hash_lock);
  1715. for(i = 0; i < DN_SK_HASH_SIZE; i++) {
  1716. for(sk = dn_sk_hash[i]; sk != NULL; sk = sk->next) {
  1717. scp = DN_SK(sk);
  1718. dn_printable_object(&scp->addr, local_object);
  1719. dn_printable_object(&scp->peer, remote_object);
  1720. len += sprintf(buffer + len,
  1721. "%6s/%04X %04d:%04d %04d:%04d %01d %-16s %6s/%04X %04d:%04d %04d:%04d %01d %-16s %4s %sn",
  1722. dn_addr2asc(dn_ntohs(dn_saddr2dn(&scp->addr)), buf1),
  1723. scp->addrloc,
  1724. scp->numdat,
  1725. scp->numoth,
  1726. scp->ackxmt_dat,
  1727. scp->ackxmt_oth,
  1728. scp->flowloc_sw,
  1729. local_object,
  1730. dn_addr2asc(dn_ntohs(dn_saddr2dn(&scp->peer)), buf2),
  1731. scp->addrrem,
  1732. scp->numdat_rcv,
  1733. scp->numoth_rcv,
  1734. scp->ackrcv_dat,
  1735. scp->ackrcv_oth,
  1736. scp->flowrem_sw,
  1737. remote_object,
  1738. dn_state2asc(scp->state),
  1739. ((scp->accept_mode == ACC_IMMED) ? "IMMED" : "DEFER"));
  1740. pos = begin + len;
  1741. if (pos < offset) {
  1742. len = 0;
  1743. begin = pos;
  1744. }
  1745. if (pos > (offset + length))
  1746. break;
  1747. }
  1748. }
  1749. read_unlock(&dn_hash_lock);
  1750. *start = buffer + (offset - begin);
  1751. len -= (offset - begin);
  1752. if (len > length)
  1753. len = length;
  1754. return len;
  1755. }
  1756. static struct net_proto_family dn_family_ops = {
  1757. family: AF_DECnet,
  1758. create: dn_create,
  1759. };
  1760. static struct proto_ops dn_proto_ops = {
  1761. family: AF_DECnet,
  1762. release: dn_release,
  1763. bind: dn_bind,
  1764. connect: dn_connect,
  1765. socketpair: sock_no_socketpair,
  1766. accept: dn_accept,
  1767. getname: dn_getname,
  1768. poll: dn_poll,
  1769. ioctl: dn_ioctl,
  1770. listen: dn_listen,
  1771. shutdown: dn_shutdown,
  1772. setsockopt: dn_setsockopt,
  1773. getsockopt: dn_getsockopt,
  1774. sendmsg: dn_sendmsg,
  1775. recvmsg: dn_recvmsg,
  1776. mmap: sock_no_mmap,
  1777. sendpage: sock_no_sendpage,
  1778. };
  1779. #ifdef CONFIG_SYSCTL
  1780. void dn_register_sysctl(void);
  1781. void dn_unregister_sysctl(void);
  1782. #endif
  1783. #ifdef MODULE
  1784. EXPORT_NO_SYMBOLS;
  1785. MODULE_DESCRIPTION("The Linux DECnet Network Protocol");
  1786. MODULE_AUTHOR("Linux DECnet Project Team");
  1787. MODULE_LICENSE("GPL");
  1788. static int addr[2] = {0, 0};
  1789. MODULE_PARM(addr, "2i");
  1790. MODULE_PARM_DESC(addr, "The DECnet address of this machine: area,node");
  1791. #endif
  1792. static char banner[] __initdata = KERN_INFO "NET4: DECnet for Linux: V.2.4.15-pre5s (C) 1995-2001 Linux DECnet Project Teamn";
  1793. static int __init decnet_init(void)
  1794. {
  1795. #ifdef MODULE
  1796. if (addr[0] > 63 || addr[0] < 0) {
  1797. printk(KERN_ERR "DECnet: Area must be between 0 and 63");
  1798. return 1;
  1799. }
  1800. if (addr[1] > 1023 || addr[1] < 0) {
  1801. printk(KERN_ERR "DECnet: Node must be between 0 and 1023");
  1802. return 1;
  1803. }
  1804. decnet_address = dn_htons((addr[0] << 10) | addr[1]);
  1805. dn_dn2eth(decnet_ether_address, dn_ntohs(decnet_address));
  1806. #endif
  1807.         printk(banner);
  1808. sock_register(&dn_family_ops);
  1809. dev_add_pack(&dn_dix_packet_type);
  1810. register_netdevice_notifier(&dn_dev_notifier);
  1811. proc_net_create("decnet", 0, dn_get_info);
  1812. dn_neigh_init();
  1813. dn_dev_init();
  1814. dn_route_init();
  1815. #ifdef CONFIG_DECNET_ROUTER
  1816. dn_fib_init();
  1817. #endif /* CONFIG_DECNET_ROUTER */
  1818. #ifdef CONFIG_SYSCTL
  1819. dn_register_sysctl();
  1820. #endif /* CONFIG_SYSCTL */
  1821. /*
  1822.  * Prevent DECnet module unloading until its fixed properly.
  1823.  * Requires an audit of the code to check for memory leaks and
  1824.  * initialisation problems etc.
  1825.  */
  1826. MOD_INC_USE_COUNT;
  1827. return 0;
  1828. }
  1829. #ifndef MODULE
  1830. static int __init decnet_setup(char *str)
  1831. {
  1832. unsigned short area = simple_strtoul(str, &str, 0);
  1833. unsigned short node = simple_strtoul(*str > 0 ? ++str : str, &str, 0);
  1834. decnet_address = dn_htons(area << 10 | node);
  1835. dn_dn2eth(decnet_ether_address, dn_ntohs(decnet_address));
  1836. return 1;
  1837. }
  1838. __setup("decnet=", decnet_setup);
  1839. #endif
  1840. static void __exit decnet_exit(void)
  1841. {
  1842. sock_unregister(AF_DECnet);
  1843. dev_remove_pack(&dn_dix_packet_type);
  1844. #ifdef CONFIG_SYSCTL
  1845. dn_unregister_sysctl();
  1846. #endif /* CONFIG_SYSCTL */
  1847. unregister_netdevice_notifier(&dn_dev_notifier);
  1848. dn_route_cleanup();
  1849. dn_dev_cleanup();
  1850. dn_neigh_cleanup();
  1851. #ifdef CONFIG_DECNET_ROUTER
  1852. dn_fib_cleanup();
  1853. #endif /* CONFIG_DECNET_ROUTER */
  1854. proc_net_remove("decnet");
  1855. }
  1856. module_init(decnet_init);
  1857. module_exit(decnet_exit);