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