1 /* 2 * Lec arp cache 3 * Marko Kiiskila mkiiskila@yahoo.com 4 * 5 */ 6 #ifndef _LEC_ARP_H 7 #define _LEC_ARP_H 8 #include <linux/atm.h> 9 #include <linux/atmdev.h> 10 #include <linux/if_ether.h> 11 #include <linux/atmlec.h> 12 13 struct lec_arp_table { 14 struct lec_arp_table *next; /* Linked entry list */ 15 unsigned char atm_addr[ATM_ESA_LEN]; /* Atm address */ 16 unsigned char mac_addr[ETH_ALEN]; /* Mac address */ 17 int is_rdesc; /* Mac address is a route descriptor */ 18 struct atm_vcc *vcc; /* Vcc this entry is attached */ 19 struct atm_vcc *recv_vcc; /* Vcc we receive data from */ 20 void (*old_push)(struct atm_vcc *vcc,struct sk_buff *skb); 21 /* Push that leads to daemon */ 22 void (*old_recv_push)(struct atm_vcc *vcc, struct sk_buff *skb); 23 /* Push that leads to daemon */ 24 void (*old_close)(struct atm_vcc *vcc); 25 /* We want to see when this 26 * vcc gets closed */ 27 unsigned long last_used; /* For expiry */ 28 unsigned long timestamp; /* Used for various timestamping 29 * things: 30 * 1. FLUSH started 31 * (status=ESI_FLUSH_PENDING) 32 * 2. Counting to 33 * max_unknown_frame_time 34 * (status=ESI_ARP_PENDING|| 35 * status=ESI_VC_PENDING) 36 */ 37 unsigned char no_tries; /* No of times arp retry has been 38 tried */ 39 unsigned char status; /* Status of this entry */ 40 unsigned short flags; /* Flags for this entry */ 41 unsigned short packets_flooded; /* Data packets flooded */ 42 unsigned long flush_tran_id; /* Transaction id in flush protocol */ 43 struct timer_list timer; /* Arping timer */ 44 struct lec_priv *priv; /* Pointer back */ 45 46 u8 *tlvs; /* LANE2: Each MAC address can have TLVs */ 47 u32 sizeoftlvs; /* associated with it. sizeoftlvs tells the */ 48 /* the length of the tlvs array */ 49 struct sk_buff_head tx_wait; /* wait queue for outgoing packets */ 50 }; 51 52 struct tlv { /* LANE2: Template tlv struct for accessing */ 53 /* the tlvs in the lec_arp_table->tlvs array*/ 54 u32 type; 55 u8 length; 56 u8 value[255]; 57 }; 58 59 /* Status fields */ 60 #define ESI_UNKNOWN 0 /* 61 * Next packet sent to this mac address 62 * causes ARP-request to be sent 63 */ 64 #define ESI_ARP_PENDING 1 /* 65 * There is no ATM address associated with this 66 * 48-bit address. The LE-ARP protocol is in 67 * progress. 68 */ 69 #define ESI_VC_PENDING 2 /* 70 * There is a valid ATM address associated with 71 * this 48-bit address but there is no VC set 72 * up to that ATM address. The signaling 73 * protocol is in process. 74 */ 75 #define ESI_FLUSH_PENDING 4 /* 76 * The LEC has been notified of the FLUSH_START 77 * status and it is assumed that the flush 78 * protocol is in process. 79 */ 80 #define ESI_FORWARD_DIRECT 5 /* 81 * Either the Path Switching Delay (C22) has 82 * elapsed or the LEC has notified the Mapping 83 * that the flush protocol has completed. In 84 * either case, it is safe to forward packets 85 * to this address via the data direct VC. 86 */ 87 88 /* Flag values */ 89 #define LEC_REMOTE_FLAG 0x0001 90 #define LEC_PERMANENT_FLAG 0x0002 91 92 /* Protos */ 93 void lec_arp_init(struct lec_priv *priv); 94 int lec_mcast_make(struct lec_priv *priv, struct atm_vcc *vcc); 95 void lec_arp_destroy(struct lec_priv *priv); 96 void lec_vcc_close(struct lec_priv *priv, struct atm_vcc *vcc); 97 98 struct atm_vcc *lec_arp_resolve(struct lec_priv *priv, 99 unsigned char *mac_to_addr, 100 int is_rdesc, 101 struct lec_arp_table **ret_entry); 102 void lec_vcc_added(struct lec_priv *dev, 103 struct atmlec_ioc *ioc_data, struct atm_vcc *vcc, 104 void (*old_push)(struct atm_vcc *vcc, struct sk_buff *skb)); 105 void lec_arp_check_empties(struct lec_priv *priv, 106 struct atm_vcc *vcc, struct sk_buff *skb); 107 int lec_addr_delete(struct lec_priv *priv, 108 unsigned char *mac_addr, unsigned long permanent); 109 void lec_flush_complete(struct lec_priv *priv, unsigned long tran_id); 110 void lec_arp_update(struct lec_priv *priv, 111 unsigned char *mac_addr, unsigned char *atm_addr, 112 unsigned long remoteflag, unsigned int targetless_le_arp); 113 void lec_set_flush_tran_id(struct lec_priv *priv, 114 unsigned char *mac_addr, unsigned long tran_id); 115 116 #endif 117