2005-04-17 02:20:36 +04:00
# ifndef _NET_DN_DEV_H
# define _NET_DN_DEV_H
struct dn_dev ;
struct dn_ifaddr {
struct dn_ifaddr * ifa_next ;
struct dn_dev * ifa_dev ;
dn_address ifa_local ;
dn_address ifa_address ;
unsigned char ifa_flags ;
unsigned char ifa_scope ;
char ifa_label [ IFNAMSIZ ] ;
} ;
# define DN_DEV_S_RU 0 /* Run - working normally */
# define DN_DEV_S_CR 1 /* Circuit Rejected */
# define DN_DEV_S_DS 2 /* Data Link Start */
# define DN_DEV_S_RI 3 /* Routing Layer Initialize */
# define DN_DEV_S_RV 4 /* Routing Layer Verify */
# define DN_DEV_S_RC 5 /* Routing Layer Complete */
# define DN_DEV_S_OF 6 /* Off */
# define DN_DEV_S_HA 7 /* Halt */
/*
* The dn_dev_parms structure contains the set of parameters
* for each device ( hence inclusion in the dn_dev structure )
* and an array is used to store the default types of supported
* device ( in dn_dev . c ) .
*
* The type field matches the ARPHRD_ constants and is used in
* searching the list for supported devices when new devices
* come up .
*
* The mode field is used to find out if a device is broadcast ,
* multipoint , or pointopoint . Please note that DECnet thinks
* different ways about devices to the rest of the kernel
* so the normal IFF_xxx flags are invalid here . For devices
* which can be any combination of the previously mentioned
* attributes , you can set this on a per device basis by
* installing an up ( ) routine .
*
* The device state field , defines the initial state in which the
* device will come up . In the dn_dev structure , it is the actual
* state .
*
* Things have changed here . I ' ve killed timer1 since it ' s a user space
* issue for a user space routing deamon to sort out . The kernel does
* not need to be bothered with it .
*
* Timers :
* t2 - Rate limit timer , min time between routing and hello messages
* t3 - Hello timer , send hello messages when it expires
*
* Callbacks :
* up ( ) - Called to initialize device , return value can veto use of
* device with DECnet .
* down ( ) - Called to turn device off when it goes down
* timer3 ( ) - Called once for each ifaddr when timer 3 goes off
*
* sysctl - Hook for sysctl things
*
*/
struct dn_dev_parms {
int type ; /* ARPHRD_xxx */
int mode ; /* Broadcast, Unicast, Mulitpoint */
# define DN_DEV_BCAST 1
# define DN_DEV_UCAST 2
# define DN_DEV_MPOINT 4
int state ; /* Initial state */
int forwarding ; /* 0=EndNode, 1=L1Router, 2=L2Router */
unsigned long t2 ; /* Default value of t2 */
unsigned long t3 ; /* Default value of t3 */
int priority ; /* Priority to be a router */
char * name ; /* Name for sysctl */
int ctl_name ; /* Index for sysctl */
int ( * up ) ( struct net_device * ) ;
void ( * down ) ( struct net_device * ) ;
void ( * timer3 ) ( struct net_device * , struct dn_ifaddr * ifa ) ;
void * sysctl ;
} ;
struct dn_dev {
struct dn_ifaddr * ifa_list ;
struct net_device * dev ;
struct dn_dev_parms parms ;
char use_long ;
2006-01-08 12:05:07 +03:00
struct timer_list timer ;
unsigned long t3 ;
2005-04-17 02:20:36 +04:00
struct neigh_parms * neigh_parms ;
unsigned char addr [ ETH_ALEN ] ;
struct neighbour * router ; /* Default router on circuit */
struct neighbour * peer ; /* Peer on pointopoint links */
unsigned long uptime ; /* Time device went up in jiffies */
} ;
struct dn_short_packet
{
2006-01-08 12:05:07 +03:00
unsigned char msgflg ;
unsigned short dstnode ;
unsigned short srcnode ;
unsigned char forward ;
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
struct dn_long_packet
{
2006-01-08 12:05:07 +03:00
unsigned char msgflg ;
unsigned char d_area ;
unsigned char d_subarea ;
unsigned char d_id [ 6 ] ;
unsigned char s_area ;
unsigned char s_subarea ;
unsigned char s_id [ 6 ] ;
unsigned char nl2 ;
unsigned char visit_ct ;
unsigned char s_class ;
unsigned char pt ;
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
/*------------------------- DRP - Routing messages ---------------------*/
struct endnode_hello_message
{
2006-01-08 12:05:07 +03:00
unsigned char msgflg ;
unsigned char tiver [ 3 ] ;
unsigned char id [ 6 ] ;
unsigned char iinfo ;
unsigned short blksize ;
unsigned char area ;
unsigned char seed [ 8 ] ;
unsigned char neighbor [ 6 ] ;
unsigned short timer ;
unsigned char mpd ;
unsigned char datalen ;
unsigned char data [ 2 ] ;
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
struct rtnode_hello_message
{
2006-01-08 12:05:07 +03:00
unsigned char msgflg ;
unsigned char tiver [ 3 ] ;
unsigned char id [ 6 ] ;
unsigned char iinfo ;
unsigned short blksize ;
unsigned char priority ;
unsigned char area ;
unsigned short timer ;
unsigned char mpd ;
} __attribute__ ( ( packed ) ) ;
2005-04-17 02:20:36 +04:00
extern void dn_dev_init ( void ) ;
extern void dn_dev_cleanup ( void ) ;
extern int dn_dev_ioctl ( unsigned int cmd , void __user * arg ) ;
extern void dn_dev_devices_off ( void ) ;
extern void dn_dev_devices_on ( void ) ;
extern void dn_dev_init_pkt ( struct sk_buff * skb ) ;
extern void dn_dev_veri_pkt ( struct sk_buff * skb ) ;
extern void dn_dev_hello ( struct sk_buff * skb ) ;
extern void dn_dev_up ( struct net_device * ) ;
extern void dn_dev_down ( struct net_device * ) ;
extern int dn_dev_set_default ( struct net_device * dev , int force ) ;
extern struct net_device * dn_dev_get_default ( void ) ;
extern int dn_dev_bind_default ( dn_address * addr ) ;
extern int register_dnaddr_notifier ( struct notifier_block * nb ) ;
extern int unregister_dnaddr_notifier ( struct notifier_block * nb ) ;
static inline int dn_dev_islocal ( struct net_device * dev , dn_address addr )
{
struct dn_dev * dn_db = dev - > dn_ptr ;
struct dn_ifaddr * ifa ;
if ( dn_db = = NULL ) {
printk ( KERN_DEBUG " dn_dev_islocal: Called for non DECnet device \n " ) ;
return 0 ;
}
for ( ifa = dn_db - > ifa_list ; ifa ; ifa = ifa - > ifa_next )
if ( ( addr ^ ifa - > ifa_local ) = = 0 )
return 1 ;
return 0 ;
}
# endif /* _NET_DN_DEV_H */