1/* 2 * OSPF Interface functions. 3 * Copyright (C) 1999 Toshiaki Takada 4 * 5 * This file is part of GNU Zebra. 6 * 7 * GNU Zebra is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published 9 * by the Free Software Foundation; either version 2, or (at your 10 * option) any later version. 11 * 12 * GNU Zebra is distributed in the hope that it will be useful, but 13 * WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with GNU Zebra; see the file COPYING. If not, write to the 19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 20 * Boston, MA 02111-1307, USA. 21 */ 22 23#ifndef _ZEBRA_OSPF_INTERFACE_H 24#define _ZEBRA_OSPF_INTERFACE_H 25 26#include "ospfd/ospf_packet.h" 27#include "ospfd/ospf_spf.h" 28 29#define IF_OSPF_IF_INFO(I) ((struct ospf_if_info *)((I)->info)) 30#define IF_DEF_PARAMS(I) (IF_OSPF_IF_INFO (I)->def_params) 31#define IF_OIFS(I) (IF_OSPF_IF_INFO (I)->oifs) 32#define IF_OIFS_PARAMS(I) (IF_OSPF_IF_INFO (I)->params) 33 34#define OSPF_IF_PARAM_CONFIGURED(S, P) ((S) && (S)->P##__config) 35#define OSPF_IF_PARAM(O, P) \ 36 (OSPF_IF_PARAM_CONFIGURED ((O)->params, P)?\ 37 (O)->params->P:IF_DEF_PARAMS((O)->ifp)->P) 38 39#define DECLARE_IF_PARAM(T, P) T P; u_char P##__config:1 40#define UNSET_IF_PARAM(S, P) ((S)->P##__config) = 0 41#define SET_IF_PARAM(S, P) ((S)->P##__config) = 1 42 43struct ospf_if_params 44{ 45 DECLARE_IF_PARAM (u_int32_t, transmit_delay); /* Interface Transmisson Delay */ 46 DECLARE_IF_PARAM (u_int32_t, output_cost_cmd);/* Command Interface Output Cost */ 47 DECLARE_IF_PARAM (u_int32_t, retransmit_interval); /* Retransmission Interval */ 48 DECLARE_IF_PARAM (u_char, passive_interface); /* OSPF Interface is passive: no sending or receiving (no need to join multicast groups) */ 49 DECLARE_IF_PARAM (u_char, priority); /* OSPF Interface priority */ 50 DECLARE_IF_PARAM (u_char, type); /* type of interface */ 51#define OSPF_IF_ACTIVE 0 52#define OSPF_IF_PASSIVE 1 53 54#define OSPF_IF_PASSIVE_STATUS(O) \ 55 (OSPF_IF_PARAM_CONFIGURED((O)->params, passive_interface) ? \ 56 (O)->params->passive_interface : \ 57 (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS((O)->ifp), passive_interface) ? \ 58 IF_DEF_PARAMS((O)->ifp)->passive_interface : \ 59 (O)->ospf->passive_interface_default)) 60 61 DECLARE_IF_PARAM (u_int32_t, v_hello); /* Hello Interval */ 62 DECLARE_IF_PARAM (u_int32_t, v_wait); /* Router Dead Interval */ 63 64 /* MTU mismatch check (see RFC2328, chap 10.6) */ 65 DECLARE_IF_PARAM (u_char, mtu_ignore); 66 67 /* Fast-Hellos */ 68 DECLARE_IF_PARAM (u_char, fast_hello); 69 70 /* Authentication data. */ 71 u_char auth_simple[OSPF_AUTH_SIMPLE_SIZE + 1]; /* Simple password. */ 72 u_char auth_simple__config:1; 73 74 DECLARE_IF_PARAM (struct list *, auth_crypt); /* List of Auth cryptographic data. */ 75 DECLARE_IF_PARAM (int, auth_type); /* OSPF authentication type */ 76 77 /* Other, non-configuration state */ 78 u_int32_t network_lsa_seqnum; /* Network LSA seqnum */ 79}; 80 81enum 82{ 83 MEMBER_ALLROUTERS = 0, 84 MEMBER_DROUTERS, 85 MEMBER_MAX, 86}; 87 88struct ospf_if_info 89{ 90 struct ospf_if_params *def_params; 91 struct route_table *params; 92 struct route_table *oifs; 93 unsigned int membership_counts[MEMBER_MAX]; /* multicast group refcnts */ 94}; 95 96struct ospf_interface; 97 98struct ospf_vl_data 99{ 100 struct in_addr vl_peer; /* Router-ID of the peer for VLs. */ 101 struct in_addr vl_area_id; /* Transit area for this VL. */ 102 int format; /* area ID format */ 103 struct ospf_interface *vl_oi; /* Interface data structure for the VL. */ 104 struct vertex_nexthop nexthop; /* Nexthop router and oi to use */ 105 struct in_addr peer_addr; /* Address used to reach the peer. */ 106 u_char flags; 107}; 108 109 110#define OSPF_VL_MAX_COUNT 256 111#define OSPF_VL_MTU 1500 112 113#define OSPF_VL_FLAG_APPROVED 0x01 114 115struct crypt_key 116{ 117 u_char key_id; 118 u_char auth_key[OSPF_AUTH_MD5_SIZE + 1]; 119}; 120 121/* OSPF interface structure. */ 122struct ospf_interface 123{ 124 /* This interface's parent ospf instance. */ 125 struct ospf *ospf; 126 127 /* OSPF Area. */ 128 struct ospf_area *area; 129 130 /* Position range in Router LSA */ 131 uint16_t lsa_pos_beg; /* inclusive, >= */ 132 uint16_t lsa_pos_end; /* exclusive, < */ 133 134 /* Interface data from zebra. */ 135 struct interface *ifp; 136 struct ospf_vl_data *vl_data; /* Data for Virtual Link */ 137 138 /* Packet send buffer. */ 139 struct ospf_fifo *obuf; /* Output queue */ 140 141 /* OSPF Network Type. */ 142 u_char type; 143 144 /* State of Interface State Machine. */ 145 u_char state; 146 147 /* To which multicast groups do we currently belong? */ 148 u_char multicast_memberships; 149#define OI_MEMBER_FLAG(M) (1 << (M)) 150#define OI_MEMBER_COUNT(O,M) (IF_OSPF_IF_INFO(oi->ifp)->membership_counts[(M)]) 151#define OI_MEMBER_CHECK(O,M) \ 152 (CHECK_FLAG((O)->multicast_memberships, OI_MEMBER_FLAG(M))) 153#define OI_MEMBER_JOINED(O,M) \ 154 do { \ 155 SET_FLAG ((O)->multicast_memberships, OI_MEMBER_FLAG(M)); \ 156 IF_OSPF_IF_INFO((O)->ifp)->membership_counts[(M)]++; \ 157 } while (0) 158#define OI_MEMBER_LEFT(O,M) \ 159 do { \ 160 UNSET_FLAG ((O)->multicast_memberships, OI_MEMBER_FLAG(M)); \ 161 IF_OSPF_IF_INFO((O)->ifp)->membership_counts[(M)]--; \ 162 } while (0) 163 164 struct prefix *address; /* Interface prefix */ 165 struct connected *connected; /* Pointer to connected */ 166 167 /* Configured varables. */ 168 struct ospf_if_params *params; 169 170 u_int32_t crypt_seqnum; /* Cryptographic Sequence Number */ 171 u_int32_t output_cost; /* Acutual Interface Output Cost */ 172 173 /* Neighbor information. */ 174 struct route_table *nbrs; /* OSPF Neighbor List */ 175 struct ospf_neighbor *nbr_self; /* Neighbor Self */ 176#define DR(I) ((I)->nbr_self->d_router) 177#define BDR(I) ((I)->nbr_self->bd_router) 178#define OPTIONS(I) ((I)->nbr_self->options) 179#define PRIORITY(I) ((I)->nbr_self->priority) 180 181 /* List of configured NBMA neighbor. */ 182 struct list *nbr_nbma; 183 184 /* self-originated LSAs. */ 185 struct ospf_lsa *network_lsa_self; /* network-LSA. */ 186#ifdef HAVE_OPAQUE_LSA 187 struct list *opaque_lsa_self; /* Type-9 Opaque-LSAs */ 188#endif /* HAVE_OPAQUE_LSA */ 189 190 struct route_table *ls_upd_queue; 191 192 struct list *ls_ack; /* Link State Acknowledgment list. */ 193 194 struct 195 { 196 struct list *ls_ack; 197 struct in_addr dst; 198 } ls_ack_direct; 199 200 /* Timer values. */ 201 u_int32_t v_ls_ack; /* Delayed Link State Acknowledgment */ 202 203 /* Threads. */ 204 struct thread *t_hello; /* timer */ 205 struct thread *t_wait; /* timer */ 206 struct thread *t_ls_ack; /* timer */ 207 struct thread *t_ls_ack_direct; /* event */ 208 struct thread *t_ls_upd_event; /* event */ 209#ifdef HAVE_OPAQUE_LSA 210 struct thread *t_opaque_lsa_self; /* Type-9 Opaque-LSAs */ 211#endif /* HAVE_OPAQUE_LSA */ 212 213 int on_write_q; 214 215 /* Statistics fields. */ 216 u_int32_t hello_in; /* Hello message input count. */ 217 u_int32_t hello_out; /* Hello message output count. */ 218 u_int32_t db_desc_in; /* database desc. message input count. */ 219 u_int32_t db_desc_out; /* database desc. message output count. */ 220 u_int32_t ls_req_in; /* LS request message input count. */ 221 u_int32_t ls_req_out; /* LS request message output count. */ 222 u_int32_t ls_upd_in; /* LS update message input count. */ 223 u_int32_t ls_upd_out; /* LS update message output count. */ 224 u_int32_t ls_ack_in; /* LS Ack message input count. */ 225 u_int32_t ls_ack_out; /* LS Ack message output count. */ 226 u_int32_t discarded; /* discarded input count by error. */ 227 u_int32_t state_change; /* Number of status change. */ 228 229 u_int32_t full_nbrs; 230}; 231 232/* Prototypes. */ 233extern char *ospf_if_name (struct ospf_interface *); 234extern struct ospf_interface *ospf_if_new (struct ospf *, struct interface *, 235 struct prefix *); 236extern void ospf_if_cleanup (struct ospf_interface *); 237extern void ospf_if_free (struct ospf_interface *); 238extern int ospf_if_up (struct ospf_interface *); 239extern int ospf_if_down (struct ospf_interface *); 240 241extern int ospf_if_is_up (struct ospf_interface *); 242extern struct ospf_interface *ospf_if_exists (struct ospf_interface *); 243extern struct ospf_interface *ospf_if_lookup_by_lsa_pos (struct ospf_area *, 244 int); 245extern struct ospf_interface *ospf_if_lookup_by_local_addr (struct ospf *, 246 struct interface 247 *, 248 struct in_addr); 249extern struct ospf_interface *ospf_if_lookup_by_prefix (struct ospf *, 250 struct prefix_ipv4 *); 251extern struct ospf_interface *ospf_if_table_lookup (struct interface *, 252 struct prefix *); 253extern struct ospf_interface *ospf_if_addr_local (struct in_addr); 254extern struct ospf_interface *ospf_if_lookup_recv_if (struct ospf *, 255 struct in_addr, 256 struct interface *); 257extern struct ospf_interface *ospf_if_is_configured (struct ospf *, 258 struct in_addr *); 259 260extern struct ospf_if_params *ospf_lookup_if_params (struct interface *, 261 struct in_addr); 262extern struct ospf_if_params *ospf_get_if_params (struct interface *, 263 struct in_addr); 264extern void ospf_del_if_params (struct ospf_if_params *); 265extern void ospf_free_if_params (struct interface *, struct in_addr); 266extern void ospf_if_update_params (struct interface *, struct in_addr); 267 268extern int ospf_if_new_hook (struct interface *); 269extern void ospf_if_init (void); 270extern void ospf_if_stream_set (struct ospf_interface *); 271extern void ospf_if_stream_unset (struct ospf_interface *); 272extern void ospf_if_reset_variables (struct ospf_interface *); 273extern int ospf_if_is_enable (struct ospf_interface *); 274extern int ospf_if_get_output_cost (struct ospf_interface *); 275extern void ospf_if_recalculate_output_cost (struct interface *); 276 277/* Simulate down/up on the interface. */ 278extern void ospf_if_reset (struct interface *); 279 280extern struct ospf_interface *ospf_vl_new (struct ospf *, 281 struct ospf_vl_data *); 282extern struct ospf_vl_data *ospf_vl_data_new (struct ospf_area *, 283 struct in_addr); 284extern struct ospf_vl_data *ospf_vl_lookup (struct ospf *, struct ospf_area *, 285 struct in_addr); 286extern void ospf_vl_data_free (struct ospf_vl_data *); 287extern void ospf_vl_add (struct ospf *, struct ospf_vl_data *); 288extern void ospf_vl_delete (struct ospf *, struct ospf_vl_data *); 289extern void ospf_vl_up_check (struct ospf_area *, struct in_addr, 290 struct vertex *); 291extern void ospf_vl_unapprove (struct ospf *); 292extern void ospf_vl_shut_unapproved (struct ospf *); 293extern int ospf_full_virtual_nbrs (struct ospf_area *); 294extern int ospf_vls_in_area (struct ospf_area *); 295 296extern struct crypt_key *ospf_crypt_key_lookup (struct list *, u_char); 297extern struct crypt_key *ospf_crypt_key_new (void); 298extern void ospf_crypt_key_add (struct list *, struct crypt_key *); 299extern int ospf_crypt_key_delete (struct list *, u_char); 300 301extern u_char ospf_default_iftype (struct interface *ifp); 302 303/* Set all multicast memberships appropriately based on the type and 304 state of the interface. */ 305extern void ospf_if_set_multicast (struct ospf_interface *); 306 307#endif /* _ZEBRA_OSPF_INTERFACE_H */ 308