]> git.proxmox.com Git - mirror_frr.git/blobdiff - eigrpd/eigrp_structs.h
zebra: Allow ns delete to happen after under/over flow checks
[mirror_frr.git] / eigrpd / eigrp_structs.h
index 0c15436d4fd0badeb9abe535755e84ede3a05a00..ce03a21fbaeb7a4e796c731cabf9b75df6641138 100644 (file)
@@ -52,43 +52,43 @@ struct eigrp_master {
        time_t start_time;
 
        /* Various EIGRP global configuration. */
-       u_char options;
+       uint8_t options;
 
 #define EIGRP_MASTER_SHUTDOWN (1 << 0) /* deferred-shutdown */
 };
 
 struct eigrp_metrics {
-       u_int32_t delay;
-       u_int32_t bandwidth;
+       uint32_t delay;
+       uint32_t bandwidth;
        unsigned char mtu[3];
-       u_char hop_count;
-       u_char reliability;
-       u_char load;
-       u_char tag;
-       u_char flags;
+       uint8_t hop_count;
+       uint8_t reliability;
+       uint8_t load;
+       uint8_t tag;
+       uint8_t flags;
 };
 
 struct eigrp {
-       u_int16_t AS;       /* Autonomous system number */
-       u_int16_t vrid;     /* Virtual Router ID */
-       u_char k_values[6]; /*Array for K values configuration*/
-       u_char variance;    /*Metric variance multiplier*/
-       u_char max_paths;   /*Maximum allowed paths for 1 prefix*/
+       uint16_t AS;     /* Autonomous system number */
+       uint16_t vrid;       /* Virtual Router ID */
+       uint8_t k_values[6]; /*Array for K values configuration*/
+       uint8_t variance;    /*Metric variance multiplier*/
+       uint8_t max_paths;   /*Maximum allowed paths for 1 prefix*/
 
        /*Name of this EIGRP instance*/
        char *name;
 
        /* EIGRP Router ID. */
-       u_int32_t router_id;    /* Configured automatically. */
-       u_int32_t router_id_static; /* Configured manually. */
+       uint32_t router_id;     /* Configured automatically. */
+       uint32_t router_id_static; /* Configured manually. */
 
        struct list *eiflist;             /* eigrp interfaces */
-       u_char passive_interface_default; /* passive-interface default */
+       uint8_t passive_interface_default; /* passive-interface default */
 
        unsigned int fd;
        unsigned int maxsndbuflen;
 
-       u_int32_t sequence_number; /*Global EIGRP sequence number*/
+       uint32_t sequence_number; /*Global EIGRP sequence number*/
 
        struct stream *ibuf;
        struct list *oi_write_q;
@@ -100,13 +100,12 @@ struct eigrp {
 
        struct route_table *networks; /* EIGRP config networks. */
 
-       struct list *topology_table;
+       struct route_table *topology_table;
 
        uint64_t serno; /* Global serial number counter for topology entry
                           changes*/
-       uint64_t
-               serno_last_update; /* Highest serial number of information send
-                                     by last update*/
+       uint64_t serno_last_update; /* Highest serial number of information send
+                                      by last update*/
        struct list *topology_changes_internalIPV4;
        struct list *topology_changes_externalIPV4;
 
@@ -129,16 +128,38 @@ struct eigrp {
                char *name;
                struct route_map *map;
                int metric_config;
-               u_int32_t metric;
+               uint32_t metric;
        } route_map[ZEBRA_ROUTE_MAX];
 
        QOBJ_FIELDS
 };
 DECLARE_QOBJ_TYPE(eigrp)
-//------------------------------------------------------------------------------------------------------------------------------------------
+
+struct eigrp_if_params {
+       uint8_t passive_interface;
+       uint32_t v_hello;
+       uint16_t v_wait;
+       uint8_t type; /* type of interface */
+       uint32_t bandwidth;
+       uint32_t delay;
+       uint8_t reliability;
+       uint8_t load;
+
+       char *auth_keychain; /* Associated keychain with interface*/
+       int auth_type;       /* EIGRP authentication type */
+};
+
+enum { MEMBER_ALLROUTERS = 0,
+       MEMBER_MAX,
+};
 
 /*EIGRP interface structure*/
 struct eigrp_interface {
+       struct eigrp_if_params params;
+
+       /*multicast group refcnts */
+       bool member_allrouters;
+
        /* This interface's parent eigrp instance. */
        struct eigrp *eigrp;
 
@@ -150,16 +171,13 @@ struct eigrp_interface {
 
        /* To which multicast groups do we currently belong? */
 
-       /* Configured varables. */
-       struct eigrp_if_params *params;
 
-       u_char multicast_memberships;
+       uint8_t multicast_memberships;
 
        /* EIGRP Network Type. */
-       u_char type;
+       uint8_t type;
 
        struct prefix *address;      /* Interface prefix */
-       struct connected *connected; /* Pointer to connected */
 
        /* Neighbor information. */
        struct list *nbrs; /* EIGRP Neighbor List */
@@ -171,22 +189,22 @@ struct eigrp_interface {
        int on_write_q;
 
        /* Statistics fields. */
-       u_int32_t hello_in;   /* Hello message input count. */
-       u_int32_t update_in;  /* Update message input count. */
-       u_int32_t query_in;   /* Querry message input count. */
-       u_int32_t reply_in;   /* Reply message input count. */
-       u_int32_t hello_out;  /* Hello message output count. */
-       u_int32_t update_out; /* Update message output count. */
-       u_int32_t query_out;  /* Query message output count. */
-       u_int32_t reply_out;  /* Reply message output count. */
-       u_int32_t siaQuery_in;
-       u_int32_t siaQuery_out;
-       u_int32_t siaReply_in;
-       u_int32_t siaReply_out;
-       u_int32_t ack_out;
-       u_int32_t ack_in;
-
-       u_int32_t crypt_seqnum; /* Cryptographic Sequence Number */
+       uint32_t hello_in;   /* Hello message input count. */
+       uint32_t update_in;  /* Update message input count. */
+       uint32_t query_in;   /* Querry message input count. */
+       uint32_t reply_in;   /* Reply message input count. */
+       uint32_t hello_out;  /* Hello message output count. */
+       uint32_t update_out; /* Update message output count. */
+       uint32_t query_out;  /* Query message output count. */
+       uint32_t reply_out;  /* Reply message output count. */
+       uint32_t siaQuery_in;
+       uint32_t siaQuery_out;
+       uint32_t siaReply_in;
+       uint32_t siaReply_out;
+       uint32_t ack_out;
+       uint32_t ack_in;
+
+       uint32_t crypt_seqnum; /* Cryptographic Sequence Number */
 
        /* Access-list. */
        struct access_list *list[EIGRP_FILTER_MAX];
@@ -196,39 +214,6 @@ struct eigrp_interface {
        struct route_map *routemap[EIGRP_FILTER_MAX];
 };
 
-struct eigrp_if_params {
-       DECLARE_IF_PARAM(u_char, passive_interface); /* EIGRP Interface is
-                                                       passive: no sending or
-                                                       receiving (no need to
-                                                       join multicast groups)
-                                                       */
-       DECLARE_IF_PARAM(u_int32_t, v_hello);   /* Hello Interval */
-       DECLARE_IF_PARAM(u_int16_t, v_wait); /* Router Hold Time Interval */
-       DECLARE_IF_PARAM(u_char, type);      /* type of interface */
-       DECLARE_IF_PARAM(u_int32_t, bandwidth);
-       DECLARE_IF_PARAM(u_int32_t, delay);
-       DECLARE_IF_PARAM(u_char, reliability);
-       DECLARE_IF_PARAM(u_char, load);
-
-       DECLARE_IF_PARAM(char *,
-                        auth_keychain); /* Associated keychain with interface*/
-       DECLARE_IF_PARAM(int, auth_type); /* EIGRP authentication type */
-};
-
-enum { MEMBER_ALLROUTERS = 0,
-       MEMBER_MAX,
-};
-
-struct eigrp_if_info {
-       struct eigrp_if_params *def_params;
-       struct route_table *params;
-       struct route_table *eifs;
-       unsigned int
-               membership_counts[MEMBER_MAX]; /* multicast group refcnts */
-};
-
-//------------------------------------------------------------------------------------------------------------------------------------------
-
 /* Determines if it is first or last packet
  * when packet consists of multiple packet
  * chunks because of many route TLV
@@ -245,30 +230,32 @@ struct eigrp_neighbor {
        struct eigrp_interface *ei;
 
        /* EIGRP neighbor Information */
-       u_char state; /* neigbor status. */
+       uint8_t state; /* neigbor status. */
 
-       u_int32_t recv_sequence_number; /* Last received sequence Number. */
-       u_int32_t init_sequence_number;
+       uint32_t recv_sequence_number; /* Last received sequence Number. */
+       uint32_t init_sequence_number;
 
        /*If packet is unacknowledged, we try to send it again 16 times*/
-       u_char retrans_counter;
+       uint8_t retrans_counter;
 
        struct in_addr src; /* Neighbor Src address. */
 
-       u_char os_rel_major;  // system version - just for show
-       u_char os_rel_minor;  // system version - just for show
-       u_char tlv_rel_major; // eigrp version - tells us what TLV format to use
-       u_char tlv_rel_minor; // eigrp version - tells us what TLV format to use
+       uint8_t os_rel_major;  // system version - just for show
+       uint8_t os_rel_minor;  // system version - just for show
+       uint8_t tlv_rel_major; // eigrp version - tells us what TLV format to
+                              // use
+       uint8_t tlv_rel_minor; // eigrp version - tells us what TLV format to
+                              // use
 
-       u_char K1;
-       u_char K2;
-       u_char K3;
-       u_char K4;
-       u_char K5;
-       u_char K6;
+       uint8_t K1;
+       uint8_t K2;
+       uint8_t K3;
+       uint8_t K4;
+       uint8_t K5;
+       uint8_t K6;
 
        /* Timer values. */
-       u_int16_t v_holddown;
+       uint16_t v_holddown;
 
        /* Threads. */
        struct thread *t_holddown;
@@ -278,7 +265,7 @@ struct eigrp_neighbor {
        struct eigrp_fifo *retrans_queue;
        struct eigrp_fifo *multicast_queue;
 
-       u_int32_t crypt_seqnum; /* Cryptographic Sequence Number. */
+       uint32_t crypt_seqnum; /* Cryptographic Sequence Number. */
 
        /* prefixes not received from neighbor during Graceful restart */
        struct list *nbr_gr_prefixes;
@@ -305,12 +292,12 @@ struct eigrp_packet {
        struct thread *t_retrans_timer;
 
        /*Packet retransmission counter*/
-       u_char retrans_counter;
+       uint8_t retrans_counter;
 
-       u_int32_t sequence_number;
+       uint32_t sequence_number;
 
        /* EIGRP packet length. */
-       u_int16_t length;
+       uint16_t length;
 
        struct eigrp_neighbor *nbr;
 };
@@ -323,14 +310,14 @@ struct eigrp_fifo {
 };
 
 struct eigrp_header {
-       u_char version;
-       u_char opcode;
-       u_int16_t checksum;
-       u_int32_t flags;
-       u_int32_t sequence;
-       u_int32_t ack;
-       u_int16_t vrid;
-       u_int16_t ASNumber;
+       uint8_t version;
+       uint8_t opcode;
+       uint16_t checksum;
+       uint32_t flags;
+       uint32_t sequence;
+       uint32_t ack;
+       uint16_t vrid;
+       uint16_t ASNumber;
        char *tlv[0];
 
 } __attribute__((packed));
@@ -346,109 +333,109 @@ struct eigrp_header {
  *      +-----+------------------+
  */
 struct eigrp_tlv_hdr_type {
-       u_int16_t type;
-       u_int16_t length;
+       uint16_t type;
+       uint16_t length;
        uint8_t value[0];
 } __attribute__((packed));
 
 struct TLV_Parameter_Type {
-       u_int16_t type;
-       u_int16_t length;
-       u_char K1;
-       u_char K2;
-       u_char K3;
-       u_char K4;
-       u_char K5;
-       u_char K6;
-       u_int16_t hold_time;
+       uint16_t type;
+       uint16_t length;
+       uint8_t K1;
+       uint8_t K2;
+       uint8_t K3;
+       uint8_t K4;
+       uint8_t K5;
+       uint8_t K6;
+       uint16_t hold_time;
 } __attribute__((packed));
 
 struct TLV_MD5_Authentication_Type {
-       u_int16_t type;
-       u_int16_t length;
-       u_int16_t auth_type;
-       u_int16_t auth_length;
-       u_int32_t key_id;
-       u_int32_t key_sequence;
-       u_char Nullpad[8];
-       u_char digest[EIGRP_AUTH_TYPE_MD5_LEN];
+       uint16_t type;
+       uint16_t length;
+       uint16_t auth_type;
+       uint16_t auth_length;
+       uint32_t key_id;
+       uint32_t key_sequence;
+       uint8_t Nullpad[8];
+       uint8_t digest[EIGRP_AUTH_TYPE_MD5_LEN];
 
 } __attribute__((packed));
 
 struct TLV_SHA256_Authentication_Type {
-       u_int16_t type;
-       u_int16_t length;
-       u_int16_t auth_type;
-       u_int16_t auth_length;
-       u_int32_t key_id;
-       u_int32_t key_sequence;
-       u_char Nullpad[8];
-       u_char digest[EIGRP_AUTH_TYPE_SHA256_LEN];
+       uint16_t type;
+       uint16_t length;
+       uint16_t auth_type;
+       uint16_t auth_length;
+       uint32_t key_id;
+       uint32_t key_sequence;
+       uint8_t Nullpad[8];
+       uint8_t digest[EIGRP_AUTH_TYPE_SHA256_LEN];
 
 } __attribute__((packed));
 
 struct TLV_Sequence_Type {
-       u_int16_t type;
-       u_int16_t length;
-       u_char addr_length;
+       uint16_t type;
+       uint16_t length;
+       uint8_t addr_length;
        struct in_addr *addresses;
 } __attribute__((packed));
 
 struct TLV_Next_Multicast_Sequence {
-       u_int16_t type;
-       u_int16_t length;
-       u_int32_t multicast_sequence;
+       uint16_t type;
+       uint16_t length;
+       uint32_t multicast_sequence;
 } __attribute__((packed));
 
 struct TLV_Software_Type {
-       u_int16_t type;
-       u_int16_t length;
-       u_char vender_major;
-       u_char vender_minor;
-       u_char eigrp_major;
-       u_char eigrp_minor;
+       uint16_t type;
+       uint16_t length;
+       uint8_t vender_major;
+       uint8_t vender_minor;
+       uint8_t eigrp_major;
+       uint8_t eigrp_minor;
 } __attribute__((packed));
 
 struct TLV_IPv4_Internal_type {
-       u_int16_t type;
-       u_int16_t length;
+       uint16_t type;
+       uint16_t length;
        struct in_addr forward;
 
        /*Metrics*/
        struct eigrp_metrics metric;
 
-       u_char prefix_length;
+       uint8_t prefix_length;
 
        unsigned char destination_part[4];
        struct in_addr destination;
 } __attribute__((packed));
 
 struct TLV_IPv4_External_type {
-       u_int16_t type;
-       u_int16_t length;
+       uint16_t type;
+       uint16_t length;
        struct in_addr next_hop;
        struct in_addr originating_router;
-       u_int32_t originating_as;
-       u_int32_t administrative_tag;
-       u_int32_t external_metric;
-       u_int16_t reserved;
-       u_char external_protocol;
-       u_char external_flags;
+       uint32_t originating_as;
+       uint32_t administrative_tag;
+       uint32_t external_metric;
+       uint16_t reserved;
+       uint8_t external_protocol;
+       uint8_t external_flags;
 
        /*Metrics*/
        struct eigrp_metrics metric;
 
-       u_char prefix_length;
+       uint8_t prefix_length;
        unsigned char destination_part[4];
        struct in_addr destination;
 } __attribute__((packed));
 
 /* EIGRP Peer Termination TLV - used for hard restart */
 struct TLV_Peer_Termination_type {
-       u_int16_t type;
-       u_int16_t length;
-       u_char unknown;
-       u_int32_t neighbor_ip;
+       uint16_t type;
+       uint16_t length;
+       uint8_t unknown;
+       uint32_t neighbor_ip;
 } __attribute__((packed));
 
 /* Who executed Graceful restart */
@@ -459,20 +446,17 @@ enum GR_type { EIGRP_GR_MANUAL, EIGRP_GR_FILTER };
 /* EIGRP Topology table node structure */
 struct eigrp_prefix_entry {
        struct list *entries, *rij;
-       u_int32_t fdistance;                  // FD
-       u_int32_t rdistance;                  // RD
-       u_int32_t distance;                   // D
+       uint32_t fdistance;                   // FD
+       uint32_t rdistance;                   // RD
+       uint32_t distance;                    // D
        struct eigrp_metrics reported_metric; // RD for sending
 
-       u_char nt;       // network type
-       u_char state;      // route fsm state
-       u_char af;       // address family
-       u_char req_action; // required action
+       uint8_t nt;      // network type
+       uint8_t state;      // route fsm state
+       uint8_t af;      // address family
+       uint8_t req_action; // required action
 
-       struct prefix_ipv4
-               *destination_ipv4; // pointer to struct with ipv4 address
-       struct prefix_ipv6
-               *destination_ipv6; // pointer to struct with ipv6 address
+       struct prefix *destination;
 
        // If network type is REMOTE_EXTERNAL, pointer will have reference to
        // its external TLV
@@ -483,36 +467,39 @@ struct eigrp_prefix_entry {
 };
 
 /* EIGRP Topology table record structure */
-struct eigrp_neighbor_entry {
+struct eigrp_nexthop_entry {
        struct eigrp_prefix_entry *prefix;
-       u_int32_t reported_distance; // distance reported by neighbor
-       u_int32_t distance; // sum of reported distance and link cost to
-                           // advertised neighbor
+       uint32_t reported_distance; // distance reported by neighbor
+       uint32_t distance;        // sum of reported distance and link cost to
+                                   // advertised neighbor
 
        struct eigrp_metrics reported_metric;
        struct eigrp_metrics total_metric;
 
        struct eigrp_neighbor *adv_router; // ip address of advertising neighbor
-       u_char flags;                      // used for marking successor and FS
+       uint8_t flags;                     // used for marking successor and FS
 
        struct eigrp_interface *ei; // pointer for case of connected entry
 };
 
 //---------------------------------------------------------------------------------------------------------------------------------------------
+typedef enum {
+       EIGRP_CONNECTED,
+       EIGRP_INT,
+       EIGRP_EXT,
+} msg_data_t;
 
 /* EIGRP Finite State Machine */
 
 struct eigrp_fsm_action_message {
-       u_char packet_type;                // UPDATE, QUERY, SIAQUERY, SIAREPLY
+       uint8_t packet_type;               // UPDATE, QUERY, SIAQUERY, SIAREPLY
        struct eigrp *eigrp;               // which thread sent mesg
        struct eigrp_neighbor *adv_router; // advertising neighbor
-       struct eigrp_neighbor_entry *entry;
+       struct eigrp_nexthop_entry *entry;
        struct eigrp_prefix_entry *prefix;
-       int data_type; // internal or external tlv type
-       union {
-               struct TLV_IPv4_External_type *ipv4_ext_data;
-               struct TLV_IPv4_Internal_type *ipv4_int_type;
-       } data;
+       msg_data_t data_type; // internal or external tlv type
+       struct eigrp_metrics metrics;
+       enum metric_change change;
 };
 
 #endif /* _ZEBRA_EIGRP_STRUCTURES_H_ */