hdlc.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:32k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Generic HDLC support routines for Linux
  3.  *
  4.  * Copyright (C) 1999, 2000 Krzysztof Halasa <khc@pm.waw.pl>
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify it
  7.  * under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * Current status:
  12.  *    - this is work in progress
  13.  *    - not heavily tested on SMP
  14.  *    - currently supported:
  15.  * * raw IP-in-HDLC
  16.  * * Cisco HDLC
  17.  * * Frame Relay with ANSI or CCITT LMI (both user and network side)
  18.  * * PPP (using syncppp.c)
  19.  * * X.25
  20.  *
  21.  * Use sethdlc utility to set line parameters, protocol and PVCs
  22.  */
  23. #include <linux/config.h>
  24. #include <linux/module.h>
  25. #include <linux/kernel.h>
  26. #include <linux/slab.h>
  27. #include <linux/poll.h>
  28. #include <linux/sched.h>
  29. #include <linux/errno.h>
  30. #include <linux/if_arp.h>
  31. #include <linux/init.h>
  32. #include <linux/skbuff.h>
  33. #include <linux/pkt_sched.h>
  34. #include <linux/inetdevice.h>
  35. #include <linux/lapb.h>
  36. #include <linux/rtnetlink.h>
  37. #include <linux/hdlc.h>
  38. /* #define DEBUG_PKT */
  39. /* #define DEBUG_HARD_HEADER */
  40. /* #define DEBUG_FECN */
  41. /* #define DEBUG_BECN */
  42. static const char* version = "HDLC support module revision 1.02 for Linux 2.4";
  43. #define CISCO_MULTICAST 0x8F /* Cisco multicast address */
  44. #define CISCO_UNICAST 0x0F /* Cisco unicast address */
  45. #define CISCO_KEEPALIVE 0x8035 /* Cisco keepalive protocol */
  46. #define CISCO_SYS_INFO 0x2000 /* Cisco interface/system info */
  47. #define CISCO_ADDR_REQ 0 /* Cisco address request */
  48. #define CISCO_ADDR_REPLY 1 /* Cisco address reply */
  49. #define CISCO_KEEPALIVE_REQ 2 /* Cisco keepalive request */
  50. static int hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
  51. /********************************************************
  52.  *
  53.  * Cisco HDLC support
  54.  *
  55.  *******************************************************/
  56. static int cisco_hard_header(struct sk_buff *skb, struct net_device *dev,
  57.      u16 type, void *daddr, void *saddr,
  58.      unsigned int len)
  59. {
  60. hdlc_header *data;
  61. #ifdef DEBUG_HARD_HEADER
  62. printk(KERN_DEBUG "%s: cisco_hard_header calledn", dev->name);
  63. #endif
  64. skb_push(skb, sizeof(hdlc_header));
  65. data = (hdlc_header*)skb->data;
  66. if (type == CISCO_KEEPALIVE)
  67. data->address = CISCO_MULTICAST;
  68. else
  69. data->address = CISCO_UNICAST;
  70. data->control = 0;
  71. data->protocol = htons(type);
  72. return sizeof(hdlc_header);
  73. }
  74. static void cisco_keepalive_send(hdlc_device *hdlc, u32 type,
  75.  u32 par1, u32 par2)
  76. {
  77. struct sk_buff *skb;
  78. cisco_packet *data;
  79. skb = dev_alloc_skb(sizeof(hdlc_header)+sizeof(cisco_packet));
  80. if (!skb) {
  81. printk(KERN_WARNING "%s: Memory squeeze on cisco_keepalive_send()n",
  82.        hdlc_to_name(hdlc));
  83. return;
  84. }
  85. skb_reserve(skb, 4);
  86. cisco_hard_header(skb, hdlc_to_dev(hdlc), CISCO_KEEPALIVE,
  87.   NULL, NULL, 0);
  88. data = (cisco_packet*)skb->tail;
  89. data->type = htonl(type);
  90. data->par1 = htonl(par1);
  91. data->par2 = htonl(par2);
  92. data->rel = 0xFFFF;
  93. data->time = htonl(jiffies * 1000 / HZ);
  94. skb_put(skb, sizeof(cisco_packet));
  95. skb->priority = TC_PRIO_CONTROL;
  96. skb->dev = hdlc_to_dev(hdlc);
  97. dev_queue_xmit(skb);
  98. }
  99. static void cisco_netif(hdlc_device *hdlc, struct sk_buff *skb)
  100. {
  101. hdlc_header *data = (hdlc_header*)skb->data;
  102. cisco_packet *cisco_data;
  103. struct in_device *in_dev;
  104. u32 addr, mask;
  105. if (skb->len<sizeof(hdlc_header))
  106. goto rx_error;
  107. if (data->address != CISCO_MULTICAST &&
  108.     data->address != CISCO_UNICAST)
  109. goto rx_error;
  110. skb_pull(skb, sizeof(hdlc_header));
  111. switch(ntohs(data->protocol)) {
  112. case ETH_P_IP:
  113. case ETH_P_IPX:
  114. case ETH_P_IPV6:
  115. skb->protocol = data->protocol;
  116. skb->dev = hdlc_to_dev(hdlc);
  117. netif_rx(skb);
  118. return;
  119. case CISCO_SYS_INFO:
  120. /* Packet is not needed, drop it. */
  121. dev_kfree_skb_any(skb);
  122. return;
  123. case CISCO_KEEPALIVE:
  124. if (skb->len != CISCO_PACKET_LEN &&
  125.     skb->len != CISCO_BIG_PACKET_LEN) {
  126. printk(KERN_INFO "%s: Invalid length of Cisco "
  127.        "control packet (%d bytes)n",
  128.        hdlc_to_name(hdlc), skb->len);
  129. goto rx_error;
  130. }
  131. cisco_data = (cisco_packet*)skb->data;
  132. switch(ntohl (cisco_data->type)) {
  133. case CISCO_ADDR_REQ: /* Stolen from syncppp.c :-) */
  134. in_dev = hdlc_to_dev(hdlc)->ip_ptr;
  135. addr = 0;
  136. mask = ~0; /* is the mask correct? */
  137. if (in_dev != NULL) {
  138. struct in_ifaddr **ifap = &in_dev->ifa_list;
  139. while (*ifap != NULL) {
  140. if (strcmp(hdlc_to_name(hdlc),
  141.    (*ifap)->ifa_label) == 0) {
  142. addr = (*ifap)->ifa_local;
  143. mask = (*ifap)->ifa_mask;
  144. break;
  145. }
  146. ifap = &(*ifap)->ifa_next;
  147. }
  148. cisco_keepalive_send(hdlc, CISCO_ADDR_REPLY,
  149.      addr, mask);
  150. }
  151. dev_kfree_skb_any(skb);
  152. return;
  153. case CISCO_ADDR_REPLY:
  154. printk(KERN_INFO "%s: Unexpected Cisco IP address "
  155.        "replyn", hdlc_to_name(hdlc));
  156. goto rx_error;
  157. case CISCO_KEEPALIVE_REQ:
  158. hdlc->lmi.rxseq = ntohl(cisco_data->par1);
  159. if (ntohl(cisco_data->par2) == hdlc->lmi.txseq) {
  160. hdlc->lmi.last_poll = jiffies;
  161. if (!(hdlc->lmi.state & LINK_STATE_RELIABLE)) {
  162. u32 sec, min, hrs, days;
  163. sec = ntohl(cisco_data->time) / 1000;
  164. min = sec / 60; sec -= min * 60;
  165. hrs = min / 60; min -= hrs * 60;
  166. days = hrs / 24; hrs -= days * 24;
  167. printk(KERN_INFO "%s: Link up (peer "
  168.        "uptime %ud%uh%um%us)n",
  169.        hdlc_to_name(hdlc), days, hrs,
  170.        min, sec);
  171. }
  172. hdlc->lmi.state |= LINK_STATE_RELIABLE;
  173. }
  174. dev_kfree_skb_any(skb);
  175. return;
  176. } /* switch(keepalive type) */
  177. } /* switch(protocol) */
  178. printk(KERN_INFO "%s: Unsupported protocol %xn", hdlc_to_name(hdlc),
  179.        data->protocol);
  180. dev_kfree_skb_any(skb);
  181. return;
  182.  rx_error:
  183. hdlc->stats.rx_errors++; /* Mark error */
  184. dev_kfree_skb_any(skb);
  185. }
  186. static void cisco_timer(unsigned long arg)
  187. {
  188. hdlc_device *hdlc = (hdlc_device*)arg;
  189. if ((hdlc->lmi.state & LINK_STATE_RELIABLE) &&
  190.     (jiffies - hdlc->lmi.last_poll >= hdlc->lmi.T392 * HZ)) {
  191. hdlc->lmi.state &= ~LINK_STATE_RELIABLE;
  192. printk(KERN_INFO "%s: Link downn", hdlc_to_name(hdlc));
  193. }
  194. cisco_keepalive_send(hdlc, CISCO_KEEPALIVE_REQ, ++hdlc->lmi.txseq,
  195.      hdlc->lmi.rxseq);
  196. hdlc->timer.expires = jiffies + hdlc->lmi.T391*HZ;
  197. hdlc->timer.function = cisco_timer;
  198. hdlc->timer.data = arg;
  199. add_timer(&hdlc->timer);
  200. }
  201. /******************************************************************
  202.  *
  203.  *     generic Frame Relay routines
  204.  *
  205.  *****************************************************************/
  206. static int fr_hard_header(struct sk_buff *skb, struct net_device *dev,
  207.   u16 type, void *daddr, void *saddr, unsigned int len)
  208. {
  209. u16 head_len;
  210. if (!daddr)
  211. daddr = dev->broadcast;
  212. #ifdef DEBUG_HARD_HEADER
  213. printk(KERN_DEBUG "%s: fr_hard_header calledn", dev->name);
  214. #endif
  215. switch(type) {
  216. case ETH_P_IP:
  217. head_len = 4;
  218. skb_push(skb, head_len);
  219. skb->data[3] = NLPID_IP;
  220. break;
  221. case ETH_P_IPV6:
  222. head_len = 4;
  223. skb_push(skb, head_len);
  224. skb->data[3] = NLPID_IPV6;
  225. break;
  226. case LMI_PROTO:
  227. head_len = 4;
  228. skb_push(skb, head_len);
  229. skb->data[3] = LMI_PROTO;
  230. break;
  231. default:
  232. head_len = 10;
  233. skb_push(skb, head_len);
  234. skb->data[3] = FR_PAD;
  235. skb->data[4] = NLPID_SNAP;
  236. skb->data[5] = FR_PAD;
  237. skb->data[6] = FR_PAD;
  238. skb->data[7] = FR_PAD;
  239. skb->data[8] = type>>8;
  240. skb->data[9] = (u8)type;
  241. }
  242. memcpy(skb->data, daddr, 2);
  243. skb->data[2] = FR_UI;
  244. return head_len;
  245. }
  246. static inline void fr_log_dlci_active(pvc_device *pvc)
  247. {
  248. printk(KERN_INFO "%s: %sactive%sn", pvc_to_name(pvc),
  249.        pvc->state & PVC_STATE_ACTIVE ? "" : "in",
  250.        pvc->state & PVC_STATE_NEW ? " new" : "");
  251. }
  252. static inline u8 fr_lmi_nextseq(u8 x)
  253. {
  254. x++;
  255. return x ? x : 1;
  256. }
  257. static void fr_lmi_send(hdlc_device *hdlc, int fullrep)
  258. {
  259. struct sk_buff *skb;
  260. pvc_device *pvc = hdlc->first_pvc;
  261. int len = mode_is(hdlc, MODE_FR_ANSI) ? LMI_ANSI_LENGTH : LMI_LENGTH;
  262. int stat_len = 3;
  263. u8 *data;
  264. int i = 0;
  265. if (mode_is(hdlc, MODE_DCE) && fullrep) {
  266. len += hdlc->pvc_count * (2 + stat_len);
  267. if (len > HDLC_MAX_MTU) {
  268. printk(KERN_WARNING "%s: Too many PVCs while sending "
  269.        "LMI full reportn", hdlc_to_name(hdlc));
  270. return;
  271. }
  272. }
  273. skb = dev_alloc_skb(len);
  274. if (!skb) {
  275. printk(KERN_WARNING "%s: Memory squeeze on fr_lmi_send()n",
  276.        hdlc_to_name(hdlc));
  277. return;
  278. }
  279. memset(skb->data, 0, len);
  280. skb_reserve(skb, 4);
  281. fr_hard_header(skb, hdlc_to_dev(hdlc), LMI_PROTO, NULL, NULL, 0);
  282. data = skb->tail;
  283. data[i++] = LMI_CALLREF;
  284. data[i++] = mode_is(hdlc, MODE_DCE) ? LMI_STATUS : LMI_STATUS_ENQUIRY;
  285. if (mode_is(hdlc, MODE_FR_ANSI))
  286. data[i++] = LMI_ANSI_LOCKSHIFT;
  287. data[i++] = mode_is(hdlc, MODE_FR_CCITT) ? LMI_CCITT_REPTYPE :
  288. LMI_REPTYPE;
  289. data[i++] = LMI_REPT_LEN;
  290. data[i++] = fullrep ? LMI_FULLREP : LMI_INTEGRITY;
  291. data[i++] = mode_is(hdlc, MODE_FR_CCITT) ? LMI_CCITT_ALIVE : LMI_ALIVE;
  292. data[i++] = LMI_INTEG_LEN;
  293. data[i++] = hdlc->lmi.txseq = fr_lmi_nextseq(hdlc->lmi.txseq);
  294. data[i++] = hdlc->lmi.rxseq;
  295. if (mode_is(hdlc, MODE_DCE) && fullrep) {
  296. while (pvc) {
  297. data[i++] = mode_is(hdlc, MODE_FR_CCITT) ?
  298. LMI_CCITT_PVCSTAT:LMI_PVCSTAT;
  299. data[i++] = stat_len;
  300. if ((hdlc->lmi.state & LINK_STATE_RELIABLE) &&
  301.     (pvc->netdev.flags & IFF_UP) &&
  302.     !(pvc->state & (PVC_STATE_ACTIVE|PVC_STATE_NEW))) {
  303. pvc->state |= PVC_STATE_NEW;
  304. fr_log_dlci_active(pvc);
  305. }
  306. dlci_to_status(hdlc, netdev_dlci(&pvc->netdev),
  307.        data+i, pvc->state);
  308. i += stat_len;
  309. pvc = pvc->next;
  310. }
  311. }
  312. skb_put(skb, i);
  313. skb->priority = TC_PRIO_CONTROL;
  314. skb->dev = hdlc_to_dev(hdlc);
  315. dev_queue_xmit(skb);
  316. }
  317. static void fr_timer(unsigned long arg)
  318. {
  319. hdlc_device *hdlc = (hdlc_device*)arg;
  320. int i, cnt = 0, reliable;
  321. u32 list;
  322. if (mode_is(hdlc, MODE_DCE))
  323. reliable = (jiffies - hdlc->lmi.last_poll < hdlc->lmi.T392*HZ);
  324. else {
  325. hdlc->lmi.last_errors <<= 1; /* Shift the list */
  326. if (hdlc->lmi.state & LINK_STATE_REQUEST) {
  327. printk(KERN_INFO "%s: No LMI status reply receivedn",
  328.        hdlc_to_name(hdlc));
  329. hdlc->lmi.last_errors |= 1;
  330. }
  331. for (i = 0, list = hdlc->lmi.last_errors; i < hdlc->lmi.N393;
  332.      i++, list >>= 1)
  333. cnt += (list & 1); /* errors count */
  334. reliable = (cnt < hdlc->lmi.N392);
  335. }
  336. if ((hdlc->lmi.state & LINK_STATE_RELIABLE) !=
  337.     (reliable ? LINK_STATE_RELIABLE : 0)) {
  338. pvc_device *pvc = hdlc->first_pvc;
  339. while (pvc) {/* Deactivate all PVCs */
  340. pvc->state &= ~(PVC_STATE_NEW | PVC_STATE_ACTIVE);
  341. pvc = pvc->next;
  342. }
  343. hdlc->lmi.state ^= LINK_STATE_RELIABLE;
  344. printk(KERN_INFO "%s: Link %sreliablen", hdlc_to_name(hdlc),
  345.        reliable ? "" : "un");
  346. if (reliable) {
  347. hdlc->lmi.N391cnt = 0; /* Request full status */
  348. hdlc->lmi.state |= LINK_STATE_CHANGED;
  349. }
  350. }
  351. if (mode_is(hdlc, MODE_DCE))
  352. hdlc->timer.expires = jiffies + hdlc->lmi.T392*HZ;
  353. else {
  354. if (hdlc->lmi.N391cnt)
  355. hdlc->lmi.N391cnt--;
  356. fr_lmi_send(hdlc, hdlc->lmi.N391cnt == 0);
  357. hdlc->lmi.state |= LINK_STATE_REQUEST;
  358. hdlc->timer.expires = jiffies + hdlc->lmi.T391*HZ;
  359. }
  360. hdlc->timer.function = fr_timer;
  361. hdlc->timer.data = arg;
  362. add_timer(&hdlc->timer);
  363. }
  364. static int fr_lmi_recv(hdlc_device *hdlc, struct sk_buff *skb)
  365. {
  366. int stat_len;
  367. pvc_device *pvc;
  368. int reptype = -1, error;
  369. u8 rxseq, txseq;
  370. int i;
  371. if (skb->len < (mode_is(hdlc, MODE_FR_ANSI) ?
  372. LMI_ANSI_LENGTH : LMI_LENGTH)) {
  373. printk(KERN_INFO "%s: Short LMI framen", hdlc_to_name(hdlc));
  374. return 1;
  375. }
  376. if (skb->data[5] != (!mode_is(hdlc, MODE_DCE) ?
  377.      LMI_STATUS : LMI_STATUS_ENQUIRY)) {
  378. printk(KERN_INFO "%s: LMI msgtype=%x, Not LMI status %sn",
  379.        hdlc_to_name(hdlc), skb->data[2],
  380.        mode_is(hdlc, MODE_DCE) ? "enquiry" : "reply");
  381. return 1;
  382. }
  383. i = mode_is(hdlc, MODE_FR_ANSI) ? 7 : 6;
  384. if (skb->data[i] !=
  385.     (mode_is(hdlc, MODE_FR_CCITT) ? LMI_CCITT_REPTYPE : LMI_REPTYPE)) {
  386. printk(KERN_INFO "%s: Not a report type=%xn",
  387.        hdlc_to_name(hdlc), skb->data[i]);
  388. return 1;
  389. }
  390. i++;
  391. i++; /* Skip length field */
  392. reptype = skb->data[i++];
  393. if (skb->data[i]!=
  394.     (mode_is(hdlc, MODE_FR_CCITT) ? LMI_CCITT_ALIVE : LMI_ALIVE)) {
  395. printk(KERN_INFO "%s: Unsupported status element=%xn",
  396.        hdlc_to_name(hdlc), skb->data[i]);
  397. return 1;
  398. }
  399. i++;
  400. i++; /* Skip length field */
  401. hdlc->lmi.rxseq = skb->data[i++]; /* TX sequence from peer */
  402. rxseq = skb->data[i++]; /* Should confirm our sequence */
  403. txseq = hdlc->lmi.txseq;
  404. if (mode_is(hdlc, MODE_DCE)) {
  405. if (reptype != LMI_FULLREP && reptype != LMI_INTEGRITY) {
  406. printk(KERN_INFO "%s: Unsupported report type=%xn",
  407.        hdlc_to_name(hdlc), reptype);
  408. return 1;
  409. }
  410. }
  411. error = 0;
  412. if (!(hdlc->lmi.state & LINK_STATE_RELIABLE))
  413. error = 1;
  414. if (rxseq == 0 || rxseq != txseq) {
  415. hdlc->lmi.N391cnt = 0; /* Ask for full report next time */
  416. error = 1;
  417. }
  418. if (mode_is(hdlc, MODE_DCE)) {
  419. if ((hdlc->lmi.state & LINK_STATE_FULLREP_SENT) && !error) {
  420. /* Stop sending full report - the last one has been confirmed by DTE */
  421. hdlc->lmi.state &= ~LINK_STATE_FULLREP_SENT;
  422. pvc = hdlc->first_pvc;
  423. while (pvc) {
  424. if (pvc->state & PVC_STATE_NEW) {
  425. pvc->state &= ~PVC_STATE_NEW;
  426. pvc->state |= PVC_STATE_ACTIVE;
  427. fr_log_dlci_active(pvc);
  428. /* Tell DTE that new PVC is now active */
  429. hdlc->lmi.state |= LINK_STATE_CHANGED;
  430. }
  431. pvc = pvc->next;
  432. }
  433. }
  434. if (hdlc->lmi.state & LINK_STATE_CHANGED) {
  435. reptype = LMI_FULLREP;
  436. hdlc->lmi.state |= LINK_STATE_FULLREP_SENT;
  437. hdlc->lmi.state &= ~LINK_STATE_CHANGED;
  438. }
  439. fr_lmi_send(hdlc, reptype == LMI_FULLREP ? 1 : 0);
  440. return 0;
  441. }
  442. /* DTE */
  443. if (reptype != LMI_FULLREP || error)
  444. return 0;
  445. stat_len = 3;
  446. pvc = hdlc->first_pvc;
  447. while (pvc) {
  448. pvc->newstate = 0;
  449. pvc = pvc->next;
  450. }
  451. while (skb->len >= i + 2 + stat_len) {
  452. u16 dlci;
  453. u8 state = 0;
  454. if (skb->data[i] != (mode_is(hdlc, MODE_FR_CCITT) ?
  455.      LMI_CCITT_PVCSTAT : LMI_PVCSTAT)) {
  456. printk(KERN_WARNING "%s: Invalid PVCSTAT ID: %xn",
  457.        hdlc_to_name(hdlc), skb->data[i]);
  458. return 1;
  459. }
  460. i++;
  461. if (skb->data[i] != stat_len) {
  462. printk(KERN_WARNING "%s: Invalid PVCSTAT length: %xn",
  463.        hdlc_to_name(hdlc), skb->data[i]);
  464. return 1;
  465. }
  466. i++;
  467. dlci = status_to_dlci(hdlc, skb->data+i, &state);
  468. pvc = find_pvc(hdlc, dlci);
  469. if (pvc)
  470. pvc->newstate = state;
  471. else if (state == PVC_STATE_NEW)
  472. printk(KERN_INFO "%s: new PVC available, DLCI=%un",
  473.        hdlc_to_name(hdlc), dlci);
  474. i += stat_len;
  475. }
  476. pvc = hdlc->first_pvc;
  477. while (pvc) {
  478. if (pvc->newstate == PVC_STATE_NEW)
  479. pvc->newstate = PVC_STATE_ACTIVE;
  480. pvc->newstate |= (pvc->state &
  481.   ~(PVC_STATE_NEW|PVC_STATE_ACTIVE));
  482. if (pvc->state != pvc->newstate) {
  483. pvc->state = pvc->newstate;
  484. fr_log_dlci_active(pvc);
  485. }
  486. pvc = pvc->next;
  487. }
  488. /* Next full report after N391 polls */
  489. hdlc->lmi.N391cnt = hdlc->lmi.N391;
  490. return 0;
  491. }
  492. static void fr_netif(hdlc_device *hdlc, struct sk_buff *skb)
  493. {
  494. fr_hdr *fh = (fr_hdr*)skb->data;
  495. u8 *data = skb->data;
  496. u16 dlci;
  497. pvc_device *pvc;
  498. if (skb->len<4 || fh->ea1 || data[2] != FR_UI)
  499. goto rx_error;
  500. dlci = q922_to_dlci(skb->data);
  501. if (dlci == LMI_DLCI) {
  502. if (data[3] == LMI_PROTO) {
  503. if (fr_lmi_recv(hdlc, skb))
  504. goto rx_error;
  505. else {
  506. /* No request pending */
  507. hdlc->lmi.state &= ~LINK_STATE_REQUEST;
  508. hdlc->lmi.last_poll = jiffies;
  509. dev_kfree_skb_any(skb);
  510. return;
  511. }
  512. }
  513. printk(KERN_INFO "%s: Received non-LMI frame with LMI DLCIn",
  514.        hdlc_to_name(hdlc));
  515. goto rx_error;
  516. }
  517. pvc = find_pvc(hdlc, dlci);
  518. if (!pvc) {
  519. #ifdef DEBUG_PKT
  520. printk(KERN_INFO "%s: No PVC for received frame's DLCI %dn",
  521.        hdlc_to_name(hdlc), dlci);
  522. #endif
  523. goto rx_error;
  524. }
  525. if ((pvc->netdev.flags & IFF_UP) == 0) {
  526. #ifdef DEBUG_PKT
  527. printk(KERN_INFO "%s: PVC for received frame's DLCI %d is downn",
  528.        hdlc_to_name(hdlc), dlci);
  529. #endif
  530. goto rx_error;
  531. }
  532. pvc->stats.rx_packets++; /* PVC traffic */
  533. pvc->stats.rx_bytes += skb->len;
  534. if ((pvc->state & PVC_STATE_FECN) != (fh->fecn ? PVC_STATE_FECN : 0)) {
  535. #ifdef DEBUG_FECN
  536. printk(KERN_DEBUG "%s: FECN O%sn", pvc_to_name(pvc),
  537.        fh->fecn ? "N" : "FF");
  538. #endif
  539. pvc->state ^= PVC_STATE_FECN;
  540. }
  541. if ((pvc->state & PVC_STATE_BECN) != (fh->becn ? PVC_STATE_BECN : 0)) {
  542. #ifdef DEBUG_FECN
  543. printk(KERN_DEBUG "%s: BECN O%sn", pvc_to_name(pvc),
  544.        fh->becn ? "N" : "FF");
  545. #endif
  546. pvc->state ^= PVC_STATE_BECN;
  547. }
  548. if (pvc->state & PVC_STATE_BECN)
  549. pvc->stats.rx_compressed++;
  550. if (data[3] == NLPID_IP) {
  551. skb_pull(skb, 4); /* Remove 4-byte header (hdr, UI, NLPID) */
  552. skb->protocol = htons(ETH_P_IP);
  553. skb->dev = &pvc->netdev;
  554. netif_rx(skb);
  555. return;
  556. }
  557. if (data[3] == NLPID_IPV6) {
  558. skb_pull(skb, 4); /* Remove 4-byte header (hdr, UI, NLPID) */
  559. skb->protocol = htons(ETH_P_IPV6);
  560. skb->dev = &pvc->netdev;
  561. netif_rx(skb);
  562. return;
  563. }
  564. if (data[3] == FR_PAD && data[4] == NLPID_SNAP && data[5] == FR_PAD &&
  565.     data[6] == FR_PAD && data[7] == FR_PAD &&
  566.     ((data[8]<<8) | data[9]) == ETH_P_ARP) {
  567. skb_pull(skb, 10);
  568. skb->protocol = htons(ETH_P_ARP);
  569. skb->dev = &pvc->netdev;
  570. netif_rx(skb);
  571. return;
  572. }
  573. printk(KERN_INFO "%s: Unusupported protocol %xn",
  574.        hdlc_to_name(hdlc), data[3]);
  575. dev_kfree_skb_any(skb);
  576. return;
  577.  rx_error:
  578. hdlc->stats.rx_errors++; /* Mark error */
  579. dev_kfree_skb_any(skb);
  580. }
  581. static void fr_cisco_open(hdlc_device *hdlc)
  582. {
  583. hdlc->lmi.state = LINK_STATE_CHANGED;
  584. hdlc->lmi.txseq = hdlc->lmi.rxseq = 0;
  585. hdlc->lmi.last_errors = 0xFFFFFFFF;
  586. hdlc->lmi.N391cnt = 0;
  587. init_timer(&hdlc->timer);
  588. hdlc->timer.expires = jiffies + HZ; /* First poll after 1 second */
  589. hdlc->timer.function = mode_is(hdlc, MODE_FR) ? fr_timer : cisco_timer;
  590. hdlc->timer.data = (unsigned long)hdlc;
  591. add_timer(&hdlc->timer);
  592. }
  593. static void fr_cisco_close(hdlc_device *hdlc)
  594. {
  595. pvc_device *pvc = hdlc->first_pvc;
  596. del_timer_sync(&hdlc->timer);
  597. while(pvc) { /* NULL in Cisco mode */
  598. dev_close(&pvc->netdev); /* Shutdown all PVCs for this FRAD */
  599. pvc = pvc->next;
  600. }
  601. }
  602. /******************************************************************
  603.  *
  604.  *     generic HDLC routines
  605.  *
  606.  *****************************************************************/
  607. static int hdlc_change_mtu(struct net_device *dev, int new_mtu)
  608. {
  609. if ((new_mtu < 68) || (new_mtu > HDLC_MAX_MTU))
  610. return -EINVAL;
  611. dev->mtu = new_mtu;
  612. return 0;
  613. }
  614. /********************************************************
  615.  *
  616.  * PVC device routines
  617.  *
  618.  *******************************************************/
  619. static int pvc_open(struct net_device *dev)
  620. {
  621. pvc_device *pvc = dev_to_pvc(dev);
  622. int result = 0;
  623. if ((hdlc_to_dev(pvc->master)->flags & IFF_UP) == 0)
  624. return -EIO;  /* Master must be UP in order to activate PVC */
  625. memset(&(pvc->stats), 0, sizeof(struct net_device_stats));
  626. pvc->state = 0;
  627. if (!mode_is(pvc->master, MODE_SOFT) && pvc->master->open_pvc)
  628. result = pvc->master->open_pvc(pvc);
  629. if (result)
  630. return result;
  631. pvc->master->lmi.state |= LINK_STATE_CHANGED;
  632. return 0;
  633. }
  634. static int pvc_close(struct net_device *dev)
  635. {
  636. pvc_device *pvc = dev_to_pvc(dev);
  637. pvc->state = 0;
  638. if (!mode_is(pvc->master, MODE_SOFT) && pvc->master->close_pvc)
  639. pvc->master->close_pvc(pvc);
  640. pvc->master->lmi.state |= LINK_STATE_CHANGED;
  641. return 0;
  642. }
  643. static int pvc_xmit(struct sk_buff *skb, struct net_device *dev)
  644. {
  645. pvc_device *pvc = dev_to_pvc(dev);
  646. if (pvc->state & PVC_STATE_ACTIVE) {
  647. skb->dev = hdlc_to_dev(pvc->master);
  648. pvc->stats.tx_bytes += skb->len;
  649. pvc->stats.tx_packets++;
  650. if (pvc->state & PVC_STATE_FECN)
  651. pvc->stats.tx_compressed++; /* TX Congestion counter */
  652. dev_queue_xmit(skb);
  653. } else {
  654. pvc->stats.tx_dropped++;
  655. dev_kfree_skb(skb);
  656. }
  657. return 0;
  658. }
  659. static struct net_device_stats *pvc_get_stats(struct net_device *dev)
  660. {
  661. pvc_device *pvc = dev_to_pvc(dev);
  662. return &pvc->stats;
  663. }
  664. static int pvc_change_mtu(struct net_device *dev, int new_mtu)
  665. {
  666. if ((new_mtu < 68) || (new_mtu > HDLC_MAX_MTU))
  667. return -EINVAL;
  668. dev->mtu = new_mtu;
  669. return 0;
  670. }
  671. static void destroy_pvc_list(hdlc_device *hdlc)
  672. {
  673. pvc_device *pvc = hdlc->first_pvc;
  674. while(pvc) {
  675. pvc_device *next = pvc->next;
  676. unregister_netdevice(&pvc->netdev);
  677. kfree(pvc);
  678. pvc = next;
  679. }
  680. hdlc->first_pvc = NULL; /* All PVCs destroyed */
  681. hdlc->pvc_count = 0;
  682. hdlc->lmi.state |= LINK_STATE_CHANGED;
  683. }
  684. /********************************************************
  685.  *
  686.  * X.25 protocol support routines
  687.  *
  688.  *******************************************************/
  689. #ifdef CONFIG_HDLC_X25
  690. /* These functions are callbacks called by LAPB layer */
  691. void x25_connect_disconnect(void *token, int reason, int code)
  692. {
  693. hdlc_device *hdlc = token;
  694. struct sk_buff *skb;
  695. unsigned char *ptr;
  696. if ((skb = dev_alloc_skb(1)) == NULL) {
  697. printk(KERN_ERR "%s: out of memoryn", hdlc_to_name(hdlc));
  698. return;
  699. }
  700. ptr = skb_put(skb, 1);
  701. *ptr = code;
  702. skb->dev = hdlc_to_dev(hdlc);
  703. skb->protocol = htons(ETH_P_X25);
  704. skb->mac.raw = skb->data;
  705. skb->pkt_type = PACKET_HOST;
  706. netif_rx(skb);
  707. }
  708. void x25_connected(void *token, int reason)
  709. {
  710. x25_connect_disconnect(token, reason, 1);
  711. }
  712. void x25_disconnected(void *token, int reason)
  713. {
  714. x25_connect_disconnect(token, reason, 2);
  715. }
  716. int x25_data_indication(void *token, struct sk_buff *skb)
  717. {
  718. hdlc_device *hdlc = token;
  719. unsigned char *ptr;
  720. ptr = skb_push(skb, 1);
  721. *ptr = 0;
  722. skb->dev = hdlc_to_dev(hdlc);
  723. skb->protocol = htons(ETH_P_X25);
  724. skb->mac.raw = skb->data;
  725. skb->pkt_type = PACKET_HOST;
  726. return netif_rx(skb);
  727. }
  728. void x25_data_transmit(void *token, struct sk_buff *skb)
  729. {
  730. hdlc_device *hdlc = token;
  731. hdlc->xmit(hdlc, skb); /* Ignore return value :-( */
  732. }
  733. #endif /* CONFIG_HDLC_X25 */
  734. /********************************************************
  735.  *
  736.  * HDLC device routines
  737.  *
  738.  *******************************************************/
  739. static int hdlc_open(struct net_device *dev)
  740. {
  741. hdlc_device *hdlc = dev_to_hdlc(dev);
  742. int result;
  743. if (hdlc->mode == MODE_NONE)
  744. return -ENOSYS;
  745. memset(&(hdlc->stats), 0, sizeof(struct net_device_stats));
  746. if (mode_is(hdlc, MODE_FR | MODE_SOFT) ||
  747.     mode_is(hdlc, MODE_CISCO | MODE_SOFT))
  748. fr_cisco_open(hdlc);
  749. #ifdef CONFIG_HDLC_PPP
  750. else if (mode_is(hdlc, MODE_PPP | MODE_SOFT)) {
  751. sppp_attach(&hdlc->pppdev);
  752. /* sppp_attach nukes them. We don't need syncppp's ioctl */
  753. dev->do_ioctl = hdlc_ioctl;
  754. hdlc->pppdev.sppp.pp_flags &= ~PP_CISCO;
  755. dev->type = ARPHRD_PPP;
  756. result = sppp_open(dev);
  757. if (result) {
  758. sppp_detach(dev);
  759. return result;
  760. }
  761. }
  762. #endif
  763. #ifdef CONFIG_HDLC_X25
  764. else if (mode_is(hdlc, MODE_X25)) {
  765. struct lapb_register_struct cb;
  766. cb.connect_confirmation = x25_connected;
  767. cb.connect_indication = x25_connected;
  768. cb.disconnect_confirmation = x25_disconnected;
  769. cb.disconnect_indication = x25_disconnected;
  770. cb.data_indication = x25_data_indication;
  771. cb.data_transmit = x25_data_transmit;
  772. result = lapb_register(hdlc, &cb);
  773. if (result != LAPB_OK)
  774. return result;
  775. }
  776. #endif
  777. result = hdlc->open(hdlc);
  778. if (result) {
  779. if (mode_is(hdlc, MODE_FR | MODE_SOFT) ||
  780.     mode_is(hdlc, MODE_CISCO | MODE_SOFT))
  781. fr_cisco_close(hdlc);
  782. #ifdef CONFIG_HDLC_PPP
  783. else if (mode_is(hdlc, MODE_PPP | MODE_SOFT)) {
  784. sppp_close(dev);
  785. sppp_detach(dev);
  786. dev->rebuild_header = NULL;
  787. dev->change_mtu = hdlc_change_mtu;
  788. dev->mtu = HDLC_MAX_MTU;
  789. dev->hard_header_len = 16;
  790. }
  791. #endif
  792. #ifdef CONFIG_HDLC_X25
  793. else if (mode_is(hdlc, MODE_X25))
  794. lapb_unregister(hdlc);
  795. #endif
  796. }
  797. return result;
  798. }
  799. static int hdlc_close(struct net_device *dev)
  800. {
  801. hdlc_device *hdlc = dev_to_hdlc(dev);
  802. hdlc->close(hdlc);
  803. if (mode_is(hdlc, MODE_FR | MODE_SOFT) ||
  804.     mode_is(hdlc, MODE_CISCO | MODE_SOFT))
  805. fr_cisco_close(hdlc);
  806. #ifdef CONFIG_HDLC_PPP
  807. else if (mode_is(hdlc, MODE_PPP | MODE_SOFT)) {
  808. sppp_close(dev);
  809. sppp_detach(dev);
  810. dev->rebuild_header = NULL;
  811. dev->change_mtu = hdlc_change_mtu;
  812. dev->mtu = HDLC_MAX_MTU;
  813. dev->hard_header_len = 16;
  814. }
  815. #endif
  816. #ifdef CONFIG_HDLC_X25
  817. else if (mode_is(hdlc, MODE_X25))
  818. lapb_unregister(hdlc);
  819. #endif
  820. return 0;
  821. }
  822. static int hdlc_xmit(struct sk_buff *skb, struct net_device *dev)
  823. {
  824. hdlc_device *hdlc = dev_to_hdlc(dev);
  825. #ifdef CONFIG_HDLC_X25
  826. if (mode_is(hdlc, MODE_X25 | MODE_SOFT)) {
  827. int result;
  828. /* X.25 to LAPB */
  829. switch (skb->data[0]) {
  830. case 0: /* Data to be transmitted */
  831. skb_pull(skb, 1);
  832. if ((result = lapb_data_request(hdlc, skb)) != LAPB_OK)
  833. dev_kfree_skb(skb);
  834. return 0;
  835. case 1:
  836. if ((result = lapb_connect_request(hdlc))!= LAPB_OK) {
  837. if (result == LAPB_CONNECTED) {
  838. /* Send connect confirm. msg to level 3 */
  839. x25_connected(hdlc, 0);
  840. } else {
  841. printk(KERN_ERR "%s: LAPB connect "
  842.        "request failed, error code = "
  843.        "%in", hdlc_to_name(hdlc),
  844.        result);
  845. }
  846. }
  847. break;
  848. case 2:
  849. if ((result=lapb_disconnect_request(hdlc))!=LAPB_OK) {
  850. if (result == LAPB_NOTCONNECTED) {
  851. /* Send disconnect confirm. msg to level 3 */
  852. x25_disconnected(hdlc, 0);
  853. } else {
  854. printk(KERN_ERR "%s: LAPB disconnect "
  855.        "request failed, error code = "
  856.        "%in", hdlc_to_name(hdlc),
  857.        result);
  858. }
  859. }
  860. break;
  861. default:
  862. /* to be defined */
  863. break;
  864. }
  865. dev_kfree_skb(skb);
  866. return 0;
  867. } /* MODE_X25 */
  868. #endif /* CONFIG_HDLC_X25 */
  869. return hdlc->xmit(hdlc, skb);
  870. }
  871. void hdlc_netif_rx(hdlc_device *hdlc, struct sk_buff *skb)
  872. {
  873. /* skb contains raw HDLC frame, in both hard- and software modes */
  874. skb->mac.raw = skb->data;
  875. switch(hdlc->mode & MODE_MASK) {
  876. case MODE_HDLC:
  877. skb->protocol = htons(ETH_P_IP);
  878. skb->dev = hdlc_to_dev(hdlc);
  879. netif_rx(skb);
  880. return;
  881. case MODE_FR:
  882. fr_netif(hdlc, skb);
  883. return;
  884. case MODE_CISCO:
  885. cisco_netif(hdlc, skb);
  886. return;
  887. #ifdef CONFIG_HDLC_PPP
  888. case MODE_PPP:
  889. #if 0
  890. sppp_input(hdlc_to_dev(hdlc), skb);
  891. #else
  892. skb->protocol = htons(ETH_P_WAN_PPP);
  893. skb->dev = hdlc_to_dev(hdlc);
  894. netif_rx(skb);
  895. #endif
  896. return;
  897. #endif
  898. #ifdef CONFIG_HDLC_X25
  899. case MODE_X25:
  900. skb->dev = hdlc_to_dev(hdlc);
  901. if (lapb_data_received(hdlc, skb) == LAPB_OK)
  902. return;
  903. break;
  904. #endif
  905. }
  906. hdlc->stats.rx_errors++;
  907. dev_kfree_skb_any(skb);
  908. }
  909. static struct net_device_stats *hdlc_get_stats(struct net_device *dev)
  910. {
  911. return &dev_to_hdlc(dev)->stats;
  912. }
  913. static int hdlc_set_mode(hdlc_device *hdlc, int mode)
  914. {
  915. int result = -1; /* Default to soft modes */
  916. struct net_device *dev = hdlc_to_dev(hdlc);
  917. if(!capable(CAP_NET_ADMIN))
  918. return -EPERM;
  919. if(dev->flags & IFF_UP)
  920. return -EBUSY;
  921. dev->addr_len = 0;
  922. dev->hard_header = NULL;
  923. hdlc->mode = MODE_NONE;
  924. if (!(mode & MODE_SOFT))
  925. switch(mode & MODE_MASK) {
  926. case MODE_HDLC:
  927. result = hdlc->set_mode ?
  928. hdlc->set_mode(hdlc, MODE_HDLC) : 0;
  929. break;
  930. case MODE_CISCO: /* By card */
  931. #ifdef CONFIG_HDLC_PPP
  932. case MODE_PPP:
  933. #endif
  934. #ifdef CONFIG_HDLC_X25
  935. case MODE_X25:
  936. #endif
  937. case MODE_FR:
  938. result = hdlc->set_mode ?
  939. hdlc->set_mode(hdlc, mode) : -ENOSYS;
  940. break;
  941. default:
  942. return -EINVAL;
  943. }
  944. if (result) {
  945. mode |= MODE_SOFT; /* Try "host software" protocol */
  946. switch(mode & MODE_MASK) {
  947. case MODE_CISCO:
  948. dev->hard_header = cisco_hard_header;
  949. break;
  950. #ifdef CONFIG_HDLC_PPP
  951. case MODE_PPP:
  952. break;
  953. #endif
  954. #ifdef CONFIG_HDLC_X25
  955. case MODE_X25:
  956. break;
  957. #endif
  958. case MODE_FR:
  959. dev->hard_header = fr_hard_header;
  960. dev->addr_len = 2;
  961. *(u16*)dev->dev_addr = htons(LMI_DLCI);
  962. dlci_to_q922(dev->broadcast, LMI_DLCI);
  963. break;
  964. default:
  965. return -EINVAL;
  966. }
  967. result = hdlc->set_mode ?
  968. hdlc->set_mode(hdlc, MODE_HDLC) : 0;
  969. }
  970. if (result)
  971. return result;
  972. hdlc->mode = mode;
  973. switch(mode & MODE_MASK) {
  974. #ifdef CONFIG_HDLC_PPP
  975. case MODE_PPP:   dev->type = ARPHRD_PPP;   break;
  976. #endif
  977. #ifdef CONFIG_HDLC_X25
  978. case MODE_X25:   dev->type = ARPHRD_X25;   break;
  979. #endif
  980. case MODE_FR:    dev->type = ARPHRD_FRAD;  break;
  981. case MODE_CISCO: dev->type = ARPHRD_CISCO; break;
  982. default:         dev->type = ARPHRD_RAWHDLC;
  983. }
  984. memset(&(hdlc->stats), 0, sizeof(struct net_device_stats));
  985. destroy_pvc_list(hdlc);
  986. return 0;
  987. }
  988. static int hdlc_fr_pvc(hdlc_device *hdlc, int dlci)
  989. {
  990. pvc_device **pvc_p = &hdlc->first_pvc;
  991. pvc_device *pvc;
  992. int result, create = 1; /* Create or delete PVC */
  993. if(!capable(CAP_NET_ADMIN))
  994. return -EPERM;
  995. if(dlci<0) {
  996. dlci = -dlci;
  997. create = 0;
  998. }
  999. if(dlci <= 0 || dlci >= 1024)
  1000. return -EINVAL; /* Only 10 bits for DLCI, DLCI=0 is reserved */
  1001. if(!mode_is(hdlc, MODE_FR))
  1002. return -EINVAL; /* Only meaningfull on FR */
  1003. while(*pvc_p) {
  1004. if (netdev_dlci(&(*pvc_p)->netdev) == dlci)
  1005. break;
  1006. pvc_p = &(*pvc_p)->next;
  1007. }
  1008. if (create) { /* Create PVC */
  1009. if (*pvc_p != NULL)
  1010. return -EEXIST;
  1011. pvc = *pvc_p = kmalloc(sizeof(pvc_device), GFP_KERNEL);
  1012. if (!pvc) {
  1013. printk(KERN_WARNING "%s: Memory squeeze on "
  1014.        "hdlc_fr_pvc()n", hdlc_to_name(hdlc));
  1015. return -ENOBUFS;
  1016. }
  1017. memset(pvc, 0, sizeof(pvc_device));
  1018. pvc->netdev.hard_start_xmit = pvc_xmit;
  1019. pvc->netdev.get_stats = pvc_get_stats;
  1020. pvc->netdev.open = pvc_open;
  1021. pvc->netdev.stop = pvc_close;
  1022. pvc->netdev.change_mtu = pvc_change_mtu;
  1023. pvc->netdev.mtu = HDLC_MAX_MTU;
  1024. pvc->netdev.type = ARPHRD_DLCI;
  1025. pvc->netdev.hard_header_len = 16;
  1026. pvc->netdev.hard_header = fr_hard_header;
  1027. pvc->netdev.tx_queue_len = 0;
  1028. pvc->netdev.flags = IFF_POINTOPOINT;
  1029. pvc->master = hdlc;
  1030. *(u16*)pvc->netdev.dev_addr = htons(dlci);
  1031. dlci_to_q922(pvc->netdev.broadcast, dlci);
  1032. pvc->netdev.addr_len = 2;
  1033. pvc->netdev.irq = hdlc_to_dev(hdlc)->irq;
  1034. result = dev_alloc_name(&pvc->netdev, "pvc%d");
  1035. if (result < 0) {
  1036. kfree(pvc);
  1037. *pvc_p = NULL;
  1038. return result;
  1039. }
  1040. if (register_netdevice(&pvc->netdev) != 0) {
  1041. kfree(pvc);
  1042. *pvc_p = NULL;
  1043. return -EIO;
  1044. }
  1045. if (!mode_is(hdlc, MODE_SOFT) && hdlc->create_pvc) {
  1046. result = hdlc->create_pvc(pvc);
  1047. if (result) {
  1048. unregister_netdevice(&pvc->netdev);
  1049. kfree(pvc);
  1050. *pvc_p = NULL;
  1051. return result;
  1052. }
  1053. }
  1054. hdlc->lmi.state |= LINK_STATE_CHANGED;
  1055. hdlc->pvc_count++;
  1056. return 0;
  1057. }
  1058. if (*pvc_p == NULL) /* Delete PVC */
  1059. return -ENOENT;
  1060. pvc = *pvc_p;
  1061. if (pvc->netdev.flags & IFF_UP)
  1062. return -EBUSY; /* PVC in use */
  1063. if (!mode_is(hdlc, MODE_SOFT) && hdlc->destroy_pvc)
  1064. hdlc->destroy_pvc(pvc);
  1065. hdlc->lmi.state |= LINK_STATE_CHANGED;
  1066. hdlc->pvc_count--;
  1067. *pvc_p = pvc->next;
  1068. unregister_netdevice(&pvc->netdev);
  1069. kfree(pvc);
  1070. return 0;
  1071. }
  1072. static int hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
  1073. {
  1074. hdlc_device *hdlc = dev_to_hdlc(dev);
  1075. switch(cmd) {
  1076. case HDLCGMODE:
  1077. ifr->ifr_ifru.ifru_ivalue = hdlc->mode;
  1078. return 0;
  1079. case HDLCSMODE:
  1080. return hdlc_set_mode(hdlc, ifr->ifr_ifru.ifru_ivalue);
  1081. case HDLCPVC:
  1082. return hdlc_fr_pvc(hdlc, ifr->ifr_ifru.ifru_ivalue);
  1083. default:
  1084. if (hdlc->ioctl != NULL)
  1085. return hdlc->ioctl(hdlc, ifr, cmd);
  1086. }
  1087. return -EINVAL;
  1088. }
  1089. static int hdlc_init(struct net_device *dev)
  1090. {
  1091. hdlc_device *hdlc = dev_to_hdlc(dev);
  1092. memset(&(hdlc->stats), 0, sizeof(struct net_device_stats));
  1093. dev->get_stats = hdlc_get_stats;
  1094. dev->open = hdlc_open;
  1095. dev->stop = hdlc_close;
  1096. dev->hard_start_xmit = hdlc_xmit;
  1097. dev->do_ioctl = hdlc_ioctl;
  1098. dev->change_mtu = hdlc_change_mtu;
  1099. dev->mtu = HDLC_MAX_MTU;
  1100. dev->type = ARPHRD_RAWHDLC;
  1101. dev->hard_header_len = 16;
  1102. dev->flags = IFF_POINTOPOINT | IFF_NOARP;
  1103. return 0;
  1104. }
  1105. int register_hdlc_device(hdlc_device *hdlc)
  1106. {
  1107. int result;
  1108. struct net_device *dev = hdlc_to_dev(hdlc);
  1109. dev->init = hdlc_init;
  1110. dev->priv = &hdlc->syncppp_ptr;
  1111. hdlc->syncppp_ptr = &hdlc->pppdev;
  1112. hdlc->pppdev.dev = dev;
  1113. hdlc->mode = MODE_NONE;
  1114. hdlc->lmi.T391 = 10; /* polling verification timer */
  1115. hdlc->lmi.T392 = 15; /* link integrity verification polling timer */
  1116. hdlc->lmi.N391 = 6; /* full status polling counter */
  1117. hdlc->lmi.N392 = 3; /* error threshold */
  1118. hdlc->lmi.N393 = 4; /* monitored events count */
  1119. result = dev_alloc_name(dev, "hdlc%d");
  1120. if (result<0)
  1121. return result;
  1122. result = register_netdev(dev);
  1123. if (result != 0)
  1124. return -EIO;
  1125. MOD_INC_USE_COUNT;
  1126. return 0;
  1127. }
  1128. void unregister_hdlc_device(hdlc_device *hdlc)
  1129. {
  1130. destroy_pvc_list(hdlc);
  1131. unregister_netdev(hdlc_to_dev(hdlc));
  1132. MOD_DEC_USE_COUNT;
  1133. }
  1134. MODULE_AUTHOR("Krzysztof Halasa <khc@pm.waw.pl>");
  1135. MODULE_DESCRIPTION("HDLC support module");
  1136. MODULE_LICENSE("GPL");
  1137. EXPORT_SYMBOL(hdlc_netif_rx);
  1138. EXPORT_SYMBOL(register_hdlc_device);
  1139. EXPORT_SYMBOL(unregister_hdlc_device);
  1140. static int __init hdlc_module_init(void)
  1141. {
  1142. printk(KERN_INFO "%sn", version);
  1143. return 0;
  1144. }
  1145. module_init(hdlc_module_init);