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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: isdn_net.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
  2.  *
  3.  * header for Linux ISDN subsystem, network related functions (linklevel).
  4.  *
  5.  * Copyright 1994-1999  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.  */
  13.       /* Definitions for hupflags:                */
  14. #define ISDN_WAITCHARGE  1      /* did not get a charge info yet            */
  15. #define ISDN_HAVECHARGE  2      /* We know a charge info                    */
  16. #define ISDN_CHARGEHUP   4      /* We want to use the charge mechanism      */
  17. #define ISDN_INHUP       8      /* Even if incoming, close after huptimeout */
  18. #define ISDN_MANCHARGE  16      /* Charge Interval manually set             */
  19. /*
  20.  * Definitions for Cisco-HDLC header.
  21.  */
  22. #define CISCO_ADDR_UNICAST    0x0f
  23. #define CISCO_ADDR_BROADCAST  0x8f
  24. #define CISCO_CTRL            0x00
  25. #define CISCO_TYPE_CDP        0x2000
  26. #define CISCO_TYPE_SLARP      0x8035
  27. #define CISCO_SLARP_REQUEST   0
  28. #define CISCO_SLARP_REPLY     1
  29. #define CISCO_SLARP_KEEPALIVE 2
  30. extern char *isdn_net_new(char *, struct net_device *);
  31. extern char *isdn_net_newslave(char *);
  32. extern int isdn_net_rm(char *);
  33. extern int isdn_net_rmall(void);
  34. extern int isdn_net_stat_callback(int, isdn_ctrl *);
  35. extern int isdn_net_setcfg(isdn_net_ioctl_cfg *);
  36. extern int isdn_net_getcfg(isdn_net_ioctl_cfg *);
  37. extern int isdn_net_addphone(isdn_net_ioctl_phone *);
  38. extern int isdn_net_getphones(isdn_net_ioctl_phone *, char *);
  39. extern int isdn_net_getpeer(isdn_net_ioctl_phone *, isdn_net_ioctl_phone *);
  40. extern int isdn_net_delphone(isdn_net_ioctl_phone *);
  41. extern int isdn_net_find_icall(int, int, int, setup_parm *);
  42. extern void isdn_net_hangup(struct net_device *);
  43. extern void isdn_net_dial(void);
  44. extern void isdn_net_autohup(void);
  45. extern int isdn_net_force_hangup(char *);
  46. extern int isdn_net_force_dial(char *);
  47. extern isdn_net_dev *isdn_net_findif(char *);
  48. extern int isdn_net_rcv_skb(int, struct sk_buff *);
  49. extern int isdn_net_dial_req(isdn_net_local *);
  50. extern void isdn_net_writebuf_skb(isdn_net_local *lp, struct sk_buff *skb);
  51. extern void isdn_net_write_super(isdn_net_local *lp, struct sk_buff *skb);
  52. #define ISDN_NET_MAX_QUEUE_LENGTH 2
  53. /*
  54.  * is this particular channel busy?
  55.  */
  56. static __inline__ int isdn_net_lp_busy(isdn_net_local *lp)
  57. {
  58. if (atomic_read(&lp->frame_cnt) < ISDN_NET_MAX_QUEUE_LENGTH)
  59. return 0;
  60. else 
  61. return 1;
  62. }
  63. /*
  64.  * For the given net device, this will get a non-busy channel out of the
  65.  * corresponding bundle. The returned channel is locked.
  66.  */
  67. static __inline__ isdn_net_local * isdn_net_get_locked_lp(isdn_net_dev *nd)
  68. {
  69. unsigned long flags;
  70. isdn_net_local *lp;
  71. spin_lock_irqsave(&nd->queue_lock, flags);
  72. lp = nd->queue;         /* get lp on top of queue */
  73. spin_lock_bh(&nd->queue->xmit_lock);
  74. while (isdn_net_lp_busy(nd->queue)) {
  75. spin_unlock_bh(&nd->queue->xmit_lock);
  76. nd->queue = nd->queue->next;
  77. if (nd->queue == lp) { /* not found -- should never happen */
  78. lp = NULL;
  79. goto errout;
  80. }
  81. spin_lock_bh(&nd->queue->xmit_lock);
  82. }
  83. lp = nd->queue;
  84. nd->queue = nd->queue->next;
  85. errout:
  86. spin_unlock_irqrestore(&nd->queue_lock, flags);
  87. return lp;
  88. }
  89. /*
  90.  * add a channel to a bundle
  91.  */
  92. static __inline__ void isdn_net_add_to_bundle(isdn_net_dev *nd, isdn_net_local *nlp)
  93. {
  94. isdn_net_local *lp;
  95. unsigned long flags;
  96. spin_lock_irqsave(&nd->queue_lock, flags);
  97. lp = nd->queue;
  98. // printk(KERN_DEBUG __FUNCTION__": lp:%s(%p) nlp:%s(%p) last(%p)n",
  99. // lp->name, lp, nlp->name, nlp, lp->last); 
  100. nlp->last = lp->last;
  101. lp->last->next = nlp;
  102. lp->last = nlp;
  103. nlp->next = lp;
  104. nd->queue = nlp;
  105. spin_unlock_irqrestore(&nd->queue_lock, flags);
  106. }
  107. /*
  108.  * remove a channel from the bundle it belongs to
  109.  */
  110. static __inline__ void isdn_net_rm_from_bundle(isdn_net_local *lp)
  111. {
  112. isdn_net_local *master_lp = lp;
  113. unsigned long flags;
  114. if (lp->master)
  115. master_lp = (isdn_net_local *) lp->master->priv;
  116. // printk(KERN_DEBUG __FUNCTION__": lp:%s(%p) mlp:%s(%p) last(%p) next(%p) mndq(%p)n",
  117. // lp->name, lp, master_lp->name, master_lp, lp->last, lp->next, master_lp->netdev->queue); 
  118. spin_lock_irqsave(&master_lp->netdev->queue_lock, flags);
  119. lp->last->next = lp->next;
  120. lp->next->last = lp->last;
  121. if (master_lp->netdev->queue == lp) {
  122. master_lp->netdev->queue = lp->next;
  123. if (lp->next == lp) { /* last in queue */
  124. master_lp->netdev->queue = master_lp->netdev->local;
  125. }
  126. }
  127. lp->next = lp->last = lp; /* (re)set own pointers */
  128. // printk(KERN_DEBUG __FUNCTION__": mndq(%p)n",
  129. // master_lp->netdev->queue); 
  130. spin_unlock_irqrestore(&master_lp->netdev->queue_lock, flags);
  131. }
  132. static inline int
  133. put_u8(unsigned char *p, u8 x)
  134. {
  135. *p = x;
  136. return 1;
  137. }
  138. static inline int
  139. put_u16(unsigned char *p, u16 x)
  140. {
  141. *((u16 *)p) = htons(x);
  142. return 2;
  143. }
  144. static inline int
  145. put_u32(unsigned char *p, u32 x)
  146. {
  147. *((u32 *)p) = htonl(x);
  148. return 4;
  149. }
  150. static inline int
  151. get_u8(unsigned char *p, u8 *x)
  152. {
  153. *x = *p;
  154. return 1;
  155. }
  156. static inline int
  157. get_u16(unsigned char *p, u16 *x)
  158. {
  159. *x = ntohs(*((u16 *)p));
  160. return 2;
  161. }
  162. static inline int
  163. get_u32(unsigned char *p, u32 *x)
  164. {
  165. *x = ntohl(*((u32 *)p));
  166. return 4;
  167. }