Annotation of embedaddon/bird2/proto/bfd/bfd.h, revision 1.1

1.1     ! misho       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 *rx4_1;
        !            91:   sock *rx6_1;
        !            92:   sock *rx4_m;
        !            93:   sock *rx6_m;
        !            94:   list iface_list;
        !            95: };
        !            96: 
        !            97: struct bfd_iface
        !            98: {
        !            99:   node n;
        !           100:   ip_addr local;
        !           101:   struct iface *iface;
        !           102:   struct bfd_iface_config *cf;
        !           103:   struct bfd_proto *bfd;
        !           104: 
        !           105:   sock *sk;
        !           106:   u32 uc;
        !           107:   u8 changed;
        !           108: };
        !           109: 
        !           110: struct bfd_session
        !           111: {
        !           112:   node n;
        !           113:   ip_addr addr;                                /* Address of session */
        !           114:   struct bfd_iface *ifa;               /* Iface associated with session */
        !           115:   struct bfd_session *next_id;         /* Next in bfd.session_hash_id */
        !           116:   struct bfd_session *next_ip;         /* Next in bfd.session_hash_ip */
        !           117: 
        !           118:   u8 opened_unused;
        !           119:   u8 passive;
        !           120:   u8 poll_active;
        !           121:   u8 poll_scheduled;
        !           122: 
        !           123:   u8 loc_state;
        !           124:   u8 rem_state;
        !           125:   u8 loc_diag;
        !           126:   u8 rem_diag;
        !           127:   u32 loc_id;                          /* Local session ID (local discriminator) */
        !           128:   u32 rem_id;                          /* Remote session ID (remote discriminator) */
        !           129:   u32 des_min_tx_int;                  /* Desired min rx interval, local option */
        !           130:   u32 des_min_tx_new;                  /* Used for des_min_tx_int change */
        !           131:   u32 req_min_rx_int;                  /* Required min tx interval, local option */
        !           132:   u32 req_min_rx_new;                  /* Used for req_min_rx_int change */
        !           133:   u32 rem_min_tx_int;                  /* Last received des_min_tx_int */
        !           134:   u32 rem_min_rx_int;                  /* Last received req_min_rx_int */
        !           135:   u8 demand_mode;                      /* Currently unused */
        !           136:   u8 rem_demand_mode;
        !           137:   u8 detect_mult;                      /* Announced detect_mult, local option */
        !           138:   u8 rem_detect_mult;                  /* Last received detect_mult */
        !           139: 
        !           140:   btime last_tx;                       /* Time of last sent periodic control packet */
        !           141:   btime last_rx;                       /* Time of last received valid control packet */
        !           142: 
        !           143:   timer *tx_timer;                     /* Periodic control packet timer */
        !           144:   timer *hold_timer;                   /* Timer for session down detection time */
        !           145: 
        !           146:   list request_list;                   /* List of client requests (struct bfd_request) */
        !           147:   btime last_state_change;             /* Time of last state change */
        !           148:   u8 notify_running;                   /* 1 if notify hooks are running */
        !           149: 
        !           150:   u8 rx_csn_known;                     /* Received crypto sequence number is known */
        !           151:   u32 rx_csn;                          /* Last received crypto sequence number */
        !           152:   u32 tx_csn;                          /* Last transmitted crypto sequence number */
        !           153:   u32 tx_csn_time;                     /* Timestamp of last tx_csn change */
        !           154: };
        !           155: 
        !           156: 
        !           157: extern const char *bfd_state_names[];
        !           158: 
        !           159: #define BFD_STATE_ADMIN_DOWN   0
        !           160: #define BFD_STATE_DOWN         1
        !           161: #define BFD_STATE_INIT         2
        !           162: #define BFD_STATE_UP           3
        !           163: 
        !           164: #define BFD_DIAG_NOTHING       0
        !           165: #define BFD_DIAG_TIMEOUT       1
        !           166: #define BFD_DIAG_ECHO_FAILED   2
        !           167: #define BFD_DIAG_NEIGHBOR_DOWN 3
        !           168: #define BFD_DIAG_FWD_RESET     4
        !           169: #define BFD_DIAG_PATH_DOWN     5
        !           170: #define BFD_DIAG_C_PATH_DOWN   6
        !           171: #define BFD_DIAG_ADMIN_DOWN    7
        !           172: #define BFD_DIAG_RC_PATH_DOWN  8
        !           173: 
        !           174: #define BFD_POLL_TX            1
        !           175: #define BFD_POLL_RX            2
        !           176: 
        !           177: #define BFD_FLAGS              0x3f
        !           178: #define BFD_FLAG_POLL          (1 << 5)
        !           179: #define BFD_FLAG_FINAL         (1 << 4)
        !           180: #define BFD_FLAG_CPI           (1 << 3)
        !           181: #define BFD_FLAG_AP            (1 << 2)
        !           182: #define BFD_FLAG_DEMAND                (1 << 1)
        !           183: #define BFD_FLAG_MULTIPOINT    (1 << 0)
        !           184: 
        !           185: #define BFD_AUTH_NONE                  0
        !           186: #define BFD_AUTH_SIMPLE                        1
        !           187: #define BFD_AUTH_KEYED_MD5             2
        !           188: #define BFD_AUTH_METICULOUS_KEYED_MD5  3
        !           189: #define BFD_AUTH_KEYED_SHA1            4
        !           190: #define BFD_AUTH_METICULOUS_KEYED_SHA1 5
        !           191: 
        !           192: extern const u8 bfd_auth_type_to_hash_alg[];
        !           193: 
        !           194: 
        !           195: static inline void bfd_lock_sessions(struct bfd_proto *p) { pthread_spin_lock(&p->lock); }
        !           196: static inline void bfd_unlock_sessions(struct bfd_proto *p) { pthread_spin_unlock(&p->lock); }
        !           197: 
        !           198: /* bfd.c */
        !           199: struct bfd_session * bfd_find_session_by_id(struct bfd_proto *p, u32 id);
        !           200: struct bfd_session * bfd_find_session_by_addr(struct bfd_proto *p, ip_addr addr);
        !           201: void bfd_session_process_ctl(struct bfd_session *s, u8 flags, u32 old_tx_int, u32 old_rx_int);
        !           202: void bfd_show_sessions(struct proto *P);
        !           203: 
        !           204: /* packets.c */
        !           205: void bfd_send_ctl(struct bfd_proto *p, struct bfd_session *s, int final);
        !           206: sock * bfd_open_rx_sk(struct bfd_proto *p, int multihop, int inet_version);
        !           207: sock * bfd_open_tx_sk(struct bfd_proto *p, ip_addr local, struct iface *ifa);
        !           208: 
        !           209: 
        !           210: #endif /* _BIRD_BFD_H_ */

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