File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird / proto / bfd / bfd.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Aug 22 12:33:54 2017 UTC (6 years, 10 months ago) by misho
Branches: bird, MAIN
CVS tags: v1_6_8p3, v1_6_3p0, v1_6_3, HEAD
bird 1.6.3

    1: /*
    2:  *	BIRD -- Bidirectional Forwarding Detection (BFD)
    3:  *
    4:  *	Can be freely distributed and used under the terms of the GNU GPL.
    5:  */
    6: 
    7: #ifndef _BIRD_BFD_H_
    8: #define _BIRD_BFD_H_
    9: 
   10: #include <pthread.h>
   11: 
   12: #include "nest/bird.h"
   13: #include "nest/cli.h"
   14: #include "nest/iface.h"
   15: #include "nest/protocol.h"
   16: #include "nest/route.h"
   17: #include "nest/password.h"
   18: #include "conf/conf.h"
   19: #include "lib/hash.h"
   20: #include "lib/resource.h"
   21: #include "lib/socket.h"
   22: #include "lib/string.h"
   23: 
   24: #include "nest/bfd.h"
   25: #include "io.h"
   26: 
   27: 
   28: #define BFD_CONTROL_PORT	3784
   29: #define BFD_ECHO_PORT		3785
   30: #define BFD_MULTI_CTL_PORT	4784
   31: 
   32: #define BFD_DEFAULT_MIN_RX_INT	(10 MS_)
   33: #define BFD_DEFAULT_MIN_TX_INT	(100 MS_)
   34: #define BFD_DEFAULT_IDLE_TX_INT	(1 S_)
   35: #define BFD_DEFAULT_MULTIPLIER	5
   36: 
   37: 
   38: struct bfd_iface_config;
   39: 
   40: struct bfd_config
   41: {
   42:   struct proto_config c;
   43:   list patt_list;		/* List of iface configs (struct bfd_iface_config) */
   44:   list neigh_list;		/* List of configured neighbors (struct bfd_neighbor) */
   45:   struct bfd_iface_config *multihop; /* Multihop pseudoiface config */
   46: };
   47: 
   48: struct bfd_iface_config
   49: {
   50:   struct iface_patt i;
   51:   u32 min_rx_int;
   52:   u32 min_tx_int;
   53:   u32 idle_tx_int;
   54:   u8 multiplier;
   55:   u8 passive;
   56:   u8 auth_type;				/* Authentication type (BFD_AUTH_*) */
   57:   list *passwords;			/* Passwords for authentication */
   58: };
   59: 
   60: struct bfd_neighbor
   61: {
   62:   node n;
   63:   ip_addr addr;
   64:   ip_addr local;
   65:   struct iface *iface;
   66: 
   67:   struct neighbor *neigh;
   68:   struct bfd_request *req;
   69: 
   70:   u8 multihop;
   71:   u8 active;
   72: };
   73: 
   74: struct bfd_proto
   75: {
   76:   struct proto p;
   77:   struct birdloop *loop;
   78:   pool *tpool;
   79:   pthread_spinlock_t lock;
   80:   node bfd_node;
   81: 
   82:   slab *session_slab;
   83:   HASH(struct bfd_session) session_hash_id;
   84:   HASH(struct bfd_session) session_hash_ip;
   85: 
   86:   sock *notify_rs;
   87:   sock *notify_ws;
   88:   list notify_list;
   89: 
   90:   sock *rx_1;
   91:   sock *rx_m;
   92:   list iface_list;
   93: };
   94: 
   95: struct bfd_iface
   96: {
   97:   node n;
   98:   ip_addr local;
   99:   struct iface *iface;
  100:   struct bfd_iface_config *cf;
  101:   struct bfd_proto *bfd;
  102: 
  103:   sock *sk;
  104:   u32 uc;
  105:   u8 changed;
  106: };
  107: 
  108: struct bfd_session
  109: {
  110:   node n;
  111:   ip_addr addr;				/* Address of session */
  112:   struct bfd_iface *ifa;		/* Iface associated with session */
  113:   struct bfd_session *next_id;		/* Next in bfd.session_hash_id */
  114:   struct bfd_session *next_ip;		/* Next in bfd.session_hash_ip */
  115: 
  116:   u8 opened_unused;
  117:   u8 passive;
  118:   u8 poll_active;
  119:   u8 poll_scheduled;
  120: 
  121:   u8 loc_state;
  122:   u8 rem_state;
  123:   u8 loc_diag;
  124:   u8 rem_diag;
  125:   u32 loc_id;				/* Local session ID (local discriminator) */
  126:   u32 rem_id;				/* Remote session ID (remote discriminator) */
  127:   u32 des_min_tx_int;			/* Desired min rx interval, local option */
  128:   u32 des_min_tx_new;			/* Used for des_min_tx_int change */
  129:   u32 req_min_rx_int;			/* Required min tx interval, local option */
  130:   u32 req_min_rx_new;			/* Used for req_min_rx_int change */
  131:   u32 rem_min_tx_int;			/* Last received des_min_tx_int */
  132:   u32 rem_min_rx_int;			/* Last received req_min_rx_int */
  133:   u8 demand_mode;			/* Currently unused */
  134:   u8 rem_demand_mode;
  135:   u8 detect_mult;			/* Announced detect_mult, local option */
  136:   u8 rem_detect_mult;			/* Last received detect_mult */
  137: 
  138:   btime last_tx;			/* Time of last sent periodic control packet */
  139:   btime last_rx;			/* Time of last received valid control packet */
  140: 
  141:   timer2 *tx_timer;			/* Periodic control packet timer */
  142:   timer2 *hold_timer;			/* Timer for session down detection time */
  143: 
  144:   list request_list;			/* List of client requests (struct bfd_request) */
  145:   bird_clock_t last_state_change;	/* Time of last state change */
  146:   u8 notify_running;			/* 1 if notify hooks are running */
  147: 
  148:   u8 rx_csn_known;			/* Received crypto sequence number is known */
  149:   u32 rx_csn;				/* Last received crypto sequence number */
  150:   u32 tx_csn;				/* Last transmitted crypto sequence number */
  151:   u32 tx_csn_time;			/* Timestamp of last tx_csn change */
  152: };
  153: 
  154: 
  155: extern const char *bfd_state_names[];
  156: 
  157: #define BFD_STATE_ADMIN_DOWN	0
  158: #define BFD_STATE_DOWN		1
  159: #define BFD_STATE_INIT		2
  160: #define BFD_STATE_UP		3
  161: 
  162: #define BFD_DIAG_NOTHING	0
  163: #define BFD_DIAG_TIMEOUT	1
  164: #define BFD_DIAG_ECHO_FAILED	2
  165: #define BFD_DIAG_NEIGHBOR_DOWN	3
  166: #define BFD_DIAG_FWD_RESET	4
  167: #define BFD_DIAG_PATH_DOWN	5
  168: #define BFD_DIAG_C_PATH_DOWN	6
  169: #define BFD_DIAG_ADMIN_DOWN	7
  170: #define BFD_DIAG_RC_PATH_DOWN	8
  171: 
  172: #define BFD_POLL_TX		1
  173: #define BFD_POLL_RX		2
  174: 
  175: #define BFD_FLAGS		0x3f
  176: #define BFD_FLAG_POLL		(1 << 5)
  177: #define BFD_FLAG_FINAL		(1 << 4)
  178: #define BFD_FLAG_CPI		(1 << 3)
  179: #define BFD_FLAG_AP		(1 << 2)
  180: #define BFD_FLAG_DEMAND		(1 << 1)
  181: #define BFD_FLAG_MULTIPOINT	(1 << 0)
  182: 
  183: #define BFD_AUTH_NONE			0
  184: #define BFD_AUTH_SIMPLE			1
  185: #define BFD_AUTH_KEYED_MD5		2
  186: #define BFD_AUTH_METICULOUS_KEYED_MD5	3
  187: #define BFD_AUTH_KEYED_SHA1		4
  188: #define BFD_AUTH_METICULOUS_KEYED_SHA1	5
  189: 
  190: extern const u8 bfd_auth_type_to_hash_alg[];
  191: 
  192: 
  193: static inline void bfd_lock_sessions(struct bfd_proto *p) { pthread_spin_lock(&p->lock); }
  194: static inline void bfd_unlock_sessions(struct bfd_proto *p) { pthread_spin_unlock(&p->lock); }
  195: 
  196: /* bfd.c */
  197: struct bfd_session * bfd_find_session_by_id(struct bfd_proto *p, u32 id);
  198: struct bfd_session * bfd_find_session_by_addr(struct bfd_proto *p, ip_addr addr);
  199: void bfd_session_process_ctl(struct bfd_session *s, u8 flags, u32 old_tx_int, u32 old_rx_int);
  200: void bfd_show_sessions(struct proto *P);
  201: 
  202: /* packets.c */
  203: void bfd_send_ctl(struct bfd_proto *p, struct bfd_session *s, int final);
  204: sock * bfd_open_rx_sk(struct bfd_proto *p, int multihop);
  205: sock * bfd_open_tx_sk(struct bfd_proto *p, ip_addr local, struct iface *ifa);
  206: 
  207: 
  208: #endif /* _BIRD_BFD_H_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>