2  * IS-IS Rout(e)ing protocol - isis_circuit.h
 
   4  * Copyright (C) 2001,2002   Sampo Saaristo
 
   5  *                           Tampere University of Technology      
 
   6  *                           Institute of Communications Engineering
 
   8  * This program is free software; you can redistribute it and/or modify it 
 
   9  * under the terms of the GNU General Public Licenseas published by the Free 
 
  10  * Software Foundation; either version 2 of the License, or (at your option) 
 
  13  * This program is distributed in the hope that it will be useful,but WITHOUT 
 
  14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
 
  15  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
 
  18  * You should have received a copy of the GNU General Public License along 
 
  19  * with this program; if not, write to the Free Software Foundation, Inc., 
 
  20  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
  23 #ifndef ISIS_CIRCUIT_H
 
  24 #define ISIS_CIRCUIT_H
 
  29 #include "isis_constants.h"
 
  30 #include "isis_common.h"
 
  32 #define CIRCUIT_MAX 255
 
  36   struct password *next;
 
  43   u_char metric_default;
 
  45   u_char metric_expense;
 
  49 struct isis_bcast_info
 
  51   u_char snpa[ETH_ALEN];        /* SNPA of this circuit */
 
  52   char run_dr_elect[2];         /* Should we run dr election ? */
 
  53   struct thread *t_run_dr[2];   /* DR election thread */
 
  54   struct thread *t_send_lan_hello[2];   /* send LAN IIHs in this thread */
 
  55   struct list *adjdb[2];        /* adjacency dbs */
 
  56   struct list *lan_neighs[2];   /* list of lx neigh snpa */
 
  57   char is_dr[2];                /* Are we level x DR ? */
 
  58   u_char l1_desig_is[ISIS_SYS_ID_LEN + 1];      /* level-1 DR */
 
  59   u_char l2_desig_is[ISIS_SYS_ID_LEN + 1];      /* level-2 DR */
 
  60   struct thread *t_refresh_pseudo_lsp[2];       /* refresh pseudo-node LSPs */
 
  65   struct isis_adjacency *neighbor;
 
  66   struct thread *t_send_p2p_hello;      /* send P2P IIHs in this thread  */
 
  72   u_char circuit_id;            /* l1/l2 p2p/bcast CircuitID */
 
  73   struct isis_area *area;       /* back pointer to the area */
 
  74   struct interface *interface;  /* interface info from z */
 
  75   int fd;                       /* IS-IS l1/2 socket */
 
  76   int sap_length;               /* SAP length for DLPI */
 
  81   struct thread *t_read;
 
  82   struct thread *t_send_csnp[2];
 
  83   struct thread *t_send_psnp[2];
 
  84   struct list *lsp_queue;       /* LSPs to be txed (both levels) */
 
  85   time_t lsp_queue_last_cleared;/* timestamp used to enforce transmit interval;
 
  86                                  * for scalability, use one timestamp per 
 
  87                                  * circuit, instead of one per lsp per circuit
 
  89   /* there is no real point in two streams, just for programming kicker */
 
  90   int (*rx) (struct isis_circuit * circuit, u_char * ssnpa);
 
  91   struct stream *rcv_stream;    /* Stream for receiving */
 
  92   int (*tx) (struct isis_circuit * circuit, int level);
 
  93   struct stream *snd_stream;    /* Stream for sending */
 
  94   int idx;                      /* idx in S[RM|SN] flags */
 
  95 #define CIRCUIT_T_UNKNOWN    0
 
  96 #define CIRCUIT_T_BROADCAST  1
 
  97 #define CIRCUIT_T_P2P        2
 
  98 #define CIRCUIT_T_LOOPBACK   3
 
  99   int circ_type;                /* type of the physical interface */
 
 100   int circ_type_config;         /* config type of the physical interface */
 
 103     struct isis_bcast_info bc;
 
 104     struct isis_p2p_info p2p;
 
 106   u_char priority[2];           /* l1/2 IS configured priority */
 
 107   int pad_hellos;               /* add padding to Hello PDUs ? */
 
 108   char ext_domain;              /* externalDomain   (boolean) */
 
 109   int lsp_regenerate_pending[ISIS_LEVELS];
 
 113   struct isis_passwd passwd;    /* Circuit rx/tx password */
 
 114   int is_type;                  /* circuit is type == level of circuit
 
 115                                  * differentiated from circuit type (media) */
 
 116   u_int32_t hello_interval[2];  /* l1HelloInterval in msecs */
 
 117   u_int16_t hello_multiplier[2];        /* l1HelloMultiplier */
 
 118   u_int16_t csnp_interval[2];   /* level-1 csnp-interval in seconds */
 
 119   u_int16_t psnp_interval[2];   /* level-1 psnp-interval in seconds */
 
 121   u_int32_t te_metric[2];
 
 122   struct mpls_te_circuit *mtc; /* Support for MPLS-TE parameters - see isis_te.[c,h] */
 
 123   int ip_router;                /* Route IP ? */
 
 124   int is_passive;               /* Is Passive ? */
 
 125   struct list *ip_addrs;        /* our IP addresses */
 
 127   int ipv6_router;              /* Route IPv6 ? */
 
 128   struct list *ipv6_link;       /* our link local IPv6 addresses */
 
 129   struct list *ipv6_non_link;   /* our non-link local IPv6 addresses */
 
 130 #endif                          /* HAVE_IPV6 */
 
 131   u_int16_t upadjcount[2];
 
 132 #define ISIS_CIRCUIT_FLAPPED_AFTER_SPF 0x01
 
 135    * Counters as in 10589--11.2.5.9
 
 137   u_int32_t adj_state_changes;  /* changesInAdjacencyState */
 
 138   u_int32_t init_failures;      /* intialisationFailures */
 
 139   u_int32_t ctrl_pdus_rxed;     /* controlPDUsReceived */
 
 140   u_int32_t ctrl_pdus_txed;     /* controlPDUsSent */
 
 141   u_int32_t desig_changes[2];   /* lanLxDesignatedIntermediateSystemChanges */
 
 142   u_int32_t rej_adjacencies;    /* rejectedAdjacencies */
 
 145 void isis_circuit_init (void);
 
 146 struct isis_circuit *isis_circuit_new (void);
 
 147 void isis_circuit_del (struct isis_circuit *circuit);
 
 148 struct isis_circuit *circuit_lookup_by_ifp (struct interface *ifp,
 
 150 struct isis_circuit *circuit_scan_by_ifp (struct interface *ifp);
 
 151 void isis_circuit_configure (struct isis_circuit *circuit,
 
 152                              struct isis_area *area);
 
 153 void isis_circuit_deconfigure (struct isis_circuit *circuit,
 
 154                                struct isis_area *area);
 
 155 void isis_circuit_if_add (struct isis_circuit *circuit,
 
 156                           struct interface *ifp);
 
 157 void isis_circuit_if_del (struct isis_circuit *circuit,
 
 158                           struct interface *ifp);
 
 159 void isis_circuit_if_bind (struct isis_circuit *circuit,
 
 160                            struct interface *ifp);
 
 161 void isis_circuit_if_unbind (struct isis_circuit *circuit,
 
 162                              struct interface *ifp);
 
 163 void isis_circuit_add_addr (struct isis_circuit *circuit,
 
 164                             struct connected *conn);
 
 165 void isis_circuit_del_addr (struct isis_circuit *circuit,
 
 166                             struct connected *conn);
 
 167 int isis_circuit_up (struct isis_circuit *circuit);
 
 168 void isis_circuit_down (struct isis_circuit *);
 
 169 void circuit_update_nlpids (struct isis_circuit *circuit);
 
 170 void isis_circuit_print_vty (struct isis_circuit *circuit, struct vty *vty,
 
 172 size_t isis_circuit_pdu_size(struct isis_circuit *circuit);
 
 173 void isis_circuit_stream(struct isis_circuit *circuit, struct stream **stream);
 
 175 struct isis_circuit *isis_circuit_create (struct isis_area *area, struct interface *ifp);
 
 176 void isis_circuit_af_set (struct isis_circuit *circuit, bool ip_router, bool ipv6_router);
 
 177 int  isis_circuit_passive_set (struct isis_circuit *circuit, bool passive);
 
 178 void isis_circuit_is_type_set (struct isis_circuit *circuit, int is_type);
 
 179 int  isis_circuit_circ_type_set (struct isis_circuit *circuit, int circ_type);
 
 181 int  isis_circuit_metric_set (struct isis_circuit *circuit, int level, int metric);
 
 183 int  isis_circuit_passwd_unset (struct isis_circuit *circuit);
 
 184 int  isis_circuit_passwd_cleartext_set (struct isis_circuit *circuit, const char *passwd);
 
 185 int  isis_circuit_passwd_hmac_md5_set (struct isis_circuit *circuit, const char *passwd);
 
 187 #endif /* _ZEBRA_ISIS_CIRCUIT_H */