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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: isdn_net.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
  2.  *
  3.  * Linux ISDN subsystem, network interfaces and related functions (linklevel).
  4.  *
  5.  * Copyright 1994-1998  by Fritz Elfert (fritz@isdn4linux.de)
  6.  * Copyright 1995,96    by Thinking Objects Software GmbH Wuerzburg
  7.  * Copyright 1995,96    by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de)
  8.  *
  9.  * This software may be used and distributed according to the terms
  10.  * of the GNU General Public License, incorporated herein by reference.
  11.  *
  12.  * Data Over Voice (DOV) support added - Guy Ellis 23-Mar-02 
  13.  *                                       guy@traverse.com.au
  14.  * Outgoing calls - looks for a 'V' in first char of dialed number
  15.  * Incoming calls - checks first character of eaz as follows:
  16.  *   Numeric - accept DATA only - original functionality
  17.  *   'V'     - accept VOICE (DOV) only
  18.  *   'B'     - accept BOTH DATA and DOV types
  19.  *
  20.  * Jan 2001: fix CISCO HDLC      Bjoern A. Zeeb <i4l@zabbadoz.net>
  21.  *           for info on the protocol, see 
  22.  *           http://i4l.zabbadoz.net/i4l/cisco-hdlc.txt
  23.  */
  24. #include <linux/config.h>
  25. #include <linux/isdn.h>
  26. #include <net/arp.h>
  27. #include <net/dst.h>
  28. #include <net/pkt_sched.h>
  29. #include <linux/inetdevice.h>
  30. #include "isdn_common.h"
  31. #include "isdn_net.h"
  32. #ifdef CONFIG_ISDN_PPP
  33. #include "isdn_ppp.h"
  34. #endif
  35. #ifdef CONFIG_ISDN_X25
  36. #include <linux/concap.h>
  37. #include "isdn_concap.h"
  38. #endif
  39. /*
  40.  * Outline of new tbusy handling: 
  41.  *
  42.  * Old method, roughly spoken, consisted of setting tbusy when entering
  43.  * isdn_net_start_xmit() and at several other locations and clearing
  44.  * it from isdn_net_start_xmit() thread when sending was successful.
  45.  *
  46.  * With 2.3.x multithreaded network core, to prevent problems, tbusy should
  47.  * only be set by the isdn_net_start_xmit() thread and only when a tx-busy
  48.  * condition is detected. Other threads (in particular isdn_net_stat_callb())
  49.  * are only allowed to clear tbusy.
  50.  *
  51.  * -HE
  52.  */
  53. /*
  54.  * About SOFTNET:
  55.  * Most of the changes were pretty obvious and basically done by HE already.
  56.  *
  57.  * One problem of the isdn net device code is that is uses struct net_device
  58.  * for masters and slaves. However, only master interface are registered to 
  59.  * the network layer, and therefore, it only makes sense to call netif_* 
  60.  * functions on them.
  61.  *
  62.  * --KG
  63.  */
  64. /* 
  65.  * Find out if the netdevice has been ifup-ed yet.
  66.  * For slaves, look at the corresponding master.
  67.  */
  68. static __inline__ int isdn_net_device_started(isdn_net_dev *n)
  69. {
  70. isdn_net_local *lp = n->local;
  71. struct net_device *dev;
  72. if (lp->master) 
  73. dev = lp->master;
  74. else
  75. dev = &n->dev;
  76. return netif_running(dev);
  77. }
  78. /*
  79.  * wake up the network -> net_device queue.
  80.  * For slaves, wake the corresponding master interface.
  81.  */
  82. static __inline__ void isdn_net_device_wake_queue(isdn_net_local *lp)
  83. {
  84. if (lp->master) 
  85. netif_wake_queue(lp->master);
  86. else
  87. netif_wake_queue(&lp->netdev->dev);
  88. }
  89. /*
  90.  * stop the network -> net_device queue.
  91.  * For slaves, stop the corresponding master interface.
  92.  */
  93. static __inline__ void isdn_net_device_stop_queue(isdn_net_local *lp)
  94. {
  95. if (lp->master)
  96. netif_stop_queue(lp->master);
  97. else
  98. netif_stop_queue(&lp->netdev->dev);
  99. }
  100. /*
  101.  * find out if the net_device which this lp belongs to (lp can be
  102.  * master or slave) is busy. It's busy iff all (master and slave) 
  103.  * queues are busy
  104.  */
  105. static __inline__ int isdn_net_device_busy(isdn_net_local *lp)
  106. {
  107. isdn_net_local *nlp;
  108. isdn_net_dev *nd;
  109. unsigned long flags;
  110. if (!isdn_net_lp_busy(lp))
  111. return 0;
  112. if (lp->master)
  113. nd = ((isdn_net_local *) lp->master->priv)->netdev;
  114. else
  115. nd = lp->netdev;
  116. spin_lock_irqsave(&nd->queue_lock, flags);
  117. nlp = lp->next;
  118. while (nlp != lp) {
  119. if (!isdn_net_lp_busy(nlp)) {
  120. spin_unlock_irqrestore(&nd->queue_lock, flags);
  121. return 0;
  122. }
  123. nlp = nlp->next;
  124. }
  125. spin_unlock_irqrestore(&nd->queue_lock, flags);
  126. return 1;
  127. }
  128. static __inline__ void isdn_net_inc_frame_cnt(isdn_net_local *lp)
  129. {
  130. atomic_inc(&lp->frame_cnt);
  131. if (isdn_net_device_busy(lp))
  132. isdn_net_device_stop_queue(lp);
  133. }
  134. static __inline__ void isdn_net_dec_frame_cnt(isdn_net_local *lp)
  135. {
  136. atomic_dec(&lp->frame_cnt);
  137. if (!(isdn_net_device_busy(lp))) {
  138. if (!skb_queue_empty(&lp->super_tx_queue)) {
  139. queue_task(&lp->tqueue, &tq_immediate);
  140. mark_bh(IMMEDIATE_BH);
  141. } else {
  142. isdn_net_device_wake_queue(lp);
  143. }
  144.        }                                                                      
  145. }
  146. static __inline__ void isdn_net_zero_frame_cnt(isdn_net_local *lp)
  147. {
  148. atomic_set(&lp->frame_cnt, 0);
  149. }
  150. /* For 2.2.x we leave the transmitter busy timeout at 2 secs, just 
  151.  * to be safe.
  152.  * For 2.3.x we push it up to 20 secs, because call establishment
  153.  * (in particular callback) may take such a long time, and we 
  154.  * don't want confusing messages in the log. However, there is a slight
  155.  * possibility that this large timeout will break other things like MPPP,
  156.  * which might rely on the tx timeout. If so, we'll find out this way...
  157.  */
  158. #define ISDN_NET_TX_TIMEOUT (20*HZ) 
  159. /* Prototypes */
  160. int isdn_net_force_dial_lp(isdn_net_local *);
  161. static int isdn_net_start_xmit(struct sk_buff *, struct net_device *);
  162. static void isdn_net_ciscohdlck_connected(isdn_net_local *lp);
  163. static void isdn_net_ciscohdlck_disconnected(isdn_net_local *lp);
  164. char *isdn_net_revision = "$Revision: 1.1.4.1 $";
  165.  /*
  166.   * Code for raw-networking over ISDN
  167.   */
  168. static void
  169. isdn_net_unreachable(struct net_device *dev, struct sk_buff *skb, char *reason)
  170. {
  171. if(skb) {
  172. u_short proto = ntohs(skb->protocol);
  173. printk(KERN_DEBUG "isdn_net: %s: %s, signalling dst_link_failure %sn",
  174.        dev->name,
  175.        (reason != NULL) ? reason : "unknown",
  176.        (proto != ETH_P_IP) ? "Protocol != ETH_P_IP" : "");
  177. dst_link_failure(skb);
  178. }
  179. else {  /* dial not triggered by rawIP packet */
  180. printk(KERN_DEBUG "isdn_net: %s: %sn",
  181.    dev->name,
  182.    (reason != NULL) ? reason : "reason unknown");
  183. }
  184. }
  185. static void
  186. isdn_net_reset(struct net_device *dev)
  187. {
  188. #ifdef CONFIG_ISDN_X25
  189. struct concap_device_ops * dops =
  190. ( (isdn_net_local *) dev->priv ) -> dops;
  191. struct concap_proto * cprot =
  192. ( (isdn_net_local *) dev->priv ) -> netdev -> cprot;
  193. #endif
  194. ulong flags;
  195. /* not sure if the cli() is needed at all --KG */
  196. save_flags(flags);
  197. cli();                  /* Avoid glitch on writes to CMD regs */
  198. #ifdef CONFIG_ISDN_X25
  199. if( cprot && cprot -> pops && dops )
  200. cprot -> pops -> restart ( cprot, dev, dops );
  201. #endif
  202. restore_flags(flags);
  203. }
  204. /* Open/initialize the board. */
  205. static int
  206. isdn_net_open(struct net_device *dev)
  207. {
  208. int i;
  209. struct net_device *p;
  210. struct in_device *in_dev;
  211. /* moved here from isdn_net_reset, because only the master has an
  212.    interface associated which is supposed to be started. BTW:
  213.    we need to call netif_start_queue, not netif_wake_queue here */
  214. netif_start_queue(dev);
  215. isdn_net_reset(dev);
  216. /* Fill in the MAC-level header (not needed, but for compatibility... */
  217. for (i = 0; i < ETH_ALEN - sizeof(u32); i++)
  218. dev->dev_addr[i] = 0xfc;
  219. if ((in_dev = dev->ip_ptr) != NULL) {
  220. /*
  221.  *      Any address will do - we take the first
  222.  */
  223. struct in_ifaddr *ifa = in_dev->ifa_list;
  224. if (ifa != NULL)
  225. memcpy(dev->dev_addr+2, &ifa->ifa_local, 4);
  226. }
  227. /* If this interface has slaves, start them also */
  228. if ((p = (((isdn_net_local *) dev->priv)->slave))) {
  229. while (p) {
  230. isdn_net_reset(p);
  231. p = (((isdn_net_local *) p->priv)->slave);
  232. }
  233. }
  234. isdn_MOD_INC_USE_COUNT();
  235. return 0;
  236. }
  237. /*
  238.  * Assign an ISDN-channel to a net-interface
  239.  */
  240. static void
  241. isdn_net_bind_channel(isdn_net_local * lp, int idx)
  242. {
  243. ulong flags;
  244. save_flags(flags);
  245. cli();
  246. lp->flags |= ISDN_NET_CONNECTED;
  247. lp->isdn_device = dev->drvmap[idx];
  248. lp->isdn_channel = dev->chanmap[idx];
  249. dev->rx_netdev[idx] = lp->netdev;
  250. dev->st_netdev[idx] = lp->netdev;
  251. restore_flags(flags);
  252. }
  253. /*
  254.  * unbind a net-interface (resets interface after an error)
  255.  */
  256. static void
  257. isdn_net_unbind_channel(isdn_net_local * lp)
  258. {
  259. ulong flags;
  260. save_flags(flags);
  261. cli();
  262. skb_queue_purge(&lp->super_tx_queue);
  263. if (!lp->master) { /* reset only master device */
  264. /* Moral equivalent of dev_purge_queues():
  265.    BEWARE! This chunk of code cannot be called from hardware
  266.    interrupt handler. I hope it is true. --ANK
  267.  */
  268. qdisc_reset(lp->netdev->dev.qdisc);
  269. }
  270. lp->dialstate = 0;
  271. dev->rx_netdev[isdn_dc2minor(lp->isdn_device, lp->isdn_channel)] = NULL;
  272. dev->st_netdev[isdn_dc2minor(lp->isdn_device, lp->isdn_channel)] = NULL;
  273. isdn_free_channel(lp->isdn_device, lp->isdn_channel, ISDN_USAGE_NET);
  274. lp->flags &= ~ISDN_NET_CONNECTED;
  275. lp->isdn_device = -1;
  276. lp->isdn_channel = -1;
  277. restore_flags(flags);
  278. }
  279. /*
  280.  * Perform auto-hangup and cps-calculation for net-interfaces.
  281.  *
  282.  * auto-hangup:
  283.  * Increment idle-counter (this counter is reset on any incoming or
  284.  * outgoing packet), if counter exceeds configured limit either do a
  285.  * hangup immediately or - if configured - wait until just before the next
  286.  * charge-info.
  287.  *
  288.  * cps-calculation (needed for dynamic channel-bundling):
  289.  * Since this function is called every second, simply reset the
  290.  * byte-counter of the interface after copying it to the cps-variable.
  291.  */
  292. unsigned long last_jiffies = -HZ;
  293. void
  294. isdn_net_autohup()
  295. {
  296. isdn_net_dev *p = dev->netdev;
  297. int anymore;
  298. anymore = 0;
  299. while (p) {
  300. isdn_net_local *l = p->local;
  301. if (jiffies == last_jiffies)
  302. l->cps = l->transcount;
  303. else
  304. l->cps = (l->transcount * HZ) / (jiffies - last_jiffies);
  305. l->transcount = 0;
  306. if (dev->net_verbose > 3)
  307. printk(KERN_DEBUG "%s: %d bogocpsn", l->name, l->cps);
  308. if ((l->flags & ISDN_NET_CONNECTED) && (!l->dialstate)) {
  309. anymore = 1;
  310. l->huptimer++;
  311. /*
  312.  * if there is some dialmode where timeout-hangup
  313.  * should _not_ be done, check for that here
  314.  */
  315. if ((l->onhtime) &&
  316.     (l->huptimer > l->onhtime))
  317. {
  318. if (l->hupflags & ISDN_MANCHARGE &&
  319.     l->hupflags & ISDN_CHARGEHUP) {
  320. while (time_after(jiffies, l->chargetime + l->chargeint))
  321. l->chargetime += l->chargeint;
  322. if (time_after(jiffies, l->chargetime + l->chargeint - 2 * HZ))
  323. if (l->outgoing || l->hupflags & ISDN_INHUP)
  324. isdn_net_hangup(&p->dev);
  325. } else if (l->outgoing) {
  326. if (l->hupflags & ISDN_CHARGEHUP) {
  327. if (l->hupflags & ISDN_WAITCHARGE) {
  328. printk(KERN_DEBUG "isdn_net: Hupflags of %s are %Xn",
  329.        l->name, l->hupflags);
  330. isdn_net_hangup(&p->dev);
  331. } else if (time_after(jiffies, l->chargetime + l->chargeint)) {
  332. printk(KERN_DEBUG
  333.        "isdn_net: %s: chtime = %lu, chint = %dn",
  334.        l->name, l->chargetime, l->chargeint);
  335. isdn_net_hangup(&p->dev);
  336. }
  337. } else
  338. isdn_net_hangup(&p->dev);
  339. } else if (l->hupflags & ISDN_INHUP)
  340. isdn_net_hangup(&p->dev);
  341. }
  342. if(dev->global_flags & ISDN_GLOBAL_STOPPED || (ISDN_NET_DIALMODE(*l) == ISDN_NET_DM_OFF)) {
  343. isdn_net_hangup(&p->dev);
  344. break;
  345. }
  346. }
  347. p = (isdn_net_dev *) p->next;
  348. }
  349. last_jiffies = jiffies;
  350. isdn_timer_ctrl(ISDN_TIMER_NETHANGUP, anymore);
  351. }
  352. static void isdn_net_lp_disconnected(isdn_net_local *lp)
  353. {
  354. isdn_net_rm_from_bundle(lp);
  355. }
  356. /*
  357.  * Handle status-messages from ISDN-interfacecard.
  358.  * This function is called from within the main-status-dispatcher
  359.  * isdn_status_callback, which itself is called from the low-level driver.
  360.  * Return: 1 = Event handled, 0 = not for us or unknown Event.
  361.  */
  362. int
  363. isdn_net_stat_callback(int idx, isdn_ctrl *c)
  364. {
  365. isdn_net_dev *p = dev->st_netdev[idx];
  366. int cmd = c->command;
  367. if (p) {
  368. isdn_net_local *lp = p->local;
  369. #ifdef CONFIG_ISDN_X25
  370. struct concap_proto *cprot = lp -> netdev -> cprot;
  371. struct concap_proto_ops *pops = cprot ? cprot -> pops : 0;
  372. #endif
  373. switch (cmd) {
  374. case ISDN_STAT_BSENT:
  375. /* A packet has successfully been sent out */
  376. if ((lp->flags & ISDN_NET_CONNECTED) &&
  377.     (!lp->dialstate)) {
  378. isdn_net_dec_frame_cnt(lp);
  379. lp->stats.tx_packets++;
  380. lp->stats.tx_bytes += c->parm.length;
  381. }
  382. return 1;
  383. case ISDN_STAT_DCONN:
  384. /* D-Channel is up */
  385. switch (lp->dialstate) {
  386. case 4:
  387. case 7:
  388. case 8:
  389. lp->dialstate++;
  390. return 1;
  391. case 12:
  392. lp->dialstate = 5;
  393. return 1;
  394. }
  395. break;
  396. case ISDN_STAT_DHUP:
  397. /* Either D-Channel-hangup or error during dialout */
  398. #ifdef CONFIG_ISDN_X25
  399. /* If we are not connencted then dialing had
  400.    failed. If there are generic encap protocol
  401.    receiver routines signal the closure of
  402.    the link*/
  403. if( !(lp->flags & ISDN_NET_CONNECTED)
  404.     && pops && pops -> disconn_ind )
  405. pops -> disconn_ind(cprot);
  406. #endif /* CONFIG_ISDN_X25 */
  407. if ((!lp->dialstate) && (lp->flags & ISDN_NET_CONNECTED)) {
  408. if (lp->p_encap == ISDN_NET_ENCAP_CISCOHDLCK)
  409. isdn_net_ciscohdlck_disconnected(lp);
  410. #ifdef CONFIG_ISDN_PPP
  411. if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP)
  412. isdn_ppp_free(lp);
  413. #endif
  414. isdn_net_lp_disconnected(lp);
  415. isdn_all_eaz(lp->isdn_device, lp->isdn_channel);
  416. printk(KERN_INFO "%s: remote hangupn", lp->name);
  417. printk(KERN_INFO "%s: Chargesum is %dn", lp->name,
  418.        lp->charge);
  419. isdn_net_unbind_channel(lp);
  420. return 1;
  421. }
  422. break;
  423. #ifdef CONFIG_ISDN_X25
  424. case ISDN_STAT_BHUP:
  425. /* B-Channel-hangup */
  426. /* try if there are generic encap protocol
  427.    receiver routines and signal the closure of
  428.    the link */
  429. if( pops  &&  pops -> disconn_ind ){
  430. pops -> disconn_ind(cprot);
  431. return 1;
  432. }
  433. break;
  434. #endif /* CONFIG_ISDN_X25 */
  435. case ISDN_STAT_BCONN:
  436. /* B-Channel is up */
  437. isdn_net_zero_frame_cnt(lp);
  438. switch (lp->dialstate) {
  439. case 5:
  440. case 6:
  441. case 7:
  442. case 8:
  443. case 9:
  444. case 10:
  445. case 12:
  446. if (lp->dialstate <= 6) {
  447. dev->usage[idx] |= ISDN_USAGE_OUTGOING;
  448. isdn_info_update();
  449. } else
  450. dev->rx_netdev[idx] = p;
  451. lp->dialstate = 0;
  452. isdn_timer_ctrl(ISDN_TIMER_NETHANGUP, 1);
  453. if (lp->p_encap == ISDN_NET_ENCAP_CISCOHDLCK)
  454. isdn_net_ciscohdlck_connected(lp);
  455. if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP) {
  456. if (lp->master) { /* is lp a slave? */
  457. isdn_net_dev *nd = ((isdn_net_local *)lp->master->priv)->netdev;
  458. isdn_net_add_to_bundle(nd, lp);
  459. }
  460. }
  461. printk(KERN_INFO "isdn_net: %s connectedn", lp->name);
  462. /* If first Chargeinfo comes before B-Channel connect,
  463.  * we correct the timestamp here.
  464.  */
  465. lp->chargetime = jiffies;
  466. /* reset dial-timeout */
  467. lp->dialstarted = 0;
  468. lp->dialwait_timer = 0;
  469. #ifdef CONFIG_ISDN_PPP
  470. if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP)
  471. isdn_ppp_wakeup_daemon(lp);
  472. #endif
  473. #ifdef CONFIG_ISDN_X25
  474. /* try if there are generic concap receiver routines */
  475. if( pops )
  476. if( pops->connect_ind)
  477. pops->connect_ind(cprot);
  478. #endif /* CONFIG_ISDN_X25 */
  479. /* ppp needs to do negotiations first */
  480. if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP)
  481. isdn_net_device_wake_queue(lp);
  482. return 1;
  483. }
  484. break;
  485. case ISDN_STAT_NODCH:
  486. /* No D-Channel avail. */
  487. if (lp->dialstate == 4) {
  488. lp->dialstate--;
  489. return 1;
  490. }
  491. break;
  492. case ISDN_STAT_CINF:
  493. /* Charge-info from TelCo. Calculate interval between
  494.  * charge-infos and set timestamp for last info for
  495.  * usage by isdn_net_autohup()
  496.  */
  497. lp->charge++;
  498. if (lp->hupflags & ISDN_HAVECHARGE) {
  499. lp->hupflags &= ~ISDN_WAITCHARGE;
  500. lp->chargeint = jiffies - lp->chargetime - (2 * HZ);
  501. }
  502. if (lp->hupflags & ISDN_WAITCHARGE)
  503. lp->hupflags |= ISDN_HAVECHARGE;
  504. lp->chargetime = jiffies;
  505. printk(KERN_DEBUG "isdn_net: Got CINF chargetime of %s now %lun",
  506.        lp->name, lp->chargetime);
  507. return 1;
  508. }
  509. }
  510. return 0;
  511. }
  512. /*
  513.  * Perform dialout for net-interfaces and timeout-handling for
  514.  * D-Channel-up and B-Channel-up Messages.
  515.  * This function is initially called from within isdn_net_start_xmit() or
  516.  * or isdn_net_find_icall() after initializing the dialstate for an
  517.  * interface. If further calls are needed, the function schedules itself
  518.  * for a timer-callback via isdn_timer_function().
  519.  * The dialstate is also affected by incoming status-messages from
  520.  * the ISDN-Channel which are handled in isdn_net_stat_callback() above.
  521.  */
  522. void
  523. isdn_net_dial(void)
  524. {
  525. isdn_net_dev *p = dev->netdev;
  526. int anymore = 0;
  527. int i;
  528. unsigned long flags;
  529. isdn_ctrl cmd;
  530.         u_char *phone_number;
  531. while (p) {
  532. isdn_net_local *lp = p->local;
  533. #ifdef ISDN_DEBUG_NET_DIAL
  534. if (lp->dialstate)
  535. printk(KERN_DEBUG "%s: dialstate=%dn", lp->name, lp->dialstate);
  536. #endif
  537. switch (lp->dialstate) {
  538. case 0:
  539. /* Nothing to do for this interface */
  540. break;
  541. case 1:
  542. /* Initiate dialout. Set phone-number-pointer to first number
  543.  * of interface.
  544.  */
  545. save_flags(flags);
  546. cli();
  547. lp->dial = lp->phone[1];
  548. restore_flags(flags);
  549. if (!lp->dial) {
  550. printk(KERN_WARNING "%s: phone number deleted?n",
  551.        lp->name);
  552. isdn_net_hangup(&p->dev);
  553. break;
  554. }
  555. anymore = 1;
  556. if(lp->dialtimeout > 0)
  557. if(lp->dialstarted == 0 || time_after(jiffies, lp->dialstarted + lp->dialtimeout + lp->dialwait)) {
  558. lp->dialstarted = jiffies;
  559. lp->dialwait_timer = 0;
  560. }
  561. lp->dialstate++;
  562. /* Fall through */
  563. case 2:
  564. /* Prepare dialing. Clear EAZ, then set EAZ. */
  565. cmd.driver = lp->isdn_device;
  566. cmd.arg = lp->isdn_channel;
  567. cmd.command = ISDN_CMD_CLREAZ;
  568. isdn_command(&cmd);
  569. sprintf(cmd.parm.num, "%s", isdn_map_eaz2msn(lp->msn, cmd.driver));
  570. cmd.command = ISDN_CMD_SETEAZ;
  571. isdn_command(&cmd);
  572. lp->dialretry = 0;
  573. anymore = 1;
  574. lp->dialstate++;
  575. /* Fall through */
  576. case 3:
  577. /* Setup interface, dial current phone-number, switch to next number.
  578.  * If list of phone-numbers is exhausted, increment
  579.  * retry-counter.
  580.  */
  581. if(dev->global_flags & ISDN_GLOBAL_STOPPED || (ISDN_NET_DIALMODE(*lp) == ISDN_NET_DM_OFF)) {
  582. char *s;
  583. if (dev->global_flags & ISDN_GLOBAL_STOPPED)
  584. s = "dial suppressed: isdn system stopped";
  585. else
  586. s = "dial suppressed: dialmode `off'";
  587. isdn_net_unreachable(&p->dev, 0, s);
  588. isdn_net_hangup(&p->dev);
  589. break;
  590. }
  591. cmd.driver = lp->isdn_device;
  592. cmd.command = ISDN_CMD_SETL2;
  593. cmd.arg = lp->isdn_channel + (lp->l2_proto << 8);
  594. isdn_command(&cmd);
  595. cmd.driver = lp->isdn_device;
  596. cmd.command = ISDN_CMD_SETL3;
  597. cmd.arg = lp->isdn_channel + (lp->l3_proto << 8);
  598. isdn_command(&cmd);
  599. cmd.driver = lp->isdn_device;
  600. cmd.arg = lp->isdn_channel;
  601. save_flags(flags);
  602. cli();
  603. if (!lp->dial) {
  604. restore_flags(flags);
  605. printk(KERN_WARNING "%s: phone number deleted?n",
  606.        lp->name);
  607. isdn_net_hangup(&p->dev);
  608. break;
  609. }
  610. if (!strncmp(lp->dial->num, "LEASED", strlen("LEASED"))) {
  611. restore_flags(flags);
  612. lp->dialstate = 4;
  613. printk(KERN_INFO "%s: Open leased line ...n", lp->name);
  614. } else {
  615. if(lp->dialtimeout > 0)
  616. if (time_after(jiffies, lp->dialstarted + lp->dialtimeout)) {
  617. restore_flags(flags);
  618. lp->dialwait_timer = jiffies + lp->dialwait;
  619. lp->dialstarted = 0;
  620. isdn_net_unreachable(&p->dev, 0, "dial: timed out");
  621. isdn_net_hangup(&p->dev);
  622. break;
  623. }
  624. cmd.driver = lp->isdn_device;
  625. cmd.command = ISDN_CMD_DIAL;
  626. cmd.parm.setup.si2 = 0;
  627.                                         /* check for DOV */
  628.                                         phone_number = lp->dial->num;
  629.                                         if ((*phone_number == 'v') ||
  630.     (*phone_number == 'V')) { /* DOV call */
  631.                                                 cmd.parm.setup.si1 = 1;
  632.                                         } else { /* DATA call */
  633.                                                 cmd.parm.setup.si1 = 7;
  634. }
  635. strcpy(cmd.parm.setup.phone, phone_number);
  636. /*
  637.  * Switch to next number or back to start if at end of list.
  638.  */
  639. if (!(lp->dial = (isdn_net_phone *) lp->dial->next)) {
  640. lp->dial = lp->phone[1];
  641. lp->dialretry++;
  642. if (lp->dialretry > lp->dialmax) {
  643. restore_flags(flags);
  644. if (lp->dialtimeout == 0) {
  645. lp->dialwait_timer = jiffies + lp->dialwait;
  646. lp->dialstarted = 0;
  647. isdn_net_unreachable(&p->dev, 0, "dial: tried all numbers dialmax times");
  648. }
  649. isdn_net_hangup(&p->dev);
  650. break;
  651. }
  652. }
  653. restore_flags(flags);
  654. sprintf(cmd.parm.setup.eazmsn, "%s",
  655. isdn_map_eaz2msn(lp->msn, cmd.driver));
  656. i = isdn_dc2minor(lp->isdn_device, lp->isdn_channel);
  657. if (i >= 0) {
  658. strcpy(dev->num[i], cmd.parm.setup.phone);
  659. dev->usage[i] |= ISDN_USAGE_OUTGOING;
  660. isdn_info_update();
  661. }
  662. printk(KERN_INFO "%s: dialing %d %s... %sn", lp->name,
  663.        lp->dialretry, cmd.parm.setup.phone,
  664.        (cmd.parm.setup.si1 == 1) ? "DOV" : "");
  665. lp->dtimer = 0;
  666. #ifdef ISDN_DEBUG_NET_DIAL
  667. printk(KERN_DEBUG "dial: d=%d c=%dn", lp->isdn_device,
  668.        lp->isdn_channel);
  669. #endif
  670. isdn_command(&cmd);
  671. }
  672. lp->huptimer = 0;
  673. lp->outgoing = 1;
  674. if (lp->chargeint) {
  675. lp->hupflags |= ISDN_HAVECHARGE;
  676. lp->hupflags &= ~ISDN_WAITCHARGE;
  677. } else {
  678. lp->hupflags |= ISDN_WAITCHARGE;
  679. lp->hupflags &= ~ISDN_HAVECHARGE;
  680. }
  681. anymore = 1;
  682. lp->dialstate =
  683.     (lp->cbdelay &&
  684.      (lp->flags & ISDN_NET_CBOUT)) ? 12 : 4;
  685. break;
  686. case 4:
  687. /* Wait for D-Channel-connect.
  688.  * If timeout, switch back to state 3.
  689.  * Dialmax-handling moved to state 3.
  690.  */
  691. if (lp->dtimer++ > ISDN_TIMER_DTIMEOUT10)
  692. lp->dialstate = 3;
  693. anymore = 1;
  694. break;
  695. case 5:
  696. /* Got D-Channel-Connect, send B-Channel-request */
  697. cmd.driver = lp->isdn_device;
  698. cmd.arg = lp->isdn_channel;
  699. cmd.command = ISDN_CMD_ACCEPTB;
  700. anymore = 1;
  701. lp->dtimer = 0;
  702. lp->dialstate++;
  703. isdn_command(&cmd);
  704. break;
  705. case 6:
  706. /* Wait for B- or D-Channel-connect. If timeout,
  707.  * switch back to state 3.
  708.  */
  709. #ifdef ISDN_DEBUG_NET_DIAL
  710. printk(KERN_DEBUG "dialtimer2: %dn", lp->dtimer);
  711. #endif
  712. if (lp->dtimer++ > ISDN_TIMER_DTIMEOUT10)
  713. lp->dialstate = 3;
  714. anymore = 1;
  715. break;
  716. case 7:
  717. /* Got incoming Call, setup L2 and L3 protocols,
  718.  * then wait for D-Channel-connect
  719.  */
  720. #ifdef ISDN_DEBUG_NET_DIAL
  721. printk(KERN_DEBUG "dialtimer4: %dn", lp->dtimer);
  722. #endif
  723. cmd.driver = lp->isdn_device;
  724. cmd.command = ISDN_CMD_SETL2;
  725. cmd.arg = lp->isdn_channel + (lp->l2_proto << 8);
  726. isdn_command(&cmd);
  727. cmd.driver = lp->isdn_device;
  728. cmd.command = ISDN_CMD_SETL3;
  729. cmd.arg = lp->isdn_channel + (lp->l3_proto << 8);
  730. isdn_command(&cmd);
  731. if (lp->dtimer++ > ISDN_TIMER_DTIMEOUT15)
  732. isdn_net_hangup(&p->dev);
  733. else {
  734. anymore = 1;
  735. lp->dialstate++;
  736. }
  737. break;
  738. case 9:
  739. /* Got incoming D-Channel-Connect, send B-Channel-request */
  740. cmd.driver = lp->isdn_device;
  741. cmd.arg = lp->isdn_channel;
  742. cmd.command = ISDN_CMD_ACCEPTB;
  743. isdn_command(&cmd);
  744. anymore = 1;
  745. lp->dtimer = 0;
  746. lp->dialstate++;
  747. break;
  748. case 8:
  749. case 10:
  750. /*  Wait for B- or D-channel-connect */
  751. #ifdef ISDN_DEBUG_NET_DIAL
  752. printk(KERN_DEBUG "dialtimer4: %dn", lp->dtimer);
  753. #endif
  754. if (lp->dtimer++ > ISDN_TIMER_DTIMEOUT10)
  755. isdn_net_hangup(&p->dev);
  756. else
  757. anymore = 1;
  758. break;
  759. case 11:
  760. /* Callback Delay */
  761. if (lp->dtimer++ > lp->cbdelay)
  762. lp->dialstate = 1;
  763. anymore = 1;
  764. break;
  765. case 12:
  766. /* Remote does callback. Hangup after cbdelay, then wait for incoming
  767.  * call (in state 4).
  768.  */
  769. if (lp->dtimer++ > lp->cbdelay)
  770. {
  771. printk(KERN_INFO "%s: hangup waiting for callback ...n", lp->name);
  772. lp->dtimer = 0;
  773. lp->dialstate = 4;
  774. cmd.driver = lp->isdn_device;
  775. cmd.command = ISDN_CMD_HANGUP;
  776. cmd.arg = lp->isdn_channel;
  777. isdn_command(&cmd);
  778. isdn_all_eaz(lp->isdn_device, lp->isdn_channel);
  779. }
  780. anymore = 1;
  781. break;
  782. default:
  783. printk(KERN_WARNING "isdn_net: Illegal dialstate %d for device %sn",
  784.        lp->dialstate, lp->name);
  785. }
  786. p = (isdn_net_dev *) p->next;
  787. }
  788. isdn_timer_ctrl(ISDN_TIMER_NETDIAL, anymore);
  789. }
  790. /*
  791.  * Perform hangup for a net-interface.
  792.  */
  793. void
  794. isdn_net_hangup(struct net_device *d)
  795. {
  796. isdn_net_local *lp = (isdn_net_local *) d->priv;
  797. isdn_ctrl cmd;
  798. #ifdef CONFIG_ISDN_X25
  799. struct concap_proto *cprot = lp -> netdev -> cprot;
  800. struct concap_proto_ops *pops = cprot ? cprot -> pops : 0;
  801. #endif
  802. if (lp->flags & ISDN_NET_CONNECTED) {
  803. if (lp->slave != NULL) {
  804. isdn_net_local *slp = (isdn_net_local *)lp->slave->priv;
  805. if (slp->flags & ISDN_NET_CONNECTED) {
  806. printk(KERN_INFO
  807. "isdn_net: hang up slave %s before %sn",
  808. slp->name, lp->name);
  809. isdn_net_hangup(lp->slave);
  810. }
  811. }
  812. printk(KERN_INFO "isdn_net: local hangup %sn", lp->name);
  813. #ifdef CONFIG_ISDN_PPP
  814. if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP)
  815. isdn_ppp_free(lp);
  816. #endif
  817. isdn_net_lp_disconnected(lp);
  818. #ifdef CONFIG_ISDN_X25
  819. /* try if there are generic encap protocol
  820.    receiver routines and signal the closure of
  821.    the link */
  822. if( pops && pops -> disconn_ind )
  823.   pops -> disconn_ind(cprot);
  824. #endif /* CONFIG_ISDN_X25 */
  825. cmd.driver = lp->isdn_device;
  826. cmd.command = ISDN_CMD_HANGUP;
  827. cmd.arg = lp->isdn_channel;
  828. isdn_command(&cmd);
  829. printk(KERN_INFO "%s: Chargesum is %dn", lp->name, lp->charge);
  830. isdn_all_eaz(lp->isdn_device, lp->isdn_channel);
  831. }
  832. isdn_net_unbind_channel(lp);
  833. }
  834. typedef struct {
  835. unsigned short source;
  836. unsigned short dest;
  837. } ip_ports;
  838. static void
  839. isdn_net_log_skb(struct sk_buff * skb, isdn_net_local * lp)
  840. {
  841. u_char *p = skb->nh.raw; /* hopefully, this was set correctly */
  842. unsigned short proto = ntohs(skb->protocol);
  843. int data_ofs;
  844. ip_ports *ipp;
  845. char addinfo[100];
  846. addinfo[0] = '';
  847. /* This check stolen from 2.1.72 dev_queue_xmit_nit() */
  848. if (skb->nh.raw < skb->data || skb->nh.raw >= skb->tail) {
  849. /* fall back to old isdn_net_log_packet method() */
  850. char * buf = skb->data;
  851. printk(KERN_DEBUG "isdn_net: protocol %04x is buggy, dev %sn", skb->protocol, lp->name);
  852. p = buf;
  853. proto = ETH_P_IP;
  854. switch (lp->p_encap) {
  855. case ISDN_NET_ENCAP_IPTYP:
  856. proto = ntohs(*(unsigned short *) &buf[0]);
  857. p = &buf[2];
  858. break;
  859. case ISDN_NET_ENCAP_ETHER:
  860. proto = ntohs(*(unsigned short *) &buf[12]);
  861. p = &buf[14];
  862. break;
  863. case ISDN_NET_ENCAP_CISCOHDLC:
  864. proto = ntohs(*(unsigned short *) &buf[2]);
  865. p = &buf[4];
  866. break;
  867. #ifdef CONFIG_ISDN_PPP
  868. case ISDN_NET_ENCAP_SYNCPPP:
  869. proto = ntohs(skb->protocol);
  870. p = &buf[IPPP_MAX_HEADER];
  871. break;
  872. #endif
  873. }
  874. }
  875. data_ofs = ((p[0] & 15) * 4);
  876. switch (proto) {
  877. case ETH_P_IP:
  878. switch (p[9]) {
  879. case 1:
  880. strcpy(addinfo, " ICMP");
  881. break;
  882. case 2:
  883. strcpy(addinfo, " IGMP");
  884. break;
  885. case 4:
  886. strcpy(addinfo, " IPIP");
  887. break;
  888. case 6:
  889. ipp = (ip_ports *) (&p[data_ofs]);
  890. sprintf(addinfo, " TCP, port: %d -> %d", ntohs(ipp->source),
  891. ntohs(ipp->dest));
  892. break;
  893. case 8:
  894. strcpy(addinfo, " EGP");
  895. break;
  896. case 12:
  897. strcpy(addinfo, " PUP");
  898. break;
  899. case 17:
  900. ipp = (ip_ports *) (&p[data_ofs]);
  901. sprintf(addinfo, " UDP, port: %d -> %d", ntohs(ipp->source),
  902. ntohs(ipp->dest));
  903. break;
  904. case 22:
  905. strcpy(addinfo, " IDP");
  906. break;
  907. }
  908. printk(KERN_INFO
  909. "OPEN: %d.%d.%d.%d -> %d.%d.%d.%d%sn",
  910.        p[12], p[13], p[14], p[15],
  911.        p[16], p[17], p[18], p[19],
  912.        addinfo);
  913. break;
  914. case ETH_P_ARP:
  915. printk(KERN_INFO
  916. "OPEN: ARP %d.%d.%d.%d -> *.*.*.* ?%d.%d.%d.%dn",
  917.        p[14], p[15], p[16], p[17],
  918.        p[24], p[25], p[26], p[27]);
  919. break;
  920. }
  921. }
  922. /*
  923.  * this function is used to send supervisory data, i.e. data which was
  924.  * not received from the network layer, but e.g. frames from ipppd, CCP
  925.  * reset frames etc.
  926.  */
  927. void isdn_net_write_super(isdn_net_local *lp, struct sk_buff *skb)
  928. {
  929. if (in_irq()) {
  930. // we can't grab the lock from irq context, 
  931. // so we just queue the packet
  932. skb_queue_tail(&lp->super_tx_queue, skb); 
  933. queue_task(&lp->tqueue, &tq_immediate);
  934. mark_bh(IMMEDIATE_BH);
  935. return;
  936. }
  937. spin_lock_bh(&lp->xmit_lock);
  938. if (!isdn_net_lp_busy(lp)) {
  939. isdn_net_writebuf_skb(lp, skb);
  940. } else {
  941. skb_queue_tail(&lp->super_tx_queue, skb);
  942. }
  943. spin_unlock_bh(&lp->xmit_lock);
  944. }
  945. /*
  946.  * called from tq_immediate
  947.  */
  948. static void isdn_net_softint(void *private)
  949. {
  950. isdn_net_local *lp = private;
  951. struct sk_buff *skb;
  952. spin_lock_bh(&lp->xmit_lock);
  953. while (!isdn_net_lp_busy(lp)) {
  954. skb = skb_dequeue(&lp->super_tx_queue);
  955. if (!skb)
  956. break;
  957. isdn_net_writebuf_skb(lp, skb);                                
  958. }
  959. spin_unlock_bh(&lp->xmit_lock);
  960. }
  961. /* 
  962.  * all frames sent from the (net) LL to a HL driver should go via this function
  963.  * it's serialized by the caller holding the lp->xmit_lock spinlock
  964.  */
  965. void isdn_net_writebuf_skb(isdn_net_local *lp, struct sk_buff *skb)
  966. {
  967. int ret;
  968. int len = skb->len;     /* save len */
  969. /* before obtaining the lock the caller should have checked that
  970.    the lp isn't busy */
  971. if (isdn_net_lp_busy(lp)) {
  972. printk("isdn BUG at %s:%d!n", __FILE__, __LINE__);
  973. goto error;
  974. }
  975. if (!(lp->flags & ISDN_NET_CONNECTED)) {
  976. printk("isdn BUG at %s:%d!n", __FILE__, __LINE__);
  977. goto error;
  978. }
  979. ret = isdn_writebuf_skb_stub(lp->isdn_device, lp->isdn_channel, 1, skb);
  980. if (ret != len) {
  981. /* we should never get here */
  982. printk(KERN_WARNING "%s: HL driver queue fulln", lp->name);
  983. goto error;
  984. }
  985. lp->transcount += len;
  986. isdn_net_inc_frame_cnt(lp);
  987. return;
  988.  error:
  989. dev_kfree_skb(skb);
  990. lp->stats.tx_errors++;
  991. }
  992. /*
  993.  *  Helper function for isdn_net_start_xmit.
  994.  *  When called, the connection is already established.
  995.  *  Based on cps-calculation, check if device is overloaded.
  996.  *  If so, and if a slave exists, trigger dialing for it.
  997.  *  If any slave is online, deliver packets using a simple round robin
  998.  *  scheme.
  999.  *
  1000.  *  Return: 0 on success, !0 on failure.
  1001.  */
  1002. static int
  1003. isdn_net_xmit(struct net_device *ndev, struct sk_buff *skb)
  1004. {
  1005. isdn_net_dev *nd;
  1006. isdn_net_local *slp;
  1007. isdn_net_local *lp = (isdn_net_local *) ndev->priv;
  1008. int retv = 0;
  1009. if (((isdn_net_local *) (ndev->priv))->master) {
  1010. printk("isdn BUG at %s:%d!n", __FILE__, __LINE__);
  1011. dev_kfree_skb(skb);
  1012. return 0;
  1013. }
  1014. /* For the other encaps the header has already been built */
  1015. #ifdef CONFIG_ISDN_PPP
  1016. if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP) {
  1017. return isdn_ppp_xmit(skb, ndev);
  1018. }
  1019. #endif
  1020. nd = ((isdn_net_local *) ndev->priv)->netdev;
  1021. lp = isdn_net_get_locked_lp(nd);
  1022. if (!lp) {
  1023. printk(KERN_WARNING "%s: all channels busy - requeuing!n", ndev->name);
  1024. return 1;
  1025. }
  1026. /* we have our lp locked from now on */
  1027. /* Reset hangup-timeout */
  1028. lp->huptimer = 0; // FIXME?
  1029. isdn_net_writebuf_skb(lp, skb);
  1030. spin_unlock_bh(&lp->xmit_lock);
  1031. /* the following stuff is here for backwards compatibility.
  1032.  * in future, start-up and hangup of slaves (based on current load)
  1033.  * should move to userspace and get based on an overall cps
  1034.  * calculation
  1035.  */
  1036. if (lp->cps > lp->triggercps) {
  1037. if (lp->slave) {
  1038. if (!lp->sqfull) {
  1039. /* First time overload: set timestamp only */
  1040. lp->sqfull = 1;
  1041. lp->sqfull_stamp = jiffies;
  1042. } else {
  1043. /* subsequent overload: if slavedelay exceeded, start dialing */
  1044. if (time_after(jiffies, lp->sqfull_stamp + lp->slavedelay)) {
  1045. slp = lp->slave->priv;
  1046. if (!(slp->flags & ISDN_NET_CONNECTED)) {
  1047. isdn_net_force_dial_lp((isdn_net_local *) lp->slave->priv);
  1048. }
  1049. }
  1050. }
  1051. }
  1052. } else {
  1053. if (lp->sqfull && time_after(jiffies, lp->sqfull_stamp + lp->slavedelay + (10 * HZ))) {
  1054. lp->sqfull = 0;
  1055. }
  1056. /* this is a hack to allow auto-hangup for slaves on moderate loads */
  1057. nd->queue = nd->local;
  1058. }
  1059. return retv;
  1060. }
  1061. static void
  1062. isdn_net_adjust_hdr(struct sk_buff *skb, struct net_device *dev)
  1063. {
  1064. isdn_net_local *lp = (isdn_net_local *) dev->priv;
  1065. if (!skb)
  1066. return;
  1067. if (lp->p_encap == ISDN_NET_ENCAP_ETHER) {
  1068. int pullsize = (ulong)skb->nh.raw - (ulong)skb->data - ETH_HLEN;
  1069. if (pullsize > 0) {
  1070. printk(KERN_DEBUG "isdn_net: Pull junk %dn", pullsize);
  1071. skb_pull(skb, pullsize);
  1072. }
  1073. }
  1074. }
  1075. void isdn_net_tx_timeout(struct net_device * ndev)
  1076. {
  1077. isdn_net_local *lp = (isdn_net_local *) ndev->priv;
  1078. printk(KERN_WARNING "isdn_tx_timeout dev %s dialstate %dn", ndev->name, lp->dialstate);
  1079. if (!lp->dialstate){
  1080. lp->stats.tx_errors++;
  1081.                 /*
  1082.  * There is a certain probability that this currently
  1083.  * works at all because if we always wake up the interface,
  1084.  * then upper layer will try to send the next packet
  1085.  * immediately. And then, the old clean_up logic in the
  1086.  * driver will hopefully continue to work as it used to do.
  1087.  *
  1088.  * This is rather primitive right know, we better should
  1089.  * clean internal queues here, in particular for multilink and
  1090.  * ppp, and reset HL driver's channel, too.   --HE
  1091.  *
  1092.  * actually, this may not matter at all, because ISDN hardware
  1093.  * should not see transmitter hangs at all IMO
  1094.  * changed KERN_DEBUG to KERN_WARNING to find out if this is 
  1095.  * ever called   --KG
  1096.  */
  1097. }
  1098. ndev->trans_start = jiffies;
  1099. netif_wake_queue(ndev);
  1100. }
  1101. /*
  1102.  * Try sending a packet.
  1103.  * If this interface isn't connected to a ISDN-Channel, find a free channel,
  1104.  * and start dialing.
  1105.  */
  1106. static int
  1107. isdn_net_start_xmit(struct sk_buff *skb, struct net_device *ndev)
  1108. {
  1109. isdn_net_local *lp = (isdn_net_local *) ndev->priv;
  1110. #ifdef CONFIG_ISDN_X25
  1111. struct concap_proto * cprot = lp -> netdev -> cprot;
  1112. #endif
  1113. #ifdef CONFIG_ISDN_X25
  1114. /* At this point hard_start_xmit() passes control to the encapsulation
  1115.    protocol (if present).
  1116.    For X.25 auto-dialing is completly bypassed because:
  1117.    - It does not conform with the semantics of a reliable datalink
  1118.      service as needed by X.25 PLP.
  1119.    - I don't want that the interface starts dialing when the network layer
  1120.      sends a message which requests to disconnect the lapb link (or if it
  1121.      sends any other message not resulting in data transmission).
  1122.    Instead, dialing will be initiated by the encapsulation protocol entity
  1123.    when a dl_establish request is received from the upper layer.
  1124. */
  1125. if( cprot ) {
  1126. int ret = cprot -> pops -> encap_and_xmit ( cprot , skb);
  1127. if(ret) netif_stop_queue(ndev);
  1128. return ret;
  1129. } else
  1130. #endif
  1131. /* auto-dialing xmit function */
  1132. {
  1133. #ifdef ISDN_DEBUG_NET_DUMP
  1134. u_char *buf;
  1135. #endif
  1136. isdn_net_adjust_hdr(skb, ndev);
  1137. #ifdef ISDN_DEBUG_NET_DUMP
  1138. buf = skb->data;
  1139. isdn_dumppkt("S:", buf, skb->len, 40);
  1140. #endif
  1141. if (!(lp->flags & ISDN_NET_CONNECTED)) {
  1142. int chi;
  1143. /* only do autodial if allowed by config */
  1144. if (!(ISDN_NET_DIALMODE(*lp) == ISDN_NET_DM_AUTO)) {
  1145. isdn_net_unreachable(ndev, skb, "dial rejected: interface not in dialmode `auto'");
  1146. dev_kfree_skb(skb);
  1147. return 0;
  1148. }
  1149. if (lp->phone[1]) {
  1150. ulong flags;
  1151. save_flags(flags);
  1152. cli();
  1153. if(lp->dialwait_timer <= 0)
  1154. if(lp->dialstarted > 0 && lp->dialtimeout > 0 && time_before(jiffies, lp->dialstarted + lp->dialtimeout + lp->dialwait))
  1155. lp->dialwait_timer = lp->dialstarted + lp->dialtimeout + lp->dialwait;
  1156. if(lp->dialwait_timer > 0) {
  1157. if(time_before(jiffies, lp->dialwait_timer)) {
  1158. isdn_net_unreachable(ndev, skb, "dial rejected: retry-time not reached");
  1159. dev_kfree_skb(skb);
  1160. restore_flags(flags);
  1161. return 0;
  1162. } else
  1163. lp->dialwait_timer = 0;
  1164. }
  1165. /* Grab a free ISDN-Channel */
  1166. if (((chi =
  1167.      isdn_get_free_channel(
  1168.   ISDN_USAGE_NET,
  1169. lp->l2_proto,
  1170. lp->l3_proto,
  1171. lp->pre_device,
  1172.   lp->pre_channel,
  1173. lp->msn)
  1174. ) < 0) &&
  1175. ((chi =
  1176.      isdn_get_free_channel(
  1177.   ISDN_USAGE_NET,
  1178. lp->l2_proto,
  1179. lp->l3_proto,
  1180. lp->pre_device,
  1181. lp->pre_channel^1,
  1182. lp->msn)
  1183. ) < 0)) {
  1184. restore_flags(flags);
  1185. isdn_net_unreachable(ndev, skb,
  1186.    "No channel");
  1187. dev_kfree_skb(skb);
  1188. return 0;
  1189. }
  1190. /* Log packet, which triggered dialing */
  1191. if (dev->net_verbose)
  1192. isdn_net_log_skb(skb, lp);
  1193. lp->dialstate = 1;
  1194. /* Connect interface with channel */
  1195. isdn_net_bind_channel(lp, chi);
  1196. #ifdef CONFIG_ISDN_PPP
  1197. if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP) {
  1198. /* no 'first_skb' handling for syncPPP */
  1199. if (isdn_ppp_bind(lp) < 0) {
  1200. dev_kfree_skb(skb);
  1201. isdn_net_unbind_channel(lp);
  1202. restore_flags(flags);
  1203. return 0; /* STN (skb to nirvana) ;) */
  1204. }
  1205. restore_flags(flags);
  1206. isdn_net_dial(); /* Initiate dialing */
  1207. netif_stop_queue(ndev);
  1208. return 1; /* let upper layer requeue skb packet */
  1209. }
  1210. #endif
  1211. /* Initiate dialing */
  1212. restore_flags(flags);
  1213. isdn_net_dial();
  1214. isdn_net_device_stop_queue(lp);
  1215. return 1;
  1216. } else {
  1217. isdn_net_unreachable(ndev, skb,
  1218.      "No phone number");
  1219. dev_kfree_skb(skb);
  1220. return 0;
  1221. }
  1222. } else {
  1223. /* Device is connected to an ISDN channel */ 
  1224. ndev->trans_start = jiffies;
  1225. if (!lp->dialstate) {
  1226. /* ISDN connection is established, try sending */
  1227. int ret;
  1228. ret = (isdn_net_xmit(ndev, skb));
  1229. if(ret) netif_stop_queue(ndev);
  1230. return ret;
  1231. } else
  1232. netif_stop_queue(ndev);
  1233. }
  1234. }
  1235. return 1;
  1236. }
  1237. /*
  1238.  * Shutdown a net-interface.
  1239.  */
  1240. static int
  1241. isdn_net_close(struct net_device *dev)
  1242. {
  1243. struct net_device *p;
  1244. #ifdef CONFIG_ISDN_X25
  1245. struct concap_proto * cprot =
  1246. ( (isdn_net_local *) dev->priv ) -> netdev -> cprot;
  1247. /* printk(KERN_DEBUG "isdn_net_close %sn" , dev-> name ); */
  1248. #endif
  1249. #ifdef CONFIG_ISDN_X25
  1250. if( cprot && cprot -> pops ) cprot -> pops -> close( cprot );
  1251. #endif
  1252. netif_stop_queue(dev);
  1253. if ((p = (((isdn_net_local *) dev->priv)->slave))) {
  1254. /* If this interface has slaves, stop them also */
  1255. while (p) {
  1256. #ifdef CONFIG_ISDN_X25
  1257. cprot = ( (isdn_net_local *) p->priv )
  1258. -> netdev -> cprot;
  1259. if( cprot && cprot -> pops )
  1260. cprot -> pops -> close( cprot );
  1261. #endif
  1262. isdn_net_hangup(p);
  1263. p = (((isdn_net_local *) p->priv)->slave);
  1264. }
  1265. }
  1266. isdn_net_hangup(dev);
  1267. isdn_MOD_DEC_USE_COUNT();
  1268. return 0;
  1269. }
  1270. /*
  1271.  * Get statistics
  1272.  */
  1273. static struct net_device_stats *
  1274. isdn_net_get_stats(struct net_device *dev)
  1275. {
  1276. isdn_net_local *lp = (isdn_net_local *) dev->priv;
  1277. return &lp->stats;
  1278. }
  1279. /*      This is simply a copy from std. eth.c EXCEPT we pull ETH_HLEN
  1280.  *      instead of dev->hard_header_len off. This is done because the
  1281.  *      lowlevel-driver has already pulled off its stuff when we get
  1282.  *      here and this routine only gets called with p_encap == ETHER.
  1283.  *      Determine the packet's protocol ID. The rule here is that we
  1284.  *      assume 802.3 if the type field is short enough to be a length.
  1285.  *      This is normal practice and works for any 'now in use' protocol.
  1286.  */
  1287. static unsigned short
  1288. isdn_net_type_trans(struct sk_buff *skb, struct net_device *dev)
  1289. {
  1290. struct ethhdr *eth;
  1291. unsigned char *rawp;
  1292. skb->mac.raw = skb->data;
  1293. skb_pull(skb, ETH_HLEN);
  1294. eth = skb->mac.ethernet;
  1295. if (*eth->h_dest & 1) {
  1296. if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0)
  1297. skb->pkt_type = PACKET_BROADCAST;
  1298. else
  1299. skb->pkt_type = PACKET_MULTICAST;
  1300. }
  1301. /*
  1302.  *      This ALLMULTI check should be redundant by 1.4
  1303.  *      so don't forget to remove it.
  1304.  */
  1305. else if (dev->flags & (IFF_PROMISC /*| IFF_ALLMULTI*/)) {
  1306. if (memcmp(eth->h_dest, dev->dev_addr, ETH_ALEN))
  1307. skb->pkt_type = PACKET_OTHERHOST;
  1308. }
  1309. if (ntohs(eth->h_proto) >= 1536)
  1310. return eth->h_proto;
  1311. rawp = skb->data;
  1312. /*
  1313.  *      This is a magic hack to spot IPX packets. Older Novell breaks
  1314.  *      the protocol design and runs IPX over 802.3 without an 802.2 LLC
  1315.  *      layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This
  1316.  *      won't work for fault tolerant netware but does for the rest.
  1317.  */
  1318. if (*(unsigned short *) rawp == 0xFFFF)
  1319. return htons(ETH_P_802_3);
  1320. /*
  1321.  *      Real 802.2 LLC
  1322.  */
  1323. return htons(ETH_P_802_2);
  1324. }
  1325. /* 
  1326.  * CISCO HDLC keepalive specific stuff
  1327.  */
  1328. static struct sk_buff*
  1329. isdn_net_ciscohdlck_alloc_skb(isdn_net_local *lp, int len)
  1330. {
  1331. unsigned short hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
  1332. struct sk_buff *skb;
  1333. skb = alloc_skb(hl + len, GFP_ATOMIC);
  1334. if (!skb) {
  1335. printk("isdn out of mem at %s:%d!n", __FILE__, __LINE__);
  1336. return 0;
  1337. }
  1338. skb_reserve(skb, hl);
  1339. return skb;
  1340. }
  1341. /* cisco hdlck device private ioctls */
  1342. int
  1343. isdn_ciscohdlck_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
  1344. {
  1345. isdn_net_local *lp = (isdn_net_local *) dev->priv;
  1346. unsigned long len = 0;
  1347. unsigned long expires = 0;
  1348. int tmp = 0;
  1349. int period = lp->cisco_keepalive_period;
  1350. char debserint = lp->cisco_debserint;
  1351. int rc = 0;
  1352. if (lp->p_encap != ISDN_NET_ENCAP_CISCOHDLCK)
  1353. return -EINVAL;
  1354. switch (cmd) {
  1355. /* get/set keepalive period */
  1356. case SIOCGKEEPPERIOD:
  1357. len = (unsigned long)sizeof(lp->cisco_keepalive_period);
  1358. if (copy_to_user((char *)ifr->ifr_ifru.ifru_data,
  1359. (int *)&lp->cisco_keepalive_period, len))
  1360. rc = -EFAULT;
  1361. break;
  1362. case SIOCSKEEPPERIOD:
  1363. tmp = lp->cisco_keepalive_period;
  1364. len = (unsigned long)sizeof(lp->cisco_keepalive_period);
  1365. if (copy_from_user((int *)&period,
  1366. (char *)ifr->ifr_ifru.ifru_data, len))
  1367. rc = -EFAULT;
  1368. if ((period > 0) && (period <= 32767))
  1369. lp->cisco_keepalive_period = period;
  1370. else
  1371. rc = -EINVAL;
  1372. if (!rc && (tmp != lp->cisco_keepalive_period)) {
  1373. expires = (unsigned long)(jiffies +
  1374. lp->cisco_keepalive_period * HZ);
  1375. mod_timer(&lp->cisco_timer, expires);
  1376. printk(KERN_INFO "%s: Keepalive period set "
  1377. "to %d seconds.n",
  1378. lp->name, lp->cisco_keepalive_period);
  1379. }
  1380. break;
  1381. /* get/set debugging */
  1382. case SIOCGDEBSERINT:
  1383. len = (unsigned long)sizeof(lp->cisco_debserint);
  1384. if (copy_to_user((char *)ifr->ifr_ifru.ifru_data,
  1385. (char *)&lp->cisco_debserint, len))
  1386. rc = -EFAULT;
  1387. break;
  1388. case SIOCSDEBSERINT:
  1389. len = (unsigned long)sizeof(lp->cisco_debserint);
  1390. if (copy_from_user((char *)&debserint,
  1391. (char *)ifr->ifr_ifru.ifru_data, len))
  1392. rc = -EFAULT;
  1393. if ((debserint >= 0) && (debserint <= 64))
  1394. lp->cisco_debserint = debserint;
  1395. else
  1396. rc = -EINVAL;
  1397. break;
  1398. default:
  1399. rc = -EINVAL;
  1400. break;
  1401. }
  1402. return (rc);
  1403. }
  1404. /* called via cisco_timer.function */
  1405. static void
  1406. isdn_net_ciscohdlck_slarp_send_keepalive(unsigned long data)
  1407. {
  1408. isdn_net_local *lp = (isdn_net_local *) data;
  1409. struct sk_buff *skb;
  1410. unsigned char *p;
  1411. unsigned long last_cisco_myseq = lp->cisco_myseq;
  1412. int myseq_diff = 0;
  1413. if (!(lp->flags & ISDN_NET_CONNECTED) || lp->dialstate) {
  1414. printk("isdn BUG at %s:%d!n", __FILE__, __LINE__);
  1415. return;
  1416. }
  1417. lp->cisco_myseq++;
  1418. myseq_diff = (lp->cisco_myseq - lp->cisco_mineseen);
  1419. if ((lp->cisco_line_state) && ((myseq_diff >= 3)||(myseq_diff <= -3))) {
  1420. /* line up -> down */
  1421. lp->cisco_line_state = 0;
  1422. printk (KERN_WARNING
  1423. "UPDOWN: Line protocol on Interface %s,"
  1424. " changed state to downn", lp->name);
  1425. /* should stop routing higher-level data accross */
  1426. } else if ((!lp->cisco_line_state) &&
  1427. (myseq_diff >= 0) && (myseq_diff <= 2)) {
  1428. /* line down -> up */
  1429. lp->cisco_line_state = 1;
  1430. printk (KERN_WARNING
  1431. "UPDOWN: Line protocol on Interface %s,"
  1432. " changed state to upn", lp->name);
  1433. /* restart routing higher-level data accross */
  1434. }
  1435. if (lp->cisco_debserint)
  1436. printk (KERN_DEBUG "%s: HDLC "
  1437. "myseq %lu, mineseen %lu%c, yourseen %lu, %sn",
  1438. lp->name, last_cisco_myseq, lp->cisco_mineseen,
  1439. ((last_cisco_myseq == lp->cisco_mineseen) ? '*' : 040),
  1440. lp->cisco_yourseq,
  1441. ((lp->cisco_line_state) ? "line up" : "line down"));
  1442. skb = isdn_net_ciscohdlck_alloc_skb(lp, 4 + 14);
  1443. if (!skb)
  1444. return;
  1445. p = skb_put(skb, 4 + 14);
  1446. /* cisco header */
  1447. p += put_u8 (p, CISCO_ADDR_UNICAST);
  1448. p += put_u8 (p, CISCO_CTRL);
  1449. p += put_u16(p, CISCO_TYPE_SLARP);
  1450. /* slarp keepalive */
  1451. p += put_u32(p, CISCO_SLARP_KEEPALIVE);
  1452. p += put_u32(p, lp->cisco_myseq);
  1453. p += put_u32(p, lp->cisco_yourseq);
  1454. p += put_u16(p, 0xffff); // reliablity, always 0xffff
  1455. isdn_net_write_super(lp, skb);
  1456. lp->cisco_timer.expires = jiffies + lp->cisco_keepalive_period * HZ;
  1457. add_timer(&lp->cisco_timer);
  1458. }
  1459. static void
  1460. isdn_net_ciscohdlck_slarp_send_request(isdn_net_local *lp)
  1461. {
  1462. struct sk_buff *skb;
  1463. unsigned char *p;
  1464. skb = isdn_net_ciscohdlck_alloc_skb(lp, 4 + 14);
  1465. if (!skb)
  1466. return;
  1467. p = skb_put(skb, 4 + 14);
  1468. /* cisco header */
  1469. p += put_u8 (p, CISCO_ADDR_UNICAST);
  1470. p += put_u8 (p, CISCO_CTRL);
  1471. p += put_u16(p, CISCO_TYPE_SLARP);
  1472. /* slarp request */
  1473. p += put_u32(p, CISCO_SLARP_REQUEST);
  1474. p += put_u32(p, 0); // address
  1475. p += put_u32(p, 0); // netmask
  1476. p += put_u16(p, 0); // unused
  1477. isdn_net_write_super(lp, skb);
  1478. }
  1479. static void 
  1480. isdn_net_ciscohdlck_connected(isdn_net_local *lp)
  1481. {
  1482. lp->cisco_myseq = 0;
  1483. lp->cisco_mineseen = 0;
  1484. lp->cisco_yourseq = 0;
  1485. lp->cisco_keepalive_period = ISDN_TIMER_KEEPINT;
  1486. lp->cisco_last_slarp_in = 0;
  1487. lp->cisco_line_state = 0;
  1488. lp->cisco_debserint = 0;
  1489. /* send slarp request because interface/seq.no.s reset */
  1490. isdn_net_ciscohdlck_slarp_send_request(lp);
  1491. init_timer(&lp->cisco_timer);
  1492. lp->cisco_timer.data = (unsigned long) lp;
  1493. lp->cisco_timer.function = isdn_net_ciscohdlck_slarp_send_keepalive;
  1494. lp->cisco_timer.expires = jiffies + lp->cisco_keepalive_period * HZ;
  1495. add_timer(&lp->cisco_timer);
  1496. }
  1497. static void 
  1498. isdn_net_ciscohdlck_disconnected(isdn_net_local *lp)
  1499. {
  1500. del_timer(&lp->cisco_timer);
  1501. }
  1502. static void
  1503. isdn_net_ciscohdlck_slarp_send_reply(isdn_net_local *lp)
  1504. {
  1505. struct sk_buff *skb;
  1506. unsigned char *p;
  1507. struct in_device *in_dev = NULL;
  1508. u32 addr = 0; /* local ipv4 address */
  1509. u32 mask = 0; /* local netmask */
  1510. if ((in_dev = lp->netdev->dev.ip_ptr) != NULL) {
  1511. /* take primary(first) address of interface */
  1512. struct in_ifaddr *ifa = in_dev->ifa_list;
  1513. if (ifa != NULL) {
  1514. addr = ifa->ifa_local;
  1515. mask = ifa->ifa_mask;
  1516. }
  1517. }
  1518. skb = isdn_net_ciscohdlck_alloc_skb(lp, 4 + 14);
  1519. if (!skb)
  1520. return;
  1521. p = skb_put(skb, 4 + 14);
  1522. /* cisco header */
  1523. p += put_u8 (p, CISCO_ADDR_UNICAST);
  1524. p += put_u8 (p, CISCO_CTRL);
  1525. p += put_u16(p, CISCO_TYPE_SLARP);
  1526. /* slarp reply, send own ip/netmask; if values are nonsense remote
  1527.  * should think we are unable to provide it with an address via SLARP */
  1528. p += put_u32(p, CISCO_SLARP_REPLY);
  1529. p += put_u32(p, addr); // address
  1530. p += put_u32(p, mask); // netmask
  1531. p += put_u16(p, 0); // unused
  1532. isdn_net_write_super(lp, skb);
  1533. }
  1534. static void
  1535. isdn_net_ciscohdlck_slarp_in(isdn_net_local *lp, struct sk_buff *skb)
  1536. {
  1537. unsigned char *p;
  1538. int period;
  1539. u32 code;
  1540. u32 my_seq, addr;
  1541. u32 your_seq, mask;
  1542. u32 local;
  1543. u16 unused;
  1544. if (skb->len < 14)
  1545. return;
  1546. p = skb->data;
  1547. p += get_u32(p, &code);
  1548. switch (code) {
  1549. case CISCO_SLARP_REQUEST:
  1550. lp->cisco_yourseq = 0;
  1551. isdn_net_ciscohdlck_slarp_send_reply(lp);
  1552. break;
  1553. case CISCO_SLARP_REPLY:
  1554. addr = ntohl(*(u32 *)p);
  1555. mask = ntohl(*(u32 *)(p+4));
  1556. if (mask != 0xfffffffc)
  1557. goto slarp_reply_out;
  1558. if ((addr & 3) == 0 || (addr & 3) == 3)
  1559. goto slarp_reply_out;
  1560. local = addr ^ 3;
  1561. printk(KERN_INFO "%s: got slarp reply: "
  1562. "remote ip: %d.%d.%d.%d, "
  1563. "local ip: %d.%d.%d.%d "
  1564. "mask: %d.%d.%d.%dn",
  1565.        lp->name,
  1566.        HIPQUAD(addr),
  1567.        HIPQUAD(local),
  1568.        HIPQUAD(mask));
  1569. break;
  1570.   slarp_reply_out:
  1571.  printk(KERN_INFO "%s: got invalid slarp "
  1572.  "reply (%d.%d.%d.%d/%d.%d.%d.%d) "
  1573.  "- ignoredn", lp->name,
  1574.  HIPQUAD(addr), HIPQUAD(mask));
  1575. break;
  1576. case CISCO_SLARP_KEEPALIVE:
  1577. period = (int)((jiffies - lp->cisco_last_slarp_in
  1578. + HZ/2 - 1) / HZ);
  1579. if (lp->cisco_debserint &&
  1580. (period != lp->cisco_keepalive_period) &&
  1581. lp->cisco_last_slarp_in) {
  1582. printk(KERN_DEBUG "%s: Keepalive period mismatch - "
  1583. "is %d but should be %d.n",
  1584. lp->name, period, lp->cisco_keepalive_period);
  1585. }
  1586. lp->cisco_last_slarp_in = jiffies;
  1587. p += get_u32(p, &my_seq);
  1588. p += get_u32(p, &your_seq);
  1589. p += get_u16(p, &unused);
  1590. lp->cisco_yourseq = my_seq;
  1591. lp->cisco_mineseen = your_seq;
  1592. break;
  1593. }
  1594. }
  1595. static void
  1596. isdn_net_ciscohdlck_receive(isdn_net_local *lp, struct sk_buff *skb)
  1597. {
  1598. unsigned char *p;
  1599.   u8 addr;
  1600.   u8 ctrl;
  1601.   u16 type;
  1602. if (skb->len < 4)
  1603. goto out_free;
  1604. p = skb->data;
  1605. p += get_u8 (p, &addr);
  1606. p += get_u8 (p, &ctrl);
  1607. p += get_u16(p, &type);
  1608. skb_pull(skb, 4);
  1609. if (addr != CISCO_ADDR_UNICAST && addr != CISCO_ADDR_BROADCAST) {
  1610. printk(KERN_WARNING "%s: Unknown Cisco addr 0x%02xn",
  1611.        lp->name, addr);
  1612. goto out_free;
  1613. }
  1614. if (ctrl != CISCO_CTRL) {
  1615. printk(KERN_WARNING "%s: Unknown Cisco ctrl 0x%02xn",
  1616.        lp->name, ctrl);
  1617. goto out_free;
  1618. }
  1619. switch (type) {
  1620. case CISCO_TYPE_SLARP:
  1621. isdn_net_ciscohdlck_slarp_in(lp, skb);
  1622. goto out_free;
  1623. case CISCO_TYPE_CDP:
  1624. if (lp->cisco_debserint)
  1625. printk(KERN_DEBUG "%s: Received CDP packet. use "
  1626. ""no cdp enable" on cisco.n", lp->name);
  1627. goto out_free;
  1628. default:
  1629. /* no special cisco protocol */
  1630. skb->protocol = htons(type);
  1631. netif_rx(skb);
  1632. return;
  1633. }
  1634.  out_free:
  1635. kfree_skb(skb);
  1636. }
  1637. /*
  1638.  * Got a packet from ISDN-Channel.
  1639.  */
  1640. static void
  1641. isdn_net_receive(struct net_device *ndev, struct sk_buff *skb)
  1642. {
  1643. isdn_net_local *lp = (isdn_net_local *) ndev->priv;
  1644. isdn_net_local *olp = lp; /* original 'lp' */
  1645. #ifdef CONFIG_ISDN_PPP
  1646. int proto = PPP_PROTOCOL(skb->data);
  1647. #endif
  1648. #ifdef CONFIG_ISDN_X25
  1649. struct concap_proto *cprot = lp -> netdev -> cprot;
  1650. #endif
  1651. lp->transcount += skb->len;
  1652. lp->stats.rx_packets++;
  1653. lp->stats.rx_bytes += skb->len;
  1654. if (lp->master) {
  1655. /* Bundling: If device is a slave-device, deliver to master, also
  1656.  * handle master's statistics and hangup-timeout
  1657.  */
  1658. ndev = lp->master;
  1659. lp = (isdn_net_local *) ndev->priv;
  1660. lp->stats.rx_packets++;
  1661. lp->stats.rx_bytes += skb->len;
  1662. }
  1663. skb->dev = ndev;
  1664. skb->pkt_type = PACKET_HOST;
  1665. skb->mac.raw = skb->data;
  1666. #ifdef ISDN_DEBUG_NET_DUMP
  1667. isdn_dumppkt("R:", skb->data, skb->len, 40);
  1668. #endif
  1669. switch (lp->p_encap) {
  1670. case ISDN_NET_ENCAP_ETHER:
  1671. /* Ethernet over ISDN */
  1672. olp->huptimer = 0;
  1673. lp->huptimer = 0;
  1674. skb->protocol = isdn_net_type_trans(skb, ndev);
  1675. break;
  1676. case ISDN_NET_ENCAP_UIHDLC:
  1677. /* HDLC with UI-frame (for ispa with -h1 option) */
  1678. olp->huptimer = 0;
  1679. lp->huptimer = 0;
  1680. skb_pull(skb, 2);
  1681. /* Fall through */
  1682. case ISDN_NET_ENCAP_RAWIP:
  1683. /* RAW-IP without MAC-Header */
  1684. olp->huptimer = 0;
  1685. lp->huptimer = 0;
  1686. skb->protocol = htons(ETH_P_IP);
  1687. break;
  1688. case ISDN_NET_ENCAP_CISCOHDLCK:
  1689. isdn_net_ciscohdlck_receive(lp, skb);
  1690. return;
  1691. case ISDN_NET_ENCAP_CISCOHDLC:
  1692. /* CISCO-HDLC IP with type field and  fake I-frame-header */
  1693. skb_pull(skb, 2);
  1694. /* Fall through */
  1695. case ISDN_NET_ENCAP_IPTYP:
  1696. /* IP with type field */
  1697. olp->huptimer = 0;
  1698. lp->huptimer = 0;
  1699. skb->protocol = *(unsigned short *) &(skb->data[0]);
  1700. skb_pull(skb, 2);
  1701. if (*(unsigned short *) skb->data == 0xFFFF)
  1702. skb->protocol = htons(ETH_P_802_3);
  1703. break;
  1704. #ifdef CONFIG_ISDN_PPP
  1705. case ISDN_NET_ENCAP_SYNCPPP:
  1706. /*
  1707.  * If encapsulation is syncppp, don't reset
  1708.  * huptimer on LCP packets.
  1709.  */
  1710. if (proto != PPP_LCP) {
  1711. olp->huptimer = 0;
  1712. lp->huptimer = 0;
  1713. }
  1714. isdn_ppp_receive(lp->netdev, olp, skb);
  1715. return;
  1716. #endif
  1717. default:
  1718. #ifdef CONFIG_ISDN_X25
  1719.   /* try if there are generic sync_device receiver routines */
  1720. if(cprot) if(cprot -> pops)
  1721. if( cprot -> pops -> data_ind){
  1722. cprot -> pops -> data_ind(cprot,skb);
  1723. return;
  1724. };
  1725. #endif /* CONFIG_ISDN_X25 */
  1726. printk(KERN_WARNING "%s: unknown encapsulation, droppingn",
  1727.        lp->name);
  1728. kfree_skb(skb);
  1729. return;
  1730. }
  1731. netif_rx(skb);
  1732. return;
  1733. }
  1734. /*
  1735.  * A packet arrived via ISDN. Search interface-chain for a corresponding
  1736.  * interface. If found, deliver packet to receiver-function and return 1,
  1737.  * else return 0.
  1738.  */
  1739. int
  1740. isdn_net_rcv_skb(int idx, struct sk_buff *skb)
  1741. {
  1742. isdn_net_dev *p = dev->rx_netdev[idx];
  1743. if (p) {
  1744. isdn_net_local *lp = p->local;
  1745. if ((lp->flags & ISDN_NET_CONNECTED) &&
  1746.     (!lp->dialstate)) {
  1747. isdn_net_receive(&p->dev, skb);
  1748. return 1;
  1749. }
  1750. }
  1751. return 0;
  1752. }
  1753. static int
  1754. my_eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type,
  1755.       void *daddr, void *saddr, unsigned len)
  1756. {
  1757. struct ethhdr *eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
  1758. /*
  1759.  * Set the protocol type. For a packet of type ETH_P_802_3 we
  1760.  * put the length here instead. It is up to the 802.2 layer to
  1761.  * carry protocol information.
  1762.  */
  1763. if (type != ETH_P_802_3)
  1764. eth->h_proto = htons(type);
  1765. else
  1766. eth->h_proto = htons(len);
  1767. /*
  1768.  * Set the source hardware address.
  1769.  */
  1770. if (saddr)
  1771. memcpy(eth->h_source, saddr, dev->addr_len);
  1772. else
  1773. memcpy(eth->h_source, dev->dev_addr, dev->addr_len);
  1774. /*
  1775.  * Anyway, the loopback-device should never use this function...
  1776.  */
  1777. if (dev->flags & (IFF_LOOPBACK | IFF_NOARP)) {
  1778. memset(eth->h_dest, 0, dev->addr_len);
  1779. return ETH_HLEN /*(dev->hard_header_len)*/;
  1780. }
  1781. if (daddr) {
  1782. memcpy(eth->h_dest, daddr, dev->addr_len);
  1783. return ETH_HLEN /*dev->hard_header_len*/;
  1784. }
  1785. return -ETH_HLEN /*dev->hard_header_len*/;
  1786. }
  1787. /*
  1788.  *  build an header
  1789.  *  depends on encaps that is being used.
  1790.  */
  1791. static int
  1792. isdn_net_header(struct sk_buff *skb, struct net_device *dev, unsigned short type,
  1793. void *daddr, void *saddr, unsigned plen)
  1794. {
  1795. isdn_net_local *lp = dev->priv;
  1796. unsigned char *p;
  1797. ushort len = 0;
  1798. switch (lp->p_encap) {
  1799. case ISDN_NET_ENCAP_ETHER:
  1800. len = my_eth_header(skb, dev, type, daddr, saddr, plen);
  1801. break;
  1802. #ifdef CONFIG_ISDN_PPP
  1803. case ISDN_NET_ENCAP_SYNCPPP:
  1804. /* stick on a fake header to keep fragmentation code happy. */
  1805. len = IPPP_MAX_HEADER;
  1806. skb_push(skb,len);
  1807. break;
  1808. #endif
  1809. case ISDN_NET_ENCAP_RAWIP:
  1810. printk(KERN_WARNING "isdn_net_header called with RAW_IP!n");
  1811. len = 0;
  1812. break;
  1813. case ISDN_NET_ENCAP_IPTYP:
  1814. /* ethernet type field */
  1815. *((ushort *) skb_push(skb, 2)) = htons(type);
  1816. len = 2;
  1817. break;
  1818. case ISDN_NET_ENCAP_UIHDLC:
  1819. /* HDLC with UI-Frames (for ispa with -h1 option) */
  1820. *((ushort *) skb_push(skb, 2)) = htons(0x0103);
  1821. len = 2;
  1822. break;
  1823. case ISDN_NET_ENCAP_CISCOHDLC:
  1824. case ISDN_NET_ENCAP_CISCOHDLCK:
  1825. p = skb_push(skb, 4);
  1826. p += put_u8 (p, CISCO_ADDR_UNICAST);
  1827. p += put_u8 (p, CISCO_CTRL);
  1828. p += put_u16(p, type);
  1829. len = 4;
  1830. break;
  1831. #ifdef CONFIG_ISDN_X25
  1832. default:
  1833.   /* try if there are generic concap protocol routines */
  1834. if( lp-> netdev -> cprot ){
  1835. printk(KERN_WARNING "isdn_net_header called with concap_proto!n");
  1836. len = 0;
  1837. break;
  1838. }
  1839. break;
  1840. #endif /* CONFIG_ISDN_X25 */
  1841. }
  1842. return len;
  1843. }
  1844. /* We don't need to send arp, because we have point-to-point connections. */
  1845. static int
  1846. isdn_net_rebuild_header(struct sk_buff *skb)
  1847. {
  1848. struct net_device *dev = skb->dev;
  1849. isdn_net_local *lp = dev->priv;
  1850. int ret = 0;
  1851. if (lp->p_encap == ISDN_NET_ENCAP_ETHER) {
  1852. struct ethhdr *eth = (struct ethhdr *) skb->data;
  1853. /*
  1854.  *      Only ARP/IP is currently supported
  1855.  */
  1856. if (eth->h_proto != htons(ETH_P_IP)) {
  1857. printk(KERN_WARNING
  1858.        "isdn_net: %s don't know how to resolve type %d addresses?n",
  1859.        dev->name, (int) eth->h_proto);
  1860. memcpy(eth->h_source, dev->dev_addr, dev->addr_len);
  1861. return 0;
  1862. }
  1863. /*
  1864.  *      Try to get ARP to resolve the header.
  1865.  */
  1866. #ifdef CONFIG_INET
  1867. ret = arp_find(eth->h_dest, skb);
  1868. #endif
  1869. }
  1870. return ret;
  1871. }
  1872. /*
  1873.  * Interface-setup. (just after registering a new interface)
  1874.  */
  1875. static int
  1876. isdn_net_init(struct net_device *ndev)
  1877. {
  1878. ushort max_hlhdr_len = 0;
  1879. isdn_net_local *lp = (isdn_net_local *) ndev->priv;
  1880. int drvidx, i;
  1881. ether_setup(ndev);
  1882. lp->org_hhc = ndev->hard_header_cache;
  1883. lp->org_hcu = ndev->header_cache_update;
  1884. /* Setup the generic properties */
  1885. ndev->hard_header = NULL;
  1886. ndev->hard_header_cache = NULL;
  1887. ndev->header_cache_update = NULL;
  1888. ndev->mtu = 1500;
  1889. ndev->flags = IFF_NOARP|IFF_POINTOPOINT;
  1890. ndev->type = ARPHRD_ETHER;
  1891. ndev->addr_len = ETH_ALEN;
  1892. /* for clients with MPPP maybe higher values better */
  1893. ndev->tx_queue_len = 30;
  1894. for (i = 0; i < ETH_ALEN; i++)
  1895. ndev->broadcast[i] = 0xff;
  1896. /* The ISDN-specific entries in the device structure. */
  1897. ndev->open = &isdn_net_open;
  1898. ndev->hard_start_xmit = &isdn_net_start_xmit;
  1899. /*
  1900.  *  up till binding we ask the protocol layer to reserve as much
  1901.  *  as we might need for HL layer
  1902.  */
  1903. for (drvidx = 0; drvidx < ISDN_MAX_DRIVERS; drvidx++)
  1904. if (dev->drv[drvidx])
  1905. if (max_hlhdr_len < dev->drv[drvidx]->interface->hl_hdrlen)
  1906. max_hlhdr_len = dev->drv[drvidx]->interface->hl_hdrlen;
  1907. ndev->hard_header_len = ETH_HLEN + max_hlhdr_len;
  1908. ndev->stop = &isdn_net_close;
  1909. ndev->get_stats = &isdn_net_get_stats;
  1910. ndev->rebuild_header = &isdn_net_rebuild_header;
  1911. ndev->do_ioctl = NULL;
  1912. return 0;
  1913. }
  1914. static void
  1915. isdn_net_swapbind(int drvidx)
  1916. {
  1917. isdn_net_dev *p;
  1918. #ifdef ISDN_DEBUG_NET_ICALL
  1919. printk(KERN_DEBUG "n_fi: swapping ch of %dn", drvidx);
  1920. #endif
  1921. p = dev->netdev;
  1922. while (p) {
  1923. if (p->local->pre_device == drvidx)
  1924. switch (p->local->pre_channel) {
  1925. case 0:
  1926. p->local->pre_channel = 1;
  1927. break;
  1928. case 1:
  1929. p->local->pre_channel = 0;
  1930. break;
  1931. }
  1932. p = (isdn_net_dev *) p->next;
  1933. }
  1934. }
  1935. static void
  1936. isdn_net_swap_usage(int i1, int i2)
  1937. {
  1938. int u1 = dev->usage[i1] & ISDN_USAGE_EXCLUSIVE;
  1939. int u2 = dev->usage[i2] & ISDN_USAGE_EXCLUSIVE;
  1940. #ifdef ISDN_DEBUG_NET_ICALL
  1941. printk(KERN_DEBUG "n_fi: usage of %d and %dn", i1, i2);
  1942. #endif
  1943. dev->usage[i1] &= ~ISDN_USAGE_EXCLUSIVE;
  1944. dev->usage[i1] |= u2;
  1945. dev->usage[i2] &= ~ISDN_USAGE_EXCLUSIVE;
  1946. dev->usage[i2] |= u1;
  1947. isdn_info_update();
  1948. }
  1949. /*
  1950.  * An incoming call-request has arrived.
  1951.  * Search the interface-chain for an appropriate interface.
  1952.  * If found, connect the interface to the ISDN-channel and initiate
  1953.  * D- and B-Channel-setup. If secure-flag is set, accept only
  1954.  * configured phone-numbers. If callback-flag is set, initiate
  1955.  * callback-dialing.
  1956.  *
  1957.  * Return-Value: 0 = No appropriate interface for this call.
  1958.  *               1 = Call accepted
  1959.  *               2 = Reject call, wait cbdelay, then call back
  1960.  *               3 = Reject call
  1961.  *               4 = Wait cbdelay, then call back
  1962.  *               5 = No appropriate interface for this call,
  1963.  *                   would eventually match if CID was longer.
  1964.  */
  1965. int
  1966. isdn_net_find_icall(int di, int ch, int idx, setup_parm *setup)
  1967. {
  1968. char *eaz;
  1969. int si1;
  1970. int si2;
  1971. int ematch;
  1972. int wret;
  1973. int swapped;
  1974. int sidx = 0;
  1975. isdn_net_dev *p;
  1976. isdn_net_phone *n;
  1977. ulong flags;
  1978. char nr[32];
  1979. char *my_eaz;
  1980. /* Search name in netdev-chain */
  1981. save_flags(flags);
  1982. cli();
  1983. if (!setup->phone[0]) {
  1984. nr[0] = '0';
  1985. nr[1] = '';
  1986. printk(KERN_INFO "isdn_net: Incoming call without OAD, assuming '0'n");
  1987. } else
  1988. strcpy(nr, setup->phone);
  1989. si1 = (int) setup->si1;
  1990. si2 = (int) setup->si2;
  1991. if (!setup->eazmsn[0]) {
  1992. printk(KERN_WARNING "isdn_net: Incoming call without CPN, assuming '0'n");
  1993. eaz = "0";
  1994. } else
  1995. eaz = setup->eazmsn;
  1996. if (dev->net_verbose > 1)
  1997. printk(KERN_INFO "isdn_net: call from %s,%d,%d -> %sn", nr, si1, si2, eaz);
  1998.         /* Accept DATA and VOICE calls at this stage
  1999.         local eaz is checked later for allowed call types */
  2000.         if ((si1 != 7) && (si1 != 1)) {
  2001.                 restore_flags(flags);
  2002.                 if (dev->net_verbose > 1)
  2003.                         printk(KERN_INFO "isdn_net: Service-Indicator not 1 or 7, ignoredn");
  2004.                 return 0;
  2005.         }
  2006. n = (isdn_net_phone *) 0;
  2007. p = dev->netdev;
  2008. ematch = wret = swapped = 0;
  2009. #ifdef ISDN_DEBUG_NET_ICALL
  2010. printk(KERN_DEBUG "n_fi: di=%d ch=%d idx=%d usg=%dn", di, ch, idx,
  2011.        dev->usage[idx]);
  2012. #endif
  2013. while (p) {
  2014. int matchret;
  2015. isdn_net_local *lp = p->local;
  2016. /* If last check has triggered as binding-swap, revert it */
  2017. switch (swapped) {
  2018. case 2:
  2019. isdn_net_swap_usage(idx, sidx);
  2020. /* fall through */
  2021. case 1:
  2022. isdn_net_swapbind(di);
  2023. break;
  2024. }
  2025. swapped = 0;
  2026.                 /* check acceptable call types for DOV */
  2027.                 my_eaz = isdn_map_eaz2msn(lp->msn, di);
  2028.                 if (si1 == 1) { /* it's a DOV call, check if we allow it */
  2029.                         if (*my_eaz == 'v' || *my_eaz == 'V' ||
  2030.     *my_eaz == 'b' || *my_eaz == 'B')
  2031.                                 my_eaz++; /* skip to allow a match */
  2032.                         else
  2033.                                 my_eaz = 0; /* force non match */
  2034.                 } else { /* it's a DATA call, check if we allow it */
  2035.                         if (*my_eaz == 'b' || *my_eaz == 'B')
  2036.                                 my_eaz++; /* skip to allow a match */
  2037.                 }
  2038.                 if (my_eaz)
  2039.                         matchret = isdn_msncmp(eaz, my_eaz);
  2040.                 else
  2041.                         matchret = 1;
  2042.                 if (!matchret)
  2043.                         ematch = 1;
  2044. /* Remember if more numbers eventually can match */
  2045. if (matchret > wret)
  2046. wret = matchret;
  2047. #ifdef ISDN_DEBUG_NET_ICALL
  2048. printk(KERN_DEBUG "n_fi: if='%s', l.msn=%s, l.flags=%d, l.dstate=%dn",
  2049.        lp->name, lp->msn, lp->flags, lp->dialstate);
  2050. #endif
  2051. if ((!matchret) &&                                        /* EAZ is matching   */
  2052.     (((!(lp->flags & ISDN_NET_CONNECTED)) &&              /* but not connected */
  2053.       (USG_NONE(dev->usage[idx]))) ||                     /* and ch. unused or */
  2054.      ((((lp->dialstate == 4) || (lp->dialstate == 12)) && /* if dialing        */
  2055.        (!(lp->flags & ISDN_NET_CALLBACK)))                /* but no callback   */
  2056.      )))
  2057.  {
  2058. #ifdef ISDN_DEBUG_NET_ICALL
  2059. printk(KERN_DEBUG "n_fi: match1, pdev=%d pch=%dn",
  2060.        lp->pre_device, lp->pre_channel);
  2061. #endif
  2062. if (dev->usage[idx] & ISDN_USAGE_EXCLUSIVE) {
  2063. if ((lp->pre_channel != ch) ||
  2064.     (lp->pre_device != di)) {
  2065. /* Here we got a problem:
  2066.  * If using an ICN-Card, an incoming call is always signaled on
  2067.  * on the first channel of the card, if both channels are
  2068.  * down. However this channel may be bound exclusive. If the
  2069.  * second channel is free, this call should be accepted.
  2070.  * The solution is horribly but it runs, so what:
  2071.  * We exchange the exclusive bindings of the two channels, the
  2072.  * corresponding variables in the interface-structs.
  2073.  */
  2074. if (ch == 0) {
  2075. sidx = isdn_dc2minor(di, 1);
  2076. #ifdef ISDN_DEBUG_NET_ICALL
  2077. printk(KERN_DEBUG "n_fi: ch is 0n");
  2078. #endif
  2079. if (USG_NONE(dev->usage[sidx])) {
  2080. /* Second Channel is free, now see if it is bound
  2081.  * exclusive too. */
  2082. if (dev->usage[sidx] & ISDN_USAGE_EXCLUSIVE) {
  2083. #ifdef ISDN_DEBUG_NET_ICALL
  2084. printk(KERN_DEBUG "n_fi: 2nd channel is down and boundn");
  2085. #endif
  2086. /* Yes, swap bindings only, if the original
  2087.  * binding is bound to channel 1 of this driver */
  2088. if ((lp->pre_device == di) &&
  2089.     (lp->pre_channel == 1)) {
  2090. isdn_net_swapbind(di);
  2091. swapped = 1;
  2092. } else {
  2093. /* ... else iterate next device */
  2094. p = (isdn_net_dev *) p->next;
  2095. continue;
  2096. }
  2097. } else {
  2098. #ifdef ISDN_DEBUG_NET_ICALL
  2099. printk(KERN_DEBUG "n_fi: 2nd channel is down and unboundn");
  2100. #endif
  2101. /* No, swap always and swap excl-usage also */
  2102. isdn_net_swap_usage(idx, sidx);
  2103. isdn_net_swapbind(di);
  2104. swapped = 2;
  2105. }
  2106. /* Now check for exclusive binding again */
  2107. #ifdef ISDN_DEBUG_NET_ICALL
  2108. printk(KERN_DEBUG "n_fi: final checkn");
  2109. #endif
  2110. if ((dev->usage[idx] & ISDN_USAGE_EXCLUSIVE) &&
  2111.     ((lp->pre_channel != ch) ||
  2112.      (lp->pre_device != di))) {
  2113. #ifdef ISDN_DEBUG_NET_ICALL
  2114. printk(KERN_DEBUG "n_fi: final check failedn");
  2115. #endif
  2116. p = (isdn_net_dev *) p->next;
  2117. continue;
  2118. }
  2119. }
  2120. } else {
  2121. /* We are already on the second channel, so nothing to do */
  2122. #ifdef ISDN_DEBUG_NET_ICALL
  2123. printk(KERN_DEBUG "n_fi: already on 2nd channeln");
  2124. #endif
  2125. }
  2126. }
  2127. }
  2128. #ifdef ISDN_DEBUG_NET_ICALL
  2129. printk(KERN_DEBUG "n_fi: match2n");
  2130. #endif
  2131. n = lp->phone[0];
  2132. if (lp->flags & ISDN_NET_SECURE) {
  2133. while (n) {
  2134. if (!isdn_msncmp(nr, n->num))
  2135. break;
  2136. n = (isdn_net_phone *) n->next;
  2137. }
  2138. }
  2139. if (n || (!(lp->flags & ISDN_NET_SECURE))) {
  2140. #ifdef ISDN_DEBUG_NET_ICALL
  2141. printk(KERN_DEBUG "n_fi: match3n");
  2142. #endif
  2143. /* matching interface found */
  2144. /*
  2145.  * Is the state STOPPED?
  2146.  * If so, no dialin is allowed,
  2147.  * so reject actively.
  2148.  * */
  2149. if (ISDN_NET_DIALMODE(*lp) == ISDN_NET_DM_OFF) {
  2150. restore_flags(flags);
  2151. printk(KERN_INFO "incoming call, interface %s `stopped' -> rejectedn",
  2152.        lp->name);
  2153. return 3;
  2154. }
  2155. /*
  2156.  * Is the interface up?
  2157.  * If not, reject the call actively.
  2158.  */
  2159. if (!isdn_net_device_started(p)) {
  2160. restore_flags(flags);
  2161. printk(KERN_INFO "%s: incoming call, interface down -> rejectedn",
  2162.        lp->name);
  2163. return 3;
  2164. }
  2165. /* Interface is up, now see if it's a slave. If so, see if
  2166.  * it's master and parent slave is online. If not, reject the call.
  2167.  */
  2168. if (lp->master) {
  2169. isdn_net_local *mlp = (isdn_net_local *) lp->master->priv;
  2170. printk(KERN_DEBUG "ICALLslv: %sn", lp->name);
  2171. printk(KERN_DEBUG "master=%sn", mlp->name);
  2172. if (mlp->flags & ISDN_NET_CONNECTED) {
  2173. printk(KERN_DEBUG "master onlinen");
  2174. /* Master is online, find parent-slave (master if first slave) */
  2175. while (mlp->slave) {
  2176. if ((isdn_net_local *) mlp->slave->priv == lp)
  2177. break;
  2178. mlp = (isdn_net_local *) mlp->slave->priv;
  2179. }
  2180. } else
  2181. printk(KERN_DEBUG "master offlinen");
  2182. /* Found parent, if it's offline iterate next device */
  2183. printk(KERN_DEBUG "mlpf: %dn", mlp->flags & ISDN_NET_CONNECTED);
  2184. if (!(mlp->flags & ISDN_NET_CONNECTED)) {
  2185. p = (isdn_net_dev *) p->next;
  2186. continue;
  2187. }
  2188. if (lp->flags & ISDN_NET_CALLBACK) {
  2189. int chi;
  2190. /*
  2191.  * Is the state MANUAL?
  2192.  * If so, no callback can be made,
  2193.  * so reject actively.
  2194.  * */
  2195. if (ISDN_NET_DIALMODE(*lp) == ISDN_NET_DM_OFF) {
  2196. restore_flags(flags);
  2197. printk(KERN_INFO "incoming call for callback, interface %s `off' -> rejectedn",
  2198.        lp->name);
  2199. return 3;
  2200. }
  2201. printk(KERN_DEBUG "%s: call from %s -> %s, start callbackn",
  2202.        lp->name, nr, eaz);
  2203. if (lp->phone[1]) {
  2204. /* Grab a free ISDN-Channel */
  2205. if ((chi = 
  2206. isdn_get_free_channel(
  2207. ISDN_USAGE_NET,
  2208. lp->l2_proto,
  2209. lp->l3_proto,
  2210.    lp->pre_device,
  2211.   lp->pre_channel,
  2212.   lp->msn)
  2213. ) < 0) {
  2214. printk(KERN_WARNING "isdn_net_find_icall: No channel for %sn", lp->name);
  2215. restore_flags(flags);
  2216. return 0;
  2217. }
  2218. /* Setup dialstate. */
  2219. lp->dtimer = 0;
  2220. lp->dialstate = 11;
  2221. /* Connect interface with channel */
  2222. isdn_net_bind_channel(lp, chi);
  2223. #ifdef CONFIG_ISDN_PPP
  2224. if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP)
  2225. if (isdn_ppp_bind(lp) < 0) {
  2226. isdn_net_unbind_channel(lp);
  2227. restore_flags(flags);
  2228. return 0;
  2229. }
  2230. #endif
  2231. /* Initiate dialing by returning 2 or 4 */
  2232. restore_flags(flags);
  2233. return (lp->flags & ISDN_NET_CBHUP) ? 2 : 4;
  2234. } else
  2235. printk(KERN_WARNING "isdn_net: %s: No phone numbern", lp->name);
  2236. restore_flags(flags);
  2237. return 0;
  2238. } else {
  2239. printk(KERN_DEBUG "%s: call from %s -> %s acceptedn", lp->name, nr,
  2240.        eaz);
  2241. /* if this interface is dialing, it does it probably on a different
  2242.    device, so free this device */
  2243. if ((lp->dialstate == 4) || (lp->dialstate == 12)) {
  2244. #ifdef CONFIG_ISDN_PPP
  2245. if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP)
  2246. isdn_ppp_free(lp);
  2247. #endif
  2248. isdn_net_lp_disconnected(lp);
  2249. isdn_free_channel(lp->isdn_device, lp->isdn_channel,
  2250.  ISDN_USAGE_NET);
  2251. }
  2252. dev->usage[idx] &= ISDN_USAGE_EXCLUSIVE;
  2253. dev->usage[idx] |= ISDN_USAGE_NET;
  2254. strcpy(dev->num[idx], nr);
  2255. isdn_info_update();
  2256. dev->st_netdev[idx] = lp->netdev;
  2257. lp->isdn_device = di;
  2258. lp->isdn_channel = ch;
  2259. lp->ppp_slot = -1;
  2260. lp->flags |= ISDN_NET_CONNECTED;
  2261. lp->dialstate = 7;
  2262. lp->dtimer = 0;
  2263. lp->outgoing = 0;
  2264. lp->huptimer = 0;
  2265. lp->hupflags |= ISDN_WAITCHARGE;
  2266. lp->hupflags &= ~ISDN_HAVECHARGE;
  2267. #ifdef CONFIG_ISDN_PPP
  2268. if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP)
  2269. if (isdn_ppp_bind(lp) < 0) {
  2270. isdn_net_unbind_channel(lp);
  2271. restore_flags(flags);
  2272. return 0;
  2273. }
  2274. #endif
  2275. restore_flags(flags);
  2276. return 1;
  2277. }
  2278. }
  2279. }
  2280. p = (isdn_net_dev *) p->next;
  2281. }
  2282. /* If none of configured EAZ/MSN matched and not verbose, be silent */
  2283. if (!ematch || dev->net_verbose)
  2284. printk(KERN_INFO "isdn_net: call from %s -> %d %s ignoredn", nr, di, eaz);
  2285. restore_flags(flags);
  2286. return (wret == 2)?5:0;
  2287. }
  2288. /*
  2289.  * Search list of net-interfaces for an interface with given name.
  2290.  */
  2291. isdn_net_dev *
  2292. isdn_net_findif(char *name)
  2293. {
  2294. isdn_net_dev *p = dev->netdev;
  2295. while (p) {
  2296. if (!strcmp(p->local->name, name))
  2297. return p;
  2298. p = (isdn_net_dev *) p->next;
  2299. }
  2300. return (isdn_net_dev *) NULL;
  2301. }
  2302. /*
  2303.  * Force a net-interface to dial out.
  2304.  * This is called from the userlevel-routine below or
  2305.  * from isdn_net_start_xmit().
  2306.  */
  2307. int
  2308. isdn_net_force_dial_lp(isdn_net_local * lp)
  2309. {
  2310. if ((!(lp->flags & ISDN_NET_CONNECTED)) && !lp->dialstate) {
  2311. int chi;
  2312. if (lp->phone[1]) {
  2313. ulong flags;
  2314. save_flags(flags);
  2315. cli();
  2316. /* Grab a free ISDN-Channel */
  2317. if ((chi = 
  2318. isdn_get_free_channel(
  2319. ISDN_USAGE_NET,
  2320. lp->l2_proto,
  2321. lp->l3_proto,
  2322. lp->pre_device,
  2323.   lp->pre_channel,
  2324. lp->msn)
  2325. ) < 0) {
  2326. printk(KERN_WARNING "isdn_net_force_dial: No channel for %sn", lp->name);
  2327. restore_flags(flags);
  2328. return -EAGAIN;
  2329. }
  2330. lp->dialstate = 1;
  2331. /* Connect interface with channel */
  2332. isdn_net_bind_channel(lp, chi);
  2333. #ifdef CONFIG_ISDN_PPP
  2334. if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP)
  2335. if (isdn_ppp_bind(lp) < 0) {
  2336. isdn_net_unbind_channel(lp);
  2337. restore_flags(flags);
  2338. return -EAGAIN;
  2339. }
  2340. #endif
  2341. /* Initiate dialing */
  2342. restore_flags(flags);
  2343. isdn_net_dial();
  2344. return 0;
  2345. } else
  2346. return -EINVAL;
  2347. } else
  2348. return -EBUSY;
  2349. }
  2350. /*
  2351.  * This is called from certain upper protocol layers (multilink ppp
  2352.  * and x25iface encapsulation module) that want to initiate dialing
  2353.  * themselves.
  2354.  */
  2355. int
  2356. isdn_net_dial_req(isdn_net_local * lp)
  2357. {
  2358. /* is there a better error code? */
  2359. if (!(ISDN_NET_DIALMODE(*lp) == ISDN_NET_DM_AUTO)) return -EBUSY;
  2360. return isdn_net_force_dial_lp(lp);
  2361. }
  2362. /*
  2363.  * Force a net-interface to dial out.
  2364.  * This is always called from within userspace (ISDN_IOCTL_NET_DIAL).
  2365.  */
  2366. int
  2367. isdn_net_force_dial(char *name)
  2368. {
  2369. isdn_net_dev *p = isdn_net_findif(name);
  2370. if (!p)
  2371. return -ENODEV;
  2372. return (isdn_net_force_dial_lp(p->local));
  2373. }
  2374. /*
  2375.  * Allocate a new network-interface and initialize its data structures.
  2376.  */
  2377. char *
  2378. isdn_net_new(char *name, struct net_device *master)
  2379. {
  2380. isdn_net_dev *netdev;
  2381. /* Avoid creating an existing interface */
  2382. if (isdn_net_findif(name)) {
  2383. printk(KERN_WARNING "isdn_net: interface %s already existsn", name);
  2384. return NULL;
  2385. }
  2386. if (!(netdev = (isdn_net_dev *) kmalloc(sizeof(isdn_net_dev), GFP_KERNEL))) {
  2387. printk(KERN_WARNING "isdn_net: Could not allocate net-devicen");
  2388. return NULL;
  2389. }
  2390. memset(netdev, 0, sizeof(isdn_net_dev));
  2391. if (!(netdev->local = (isdn_net_local *) kmalloc(sizeof(isdn_net_local), GFP_KERNEL))) {
  2392. printk(KERN_WARNING "isdn_net: Could not allocate device localsn");
  2393. kfree(netdev);
  2394. return NULL;
  2395. }
  2396. memset(netdev->local, 0, sizeof(isdn_net_local));
  2397. if (name == NULL)
  2398. strcpy(netdev->local->name, "         ");
  2399. else
  2400. strcpy(netdev->local->name, name);
  2401. strcpy(netdev->dev.name, netdev->local->name);
  2402. netdev->dev.priv = netdev->local;
  2403. netdev->dev.init = isdn_net_init;
  2404. netdev->local->p_encap = ISDN_NET_ENCAP_RAWIP;
  2405. if (master) {
  2406. /* Device shall be a slave */
  2407. struct net_device *p = (((isdn_net_local *) master->priv)->slave);
  2408. struct net_device *q = master;
  2409. netdev->local->master = master;
  2410. /* Put device at end of slave-chain */
  2411. while (p) {
  2412. q = p;
  2413. p = (((isdn_net_local *) p->priv)->slave);
  2414. }
  2415. ((isdn_net_local *) q->priv)->slave = &(netdev->dev);
  2416. } else {
  2417. /* Device shall be a master */
  2418. /*
  2419.  * Watchdog timer (currently) for master only.
  2420.  */
  2421. netdev->dev.tx_timeout = isdn_net_tx_timeout;
  2422. netdev->dev.watchdog_timeo = ISDN_NET_TX_TIMEOUT;
  2423. if (register_netdev(&netdev->dev) != 0) {
  2424. printk(KERN_WARNING "isdn_net: Could not register net-devicen");
  2425. kfree(netdev->local);
  2426. kfree(netdev);
  2427. return NULL;
  2428. }
  2429. }
  2430. netdev->local->magic = ISDN_NET_MAGIC;
  2431. netdev->queue = netdev->local;
  2432. spin_lock_init(&netdev->queue_lock);
  2433. netdev->local->last = netdev->local;
  2434. netdev->local->netdev = netdev;
  2435. netdev->local->next = netdev->local;
  2436. netdev->local->tqueue.sync = 0;
  2437. netdev->local->tqueue.routine = isdn_net_softint;
  2438. netdev->local->tqueue.data = netdev->local;
  2439. spin_lock_init(&netdev->local->xmit_lock);
  2440. netdev->local->isdn_device = -1;
  2441. netdev->local->isdn_channel = -1;
  2442. netdev->local->pre_device = -1;
  2443. netdev->local->pre_channel = -1;
  2444. netdev->local->exclusive = -1;
  2445. netdev->local->ppp_slot = -1;
  2446. netdev->local->pppbind = -1;
  2447. skb_queue_head_init(&netdev->local->super_tx_queue);
  2448. netdev->local->l2_proto = ISDN_PROTO_L2_X75I;
  2449. netdev->local->l3_proto = ISDN_PROTO_L3_TRANS;
  2450. netdev->local->triggercps = 6000;
  2451. netdev->local->slavedelay = 10 * HZ;
  2452. netdev->local->hupflags = ISDN_INHUP; /* Do hangup even on incoming calls */
  2453. netdev->local->onhtime = 10; /* Default hangup-time for saving costs
  2454.    of those who forget configuring this */
  2455. netdev->local->dialmax = 1;
  2456. netdev->local->flags = ISDN_NET_CBHUP | ISDN_NET_DM_MANUAL; /* Hangup before Callback, manual dial */
  2457. netdev->local->cbdelay = 25; /* Wait 5 secs before Callback */
  2458. netdev->local->dialtimeout = -1;  /* Infinite Dial-Timeout */
  2459. netdev->local->dialwait = 5 * HZ; /* Wait 5 sec. after failed dial */
  2460. netdev->local->dialstarted = 0;   /* Jiffies of last dial-start */
  2461. netdev->local->dialwait_timer = 0;  /* Jiffies of earliest next dial-start */
  2462. /* Put into to netdev-chain */
  2463. netdev->next = (void *) dev->netdev;
  2464. dev->netdev = netdev;
  2465. return netdev->dev.name;
  2466. }
  2467. char *
  2468. isdn_net_newslave(char *parm)
  2469. {
  2470. char *p = strchr(parm, ',');
  2471. isdn_net_dev *n;
  2472. char newname[10];
  2473. if (p) {
  2474. /* Slave-Name MUST not be empty */
  2475. if (!strlen(p + 1))
  2476. return NULL;
  2477. strcpy(newname, p + 1);
  2478. *p = 0;
  2479. /* Master must already exist */
  2480. if (!(n = isdn_net_findif(parm)))
  2481. return NULL;
  2482. /* Master must be a real interface, not a slave */
  2483. if (n->local->master)
  2484. return NULL;
  2485. /* Master must not be started yet */
  2486. if (isdn_net_device_started(n)) 
  2487. return NULL;
  2488. return (isdn_net_new(newname, &(n->dev)));
  2489. }
  2490. return NULL;
  2491. }
  2492. /*
  2493.  * Set interface-parameters.
  2494.  * Always set all parameters, so the user-level application is responsible
  2495.  * for not overwriting existing setups. It has to get the current
  2496.  * setup first, if only selected parameters are to be changed.
  2497.  */
  2498. int
  2499. isdn_net_setcfg(isdn_net_ioctl_cfg * cfg)
  2500. {
  2501. isdn_net_dev *p = isdn_net_findif(cfg->name);
  2502. ulong features;
  2503. int i;
  2504. int drvidx;
  2505. int chidx;
  2506. char drvid[25];
  2507. #ifdef CONFIG_ISDN_X25
  2508. ulong flags;
  2509. #endif
  2510. if (p) {
  2511. isdn_net_local *lp = p->local;
  2512. /* See if any registered driver supports the features we want */
  2513. features = ((1 << cfg->l2_proto) << ISDN_FEATURE_L2_SHIFT) |
  2514. ((1 << cfg->l3_proto) << ISDN_FEATURE_L3_SHIFT);
  2515. for (i = 0; i < ISDN_MAX_DRIVERS; i++)
  2516. if (dev->drv[i])
  2517. if ((dev->drv[i]->interface->features & features) == features)
  2518. break;
  2519. if (i == ISDN_MAX_DRIVERS) {
  2520. printk(KERN_WARNING "isdn_net: No driver with selected featuresn");
  2521. return -ENODEV;
  2522. }
  2523. if (lp->p_encap != cfg->p_encap){
  2524. #ifdef CONFIG_ISDN_X25
  2525. struct concap_proto * cprot = p -> cprot;
  2526. #endif
  2527. if (isdn_net_device_started(p)) {
  2528. printk(KERN_WARNING "%s: cannot change encap when if is upn",
  2529.        lp->name);
  2530. return -EBUSY;
  2531. }
  2532. #ifdef CONFIG_ISDN_X25
  2533. /* delete old encapsulation protocol if present ... */
  2534. save_flags(flags);
  2535. cli(); /* avoid races with incoming events trying to
  2536.   call cprot->pops methods */
  2537. if( cprot && cprot -> pops )
  2538. cprot -> pops -> proto_del ( cprot );
  2539. p -> cprot = NULL;
  2540. lp -> dops = NULL;
  2541. restore_flags(flags);
  2542. /* ... ,  prepare for configuration of new one ... */
  2543. switch ( cfg -> p_encap ){
  2544. case ISDN_NET_ENCAP_X25IFACE:
  2545. lp -> dops = &isdn_concap_reliable_dl_dops;
  2546. }
  2547. /* ... and allocate new one ... */
  2548. p -> cprot = isdn_concap_new( cfg -> p_encap );
  2549. /* p -> cprot == NULL now if p_encap is not supported
  2550.    by means of the concap_proto mechanism */
  2551. /* the protocol is not configured yet; this will
  2552.    happen later when isdn_net_reset() is called */
  2553. #endif
  2554. }
  2555. switch ( cfg->p_encap ) {
  2556. case ISDN_NET_ENCAP_SYNCPPP:
  2557. #ifndef CONFIG_ISDN_PPP
  2558. printk(KERN_WARNING "%s: SyncPPP support not configuredn",
  2559.        lp->name);
  2560. return -EINVAL;
  2561. #else
  2562. p->dev.type = ARPHRD_PPP; /* change ARP type */
  2563. p->dev.addr_len = 0;
  2564. p->dev.do_ioctl = isdn_ppp_dev_ioctl;
  2565. #endif
  2566. break;
  2567. case ISDN_NET_ENCAP_X25IFACE:
  2568. #ifndef CONFIG_ISDN_X25
  2569. printk(KERN_WARNING "%s: isdn-x25 support not configuredn",
  2570.        p->local->name);
  2571. return -EINVAL;
  2572. #else
  2573. p->dev.type = ARPHRD_X25; /* change ARP type */
  2574. p->dev.addr_len = 0;
  2575. #endif
  2576. break;
  2577. case ISDN_NET_ENCAP_CISCOHDLCK:
  2578. p->dev.do_ioctl = isdn_ciscohdlck_dev_ioctl;
  2579. break;
  2580. default:
  2581. if( cfg->p_encap >= 0 &&
  2582.     cfg->p_encap <= ISDN_NET_ENCAP_MAX_ENCAP )
  2583. break;
  2584. printk(KERN_WARNING
  2585.        "%s: encapsulation protocol %d not supportedn",
  2586.        p->local->name, cfg->p_encap);
  2587. return -EINVAL;
  2588. }
  2589. if (strlen(cfg->drvid)) {
  2590. /* A bind has been requested ... */
  2591. char *c,
  2592. *e;
  2593. drvidx = -1;
  2594. chidx = -1;
  2595. strcpy(drvid, cfg->drvid);
  2596. if ((c = strchr(drvid, ','))) {
  2597. /* The channel-number is appended to the driver-Id with a comma */
  2598. chidx = (int) simple_strtoul(c + 1, &e, 10);
  2599. if (e == c)
  2600. chidx = -1;
  2601. *c = '';
  2602. }
  2603. for (i = 0; i < ISDN_MAX_DRIVERS; i++)
  2604. /* Lookup driver-Id in array */
  2605. if (!(strcmp(dev->drvid[i], drvid))) {
  2606. drvidx = i;
  2607. break;
  2608. }
  2609. if ((drvidx == -1) || (chidx == -1))
  2610. /* Either driver-Id or channel-number invalid */
  2611. return -ENODEV;
  2612. } else {
  2613. /* Parameters are valid, so get them */
  2614. drvidx = lp->pre_device;
  2615. chidx = lp->pre_channel;
  2616. }
  2617. if (cfg->exclusive > 0) {
  2618. unsigned long flags;
  2619. /* If binding is exclusive, try to grab the channel */
  2620. save_flags(flags);
  2621. if ((i = isdn_get_free_channel(ISDN_USAGE_NET,
  2622. lp->l2_proto, lp->l3_proto, drvidx,
  2623. chidx, lp->msn)) < 0) {
  2624. /* Grab failed, because desired channel is in use */
  2625. lp->exclusive = -1;
  2626. restore_flags(flags);
  2627. return -EBUSY;
  2628. }
  2629. /* All went ok, so update isdninfo */
  2630. dev->usage[i] = ISDN_USAGE_EXCLUSIVE;
  2631. isdn_info_update();
  2632. restore_flags(flags);
  2633. lp->exclusive = i;
  2634. } else {
  2635. /* Non-exclusive binding or unbind. */
  2636. lp->exclusive = -1;
  2637. if ((lp->pre_device != -1) && (cfg->exclusive == -1)) {
  2638. isdn_unexclusive_channel(lp->pre_device, lp->pre_channel);
  2639. isdn_free_channel(lp->pre_device, lp->pre_channel, ISDN_USAGE_NET);
  2640. drvidx = -1;
  2641. chidx = -1;
  2642. }
  2643. }
  2644. strcpy(lp->msn, cfg->eaz);
  2645. lp->pre_device = drvidx;
  2646. lp->pre_channel = chidx;
  2647. lp->onhtime = cfg->onhtime;
  2648. lp->charge = cfg->charge;
  2649. lp->l2_proto = cfg->l2_proto;
  2650. lp->l3_proto = cfg->l3_proto;
  2651. lp->cbdelay = cfg->cbdelay;
  2652. lp->dialmax = cfg->dialmax;
  2653. lp->triggercps = cfg->triggercps;
  2654. lp->slavedelay = cfg->slavedelay * HZ;
  2655. lp->pppbind = cfg->pppbind;
  2656. lp->dialtimeout = cfg->dialtimeout >= 0 ? cfg->dialtimeout * HZ : -1;
  2657. lp->dialwait = cfg->dialwait * HZ;
  2658. if (cfg->secure)
  2659. lp->flags |= ISDN_NET_SECURE;
  2660. else
  2661. lp->flags &= ~ISDN_NET_SECURE;
  2662. if (cfg->cbhup)
  2663. lp->flags |= ISDN_NET_CBHUP;
  2664. else
  2665. lp->flags &= ~ISDN_NET_CBHUP;
  2666. switch (cfg->callback) {
  2667. case 0:
  2668. lp->flags &= ~(ISDN_NET_CALLBACK | ISDN_NET_CBOUT);
  2669. break;
  2670. case 1:
  2671. lp->flags |= ISDN_NET_CALLBACK;
  2672. lp->flags &= ~ISDN_NET_CBOUT;
  2673. break;
  2674. case 2:
  2675. lp->flags |= ISDN_NET_CBOUT;
  2676. lp->flags &= ~ISDN_NET_CALLBACK;
  2677. break;
  2678. }
  2679. lp->flags &= ~ISDN_NET_DIALMODE_MASK; /* first all bits off */
  2680. if (cfg->dialmode && !(cfg->dialmode & ISDN_NET_DIALMODE_MASK)) {
  2681. /* old isdnctrl version, where only 0 or 1 is given */
  2682. printk(KERN_WARNING
  2683.      "Old isdnctrl version detected! Please update.n");
  2684. lp->flags |= ISDN_NET_DM_OFF; /* turn on `off' bit */
  2685. }
  2686. else {
  2687. lp->flags |= cfg->dialmode;  /* turn on selected bits */
  2688. }
  2689. if (cfg->chargehup)
  2690. lp->hupflags |= ISDN_CHARGEHUP;
  2691. else
  2692. lp->hupflags &= ~ISDN_CHARGEHUP;
  2693. if (cfg->ihup)
  2694. lp->hupflags |= ISDN_INHUP;
  2695. else
  2696. lp->hupflags &= ~ISDN_INHUP;
  2697. if (cfg->chargeint > 10) {
  2698. lp->hupflags |= ISDN_CHARGEHUP | ISDN_HAVECHARGE | ISDN_MANCHARGE;
  2699. lp->chargeint = cfg->chargeint * HZ;
  2700. }
  2701. if (cfg->p_encap != lp->p_encap) {
  2702. if (cfg->p_encap == ISDN_NET_ENCAP_RAWIP) {
  2703. p->dev.hard_header = NULL;
  2704. p->dev.hard_header_cache = NULL;
  2705. p->dev.header_cache_update = NULL;
  2706. p->dev.flags = IFF_NOARP|IFF_POINTOPOINT;
  2707. } else {
  2708. p->dev.hard_header = isdn_net_header;
  2709. if (cfg->p_encap == ISDN_NET_ENCAP_ETHER) {
  2710. p->dev.hard_header_cache = lp->org_hhc;
  2711. p->dev.header_cache_update = lp->org_hcu;
  2712. p->dev.flags = IFF_BROADCAST | IFF_MULTICAST;
  2713. } else {
  2714. p->dev.hard_header_cache = NULL;
  2715. p->dev.header_cache_update = NULL;
  2716. p->dev.flags = IFF_NOARP|IFF_POINTOPOINT;
  2717. }
  2718. }
  2719. }
  2720. lp->p_encap = cfg->p_encap;
  2721. return 0;
  2722. }
  2723. return -ENODEV;
  2724. }
  2725. /*
  2726.  * Perform get-interface-parameters.ioctl
  2727.  */
  2728. int
  2729. isdn_net_getcfg(isdn_net_ioctl_cfg * cfg)
  2730. {
  2731. isdn_net_dev *p = isdn_net_findif(cfg->name);
  2732. if (p) {
  2733. isdn_net_local *lp = p->local;
  2734. strcpy(cfg->eaz, lp->msn);
  2735. cfg->exclusive = lp->exclusive;
  2736. if (lp->pre_device >= 0) {
  2737. sprintf(cfg->drvid, "%s,%d", dev->drvid[lp->pre_device],
  2738. lp->pre_channel);
  2739. } else
  2740. cfg->drvid[0] = '';
  2741. cfg->onhtime = lp->onhtime;
  2742. cfg->charge = lp->charge;
  2743. cfg->l2_proto = lp->l2_proto;
  2744. cfg->l3_proto = lp->l3_proto;
  2745. cfg->p_encap = lp->p_encap;
  2746. cfg->secure = (lp->flags & ISDN_NET_SECURE) ? 1 : 0;
  2747. cfg->callback = 0;
  2748. if (lp->flags & ISDN_NET_CALLBACK)
  2749. cfg->callback = 1;
  2750. if (lp->flags & ISDN_NET_CBOUT)
  2751. cfg->callback = 2;
  2752. cfg->cbhup = (lp->flags & ISDN_NET_CBHUP) ? 1 : 0;
  2753. cfg->dialmode = lp->flags & ISDN_NET_DIALMODE_MASK;
  2754. cfg->chargehup = (lp->hupflags & 4) ? 1 : 0;
  2755. cfg->ihup = (lp->hupflags & 8) ? 1 : 0;
  2756. cfg->cbdelay = lp->cbdelay;
  2757. cfg->dialmax = lp->dialmax;
  2758. cfg->triggercps = lp->triggercps;
  2759. cfg->slavedelay = lp->slavedelay / HZ;
  2760. cfg->chargeint = (lp->hupflags & ISDN_CHARGEHUP) ?
  2761.     (lp->chargeint / HZ) : 0;
  2762. cfg->pppbind = lp->pppbind;
  2763. cfg->dialtimeout = lp->dialtimeout >= 0 ? lp->dialtimeout / HZ : -1;
  2764. cfg->dialwait = lp->dialwait / HZ;
  2765. if (lp->slave)
  2766. strcpy(cfg->slave, ((isdn_net_local *) lp->slave->priv)->name);
  2767. else
  2768. cfg->slave[0] = '';
  2769. if (lp->master)
  2770. strcpy(cfg->master, ((isdn_net_local *) lp->master->priv)->name);
  2771. else
  2772. cfg->master[0] = '';
  2773. return 0;
  2774. }
  2775. return -ENODEV;
  2776. }
  2777. /*
  2778.  * Add a phone-number to an interface.
  2779.  */
  2780. int
  2781. isdn_net_addphone(isdn_net_ioctl_phone * phone)
  2782. {
  2783. isdn_net_dev *p = isdn_net_findif(phone->name);
  2784. isdn_net_phone *n;
  2785. if (p) {
  2786. if (!(n = (isdn_net_phone *) kmalloc(sizeof(isdn_net_phone), GFP_KERNEL)))
  2787. return -ENOMEM;
  2788. strcpy(n->num, phone->phone);
  2789. n->next = p->local->phone[phone->outgoing & 1];
  2790. p->local->phone[phone->outgoing & 1] = n;
  2791. return 0;
  2792. }
  2793. return -ENODEV;
  2794. }
  2795. /*
  2796.  * Copy a string of all phone-numbers of an interface to user space.
  2797.  * This might sleep and must be called with the isdn semaphore down.
  2798.  */
  2799. int
  2800. isdn_net_getphones(isdn_net_ioctl_phone * phone, char *phones)
  2801. {
  2802. isdn_net_dev *p = isdn_net_findif(phone->name);
  2803. int inout = phone->outgoing & 1;
  2804. int more = 0;
  2805. int count = 0;
  2806. isdn_net_phone *n;
  2807. if (!p)
  2808. return -ENODEV;
  2809. inout &= 1;
  2810. for (n = p->local->phone[inout]; n; n = n->next) {
  2811. if (more) {
  2812. put_user(' ', phones++);
  2813. count++;
  2814. }
  2815. if (copy_to_user(phones, n->num, strlen(n->num) + 1)) {
  2816. return -EFAULT;
  2817. }
  2818. phones += strlen(n->num);
  2819. count += strlen(n->num);
  2820. more = 1;
  2821. }
  2822. put_user(0, phones);
  2823. count++;
  2824. return count;
  2825. }
  2826. /*
  2827.  * Copy a string containing the peer's phone number of a connected interface
  2828.  * to user space.
  2829.  */
  2830. int
  2831. isdn_net_getpeer(isdn_net_ioctl_phone *phone, isdn_net_ioctl_phone *peer)
  2832. {
  2833. isdn_net_dev *p = isdn_net_findif(phone->name);
  2834. int ch, dv, idx;
  2835. if (!p) return -ENODEV;
  2836. /*
  2837.  * Theoretical race: while this executes, the remote number might
  2838.  * become invalid (hang up) or change (new connection), resulting
  2839.          * in (partially) wrong number copied to user. This race
  2840.  * currently ignored.
  2841.  */
  2842. ch = p->local->isdn_channel;
  2843. dv = p->local->isdn_device;
  2844. if(ch<0 && dv<0) return -ENOTCONN;
  2845. idx = isdn_dc2minor(dv, ch);
  2846. if (idx<0) return -ENODEV;
  2847. /* for pre-bound channels, we need this extra check */
  2848. if ( strncmp(dev->num[idx],"???",3) == 0 ) return -ENOTCONN;
  2849. strncpy(phone->phone,dev->num[idx],ISDN_MSNLEN);
  2850. phone->outgoing=USG_OUTGOING(dev->usage[idx]);
  2851. if ( copy_to_user(peer,phone,sizeof(*peer)) ) return -EFAULT;
  2852. return 0;
  2853. }
  2854. /*
  2855.  * Delete a phone-number from an interface.
  2856.  */
  2857. int
  2858. isdn_net_delphone(isdn_net_ioctl_phone * phone)
  2859. {
  2860. isdn_net_dev *p = isdn_net_findif(phone->name);
  2861. int inout = phone->outgoing & 1;
  2862. isdn_net_phone *n;
  2863. isdn_net_phone *m;
  2864. unsigned long flags;
  2865. if (p) {
  2866. save_flags(flags);
  2867. cli();
  2868. n = p->local->phone[inout];
  2869. m = NULL;
  2870. while (n) {
  2871. if (!strcmp(n->num, phone->phone)) {
  2872. if (p->local->dial == n)
  2873. p->local->dial = n->next;
  2874. if (m)
  2875. m->next = n->next;
  2876. else
  2877. p->local->phone[inout] = n->next;
  2878. kfree(n);
  2879. restore_flags(flags);
  2880. return 0;
  2881. }
  2882. m = n;
  2883. n = (isdn_net_phone *) n->next;
  2884. }
  2885. restore_flags(flags);
  2886. return -EINVAL;
  2887. }
  2888. return -ENODEV;
  2889. }
  2890. /*
  2891.  * Delete all phone-numbers of an interface.
  2892.  */
  2893. static int
  2894. isdn_net_rmallphone(isdn_net_dev * p)
  2895. {
  2896. isdn_net_phone *n;
  2897. isdn_net_phone *m;
  2898. unsigned long flags;
  2899. int i;
  2900. save_flags(flags);
  2901. cli();
  2902. for (i = 0; i < 2; i++) {
  2903. n = p->local->phone[i];
  2904. while (n) {
  2905. m = n->next;
  2906. kfree(n);
  2907. n = m;
  2908. }
  2909. p->local->phone[i] = NULL;
  2910. }
  2911. p->local->dial = NULL;
  2912. restore_flags(flags);
  2913. return 0;
  2914. }
  2915. /*
  2916.  * Force a hangup of a network-interface.
  2917.  */
  2918. int
  2919. isdn_net_force_hangup(char *name)
  2920. {
  2921. isdn_net_dev *p = isdn_net_findif(name);
  2922. struct net_device *q;
  2923. if (p) {
  2924. if (p->local->isdn_device < 0)
  2925. return 1;
  2926. q = p->local->slave;
  2927. /* If this interface has slaves, do a hangup for them also. */
  2928. while (q) {
  2929. isdn_net_hangup(q);
  2930. q = (((isdn_net_local *) q->priv)->slave);
  2931. }
  2932. isdn_net_hangup(&p->dev);
  2933. return 0;
  2934. }
  2935. return -ENODEV;
  2936. }
  2937. /*
  2938.  * Helper-function for isdn_net_rm: Do the real work.
  2939.  */
  2940. static int
  2941. isdn_net_realrm(isdn_net_dev * p, isdn_net_dev * q)
  2942. {
  2943. unsigned long flags;
  2944. save_flags(flags);
  2945. cli();
  2946. if (isdn_net_device_started(p)) {
  2947. restore_flags(flags);
  2948. return -EBUSY;
  2949. }
  2950. #ifdef CONFIG_ISDN_X25
  2951. if( p -> cprot && p -> cprot -> pops )
  2952. p -> cprot -> pops -> proto_del ( p -> cprot );
  2953. #endif
  2954. /* Free all phone-entries */
  2955. isdn_net_rmallphone(p);
  2956. /* If interface is bound exclusive, free channel-usage */
  2957. if (p->local->exclusive != -1)
  2958. isdn_unexclusive_channel(p->local->pre_device, p->local->pre_channel);
  2959. if (p->local->master) {
  2960. /* It's a slave-device, so update master's slave-pointer if necessary */
  2961. if (((isdn_net_local *) (p->local->master->priv))->slave == &p->dev)
  2962. ((isdn_net_local *) (p->local->master->priv))->slave = p->local->slave;
  2963. } else {
  2964. /* Unregister only if it's a master-device */
  2965. p->dev.hard_header_cache = p->local->org_hhc;
  2966. p->dev.header_cache_update = p->local->org_hcu;
  2967. unregister_netdev(&p->dev);
  2968. }
  2969. /* Unlink device from chain */
  2970. if (q)
  2971. q->next = p->next;
  2972. else
  2973. dev->netdev = p->next;
  2974. if (p->local->slave) {
  2975. /* If this interface has a slave, remove it also */
  2976. char *slavename = ((isdn_net_local *) (p->local->slave->priv))->name;
  2977. isdn_net_dev *n = dev->netdev;
  2978. q = NULL;
  2979. while (n) {
  2980. if (!strcmp(n->local->name, slavename)) {
  2981. isdn_net_realrm(n, q);
  2982. break;
  2983. }
  2984. q = n;
  2985. n = (isdn_net_dev *) n->next;
  2986. }
  2987. }
  2988. /* If no more net-devices remain, disable auto-hangup timer */
  2989. if (dev->netdev == NULL)
  2990. isdn_timer_ctrl(ISDN_TIMER_NETHANGUP, 0);
  2991. restore_flags(flags);
  2992. kfree(p->local);
  2993. kfree(p);
  2994. return 0;
  2995. }
  2996. /*
  2997.  * Remove a single network-interface.
  2998.  */
  2999. int
  3000. isdn_net_rm(char *name)
  3001. {
  3002. isdn_net_dev *p;
  3003. isdn_net_dev *q;
  3004. /* Search name in netdev-chain */
  3005. p = dev->netdev;
  3006. q = NULL;
  3007. while (p) {
  3008. if (!strcmp(p->local->name, name))
  3009. return (isdn_net_realrm(p, q));
  3010. q = p;
  3011. p = (isdn_net_dev *) p->next;
  3012. }
  3013. /* If no more net-devices remain, disable auto-hangup timer */
  3014. if (dev->netdev == NULL)
  3015. isdn_timer_ctrl(ISDN_TIMER_NETHANGUP, 0);
  3016. return -ENODEV;
  3017. }
  3018. /*
  3019.  * Remove all network-interfaces
  3020.  */
  3021. int
  3022. isdn_net_rmall(void)
  3023. {
  3024. unsigned long flags;
  3025. int ret;
  3026. /* Walk through netdev-chain */
  3027. save_flags(flags);
  3028. cli();
  3029. while (dev->netdev) {
  3030. if (!dev->netdev->local->master) {
  3031. /* Remove master-devices only, slaves get removed with their master */
  3032. if ((ret = isdn_net_realrm(dev->netdev, NULL))) {
  3033. restore_flags(flags);
  3034. return ret;
  3035. }
  3036. }
  3037. }
  3038. dev->netdev = NULL;
  3039. restore_flags(flags);
  3040. return 0;
  3041. }