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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _NET_DN_DEV_H
  2. #define _NET_DN_DEV_H
  3. struct dn_dev;
  4. struct dn_ifaddr {
  5. struct dn_ifaddr *ifa_next;
  6. struct dn_dev    *ifa_dev;
  7. dn_address       ifa_local;
  8. unsigned char    ifa_flags;
  9. unsigned char    ifa_scope;
  10. char             ifa_label[IFNAMSIZ];
  11. };
  12. #define DN_DEV_S_RU  0 /* Run - working normally   */
  13. #define DN_DEV_S_CR  1 /* Circuit Rejected         */
  14. #define DN_DEV_S_DS  2 /* Data Link Start          */
  15. #define DN_DEV_S_RI  3 /* Routing Layer Initialize */
  16. #define DN_DEV_S_RV  4 /* Routing Layer Verify     */
  17. #define DN_DEV_S_RC  5 /* Routing Layer Complete   */
  18. #define DN_DEV_S_OF  6 /* Off                      */
  19. #define DN_DEV_S_HA  7 /* Halt                     */
  20. /*
  21.  * The dn_dev_parms structure contains the set of parameters
  22.  * for each device (hence inclusion in the dn_dev structure)
  23.  * and an array is used to store the default types of supported
  24.  * device (in dn_dev.c).
  25.  *
  26.  * The type field matches the ARPHRD_ constants and is used in
  27.  * searching the list for supported devices when new devices
  28.  * come up.
  29.  *
  30.  * The mode field is used to find out if a device is broadcast,
  31.  * multipoint, or pointopoint. Please note that DECnet thinks
  32.  * different ways about devices to the rest of the kernel
  33.  * so the normal IFF_xxx flags are invalid here. For devices
  34.  * which can be any combination of the previously mentioned
  35.  * attributes, you can set this on a per device basis by
  36.  * installing an up() routine.
  37.  *
  38.  * The device state field, defines the initial state in which the
  39.  * device will come up. In the dn_dev structure, it is the actual
  40.  * state.
  41.  *
  42.  * Things have changed here. I've killed timer1 since its a user space
  43.  * issue for a user space routing deamon to sort out. The kernel does
  44.  * not need to be bothered with it.
  45.  *
  46.  * Timers:
  47.  * t2 - Rate limit timer, min time between routing and hello messages
  48.  * t3 - Hello timer, send hello messages when it expires
  49.  *
  50.  * Callbacks:
  51.  * up() - Called to initialize device, return value can veto use of
  52.  *        device with DECnet.
  53.  * down() - Called to turn device off when it goes down
  54.  * timer3() - Called when timer 3 goes off
  55.  * 
  56.  * sysctl - Hook for sysctl things
  57.  *
  58.  */
  59. struct dn_dev_parms {
  60. int type;           /* ARPHRD_xxx                         */
  61. int mode;           /* Broadcast, Unicast, Mulitpoint     */
  62. #define DN_DEV_BCAST  1
  63. #define DN_DEV_UCAST  2
  64. #define DN_DEV_MPOINT 4
  65. int state;                /* Initial state                      */
  66. int forwarding;           /* 0=EndNode, 1=L1Router, 2=L2Router  */
  67. unsigned short blksize;   /* Block Size                         */
  68. unsigned long t2;         /* Default value of t2                */
  69. unsigned long t3;         /* Default value of t3                */
  70. int priority;             /* Priority to be a router            */
  71. char *name;               /* Name for sysctl                    */
  72. int ctl_name;             /* Index for sysctl                   */
  73. int  (*up)(struct net_device *);
  74. void (*down)(struct net_device *);
  75. void (*timer3)(struct net_device *);
  76. void *sysctl;
  77. };
  78. struct dn_dev {
  79. struct dn_ifaddr *ifa_list;
  80. struct net_device *dev;
  81. struct dn_dev_parms parms;
  82. char use_long;
  83.         struct timer_list timer;
  84.         unsigned long t3;
  85. struct neigh_parms *neigh_parms;
  86. unsigned char addr[ETH_ALEN];
  87. struct neighbour *router; /* Default router on circuit */
  88. struct neighbour *peer;   /* Peer on pointopoint links */
  89. unsigned long uptime;     /* Time device went up in jiffies */
  90. };
  91. struct dn_short_packet
  92. {
  93. unsigned char   msgflg          __attribute__((packed));
  94.         unsigned short  dstnode         __attribute__((packed));
  95.         unsigned short  srcnode         __attribute__((packed));
  96.         unsigned char   forward         __attribute__((packed));
  97. };
  98. struct dn_long_packet
  99. {
  100. unsigned char   msgflg          __attribute__((packed));
  101.         unsigned char   d_area          __attribute__((packed));
  102.         unsigned char   d_subarea       __attribute__((packed));
  103.         unsigned char   d_id[6]         __attribute__((packed));
  104.         unsigned char   s_area          __attribute__((packed));
  105.         unsigned char   s_subarea       __attribute__((packed));
  106.         unsigned char   s_id[6]         __attribute__((packed));
  107.         unsigned char   nl2             __attribute__((packed));
  108.         unsigned char   visit_ct        __attribute__((packed));
  109.         unsigned char   s_class         __attribute__((packed));
  110.         unsigned char   pt              __attribute__((packed));
  111. };
  112. /*------------------------- DRP - Routing messages ---------------------*/
  113. struct endnode_hello_message
  114. {
  115. unsigned char   msgflg          __attribute__((packed));
  116.         unsigned char   tiver[3]        __attribute__((packed));
  117.         unsigned char   id[6]           __attribute__((packed));
  118.         unsigned char   iinfo           __attribute__((packed));
  119.         unsigned short  blksize         __attribute__((packed));
  120.         unsigned char   area            __attribute__((packed));
  121.         unsigned char   seed[8]         __attribute__((packed));
  122.         unsigned char   neighbor[6]     __attribute__((packed));
  123.         unsigned short  timer           __attribute__((packed));
  124.         unsigned char   mpd             __attribute__((packed));
  125.         unsigned char   datalen         __attribute__((packed));
  126.         unsigned char   data[2]         __attribute__((packed));
  127. };
  128. struct rtnode_hello_message
  129. {
  130. unsigned char   msgflg          __attribute__((packed));
  131.         unsigned char   tiver[3]        __attribute__((packed));
  132.         unsigned char   id[6]           __attribute__((packed));
  133.         unsigned char   iinfo           __attribute__((packed));
  134.         unsigned short  blksize         __attribute__((packed));
  135.         unsigned char   priority        __attribute__((packed));
  136.         unsigned char   area            __attribute__((packed));
  137.         unsigned short  timer           __attribute__((packed));
  138.         unsigned char   mpd             __attribute__((packed));
  139. };
  140. extern void dn_dev_init(void);
  141. extern void dn_dev_cleanup(void);
  142. extern int dn_dev_ioctl(unsigned int cmd, void *arg);
  143. extern void dn_dev_devices_off(void);
  144. extern void dn_dev_devices_on(void);
  145. extern void dn_dev_init_pkt(struct sk_buff *skb);
  146. extern void dn_dev_veri_pkt(struct sk_buff *skb);
  147. extern void dn_dev_hello(struct sk_buff *skb);
  148. extern void dn_dev_up(struct net_device *);
  149. extern void dn_dev_down(struct net_device *);
  150. extern struct net_device *decnet_default_device;
  151. static __inline__ int dn_dev_islocal(struct net_device *dev, dn_address addr)
  152. {
  153. struct dn_dev *dn_db = dev->dn_ptr;
  154. struct dn_ifaddr *ifa;
  155. if (dn_db == NULL) {
  156. printk(KERN_DEBUG "dn_dev_islocal: Called for non DECnet devicen");
  157. return 0;
  158. }
  159. for(ifa = dn_db->ifa_list; ifa; ifa = ifa->ifa_next)
  160. if ((addr ^ ifa->ifa_local) == 0)
  161. return 1;
  162. return 0;
  163. }
  164. #endif /* _NET_DN_DEV_H */