]> git.proxmox.com Git - mirror_frr.git/blobdiff - ospfd/ospf_te.h
lib: enforce vrf_name_to_id by returning default_vrf when name is null
[mirror_frr.git] / ospfd / ospf_te.h
index 4ee9139a3c5f31d99e4835581c79dd0354cabbd6..06c17f07feb307bac584c03eecfd2a5c364c3230 100644 (file)
@@ -78,7 +78,7 @@
 #define FLOOD_AS       0x20
 #define EMULATED       0x80
 
-#define IS_STD_TE(x)           (x & STD_TE)
+#define IS_STD_TE(x)       (x & STD_TE)
 #define IS_PSEUDO_TE(x)                (x & PSEUDO_TE)
 #define IS_INTER_AS(x)                 (x & INTER_AS)
 #define IS_EMULATED(x)         (x & EMULATED)
 #define LPFLG_LOOKUP_DONE              0x4
 #define LPFLG_LSA_FORCED_REFRESH       0x8
 
-/*
- * Following section defines TLV (tag, length, value) structures,
- * used for Traffic Engineering.
- */
-struct te_tlv_header {
-       u_int16_t type;   /* TE_TLV_XXX (see below) */
-       u_int16_t length; /* Value portion only, in octets */
-};
-
-#define TLV_HDR_SIZE (sizeof(struct te_tlv_header))
-
-#define TLV_BODY_SIZE(tlvh) (ROUNDUP(ntohs((tlvh)->length), sizeof(u_int32_t)))
-
-#define TLV_SIZE(tlvh) (TLV_HDR_SIZE + TLV_BODY_SIZE(tlvh))
-
-#define TLV_HDR_TOP(lsah)                                                      \
-       (struct te_tlv_header *)((char *)(lsah) + OSPF_LSA_HEADER_SIZE)
-
-#define TLV_HDR_NEXT(tlvh)                                                     \
-       (struct te_tlv_header *)((char *)(tlvh) + TLV_SIZE(tlvh))
-
-#define TLV_HDR_SUBTLV(tlvh)                                                   \
-       (struct te_tlv_header *)((char *)(tlvh) + TLV_HDR_SIZE)
-
-#define TLV_TYPE(tlvh)     tlvh.header.type
-#define TLV_LEN(tlvh)      tlvh.header.length
-#define TLV_HDR(tlvh)      tlvh.header
-
 /*
  * Following section defines TLV body parts.
  */
+
 /* Router Address TLV */ /* Mandatory */
 #define        TE_TLV_ROUTER_ADDR              1
 struct te_tlv_router_addr {
-       struct te_tlv_header header; /* Value length is 4 octets. */
+       struct tlv_header header; /* Value length is 4 octets. */
        struct in_addr value;
 };
 
 /* Link TLV */
 #define        TE_TLV_LINK                     2
 struct te_tlv_link {
-       struct te_tlv_header header;
+       struct tlv_header header;
        /* A set of link-sub-TLVs will follow. */
 };
 
+/* Default TE TLV size */
 #define TE_LINK_SUBTLV_DEF_SIZE                4
 
 /* Link Type Sub-TLV */ /* Mandatory */
 #define        TE_LINK_SUBTLV_LINK_TYPE        1
 #define TE_LINK_SUBTLV_TYPE_SIZE       1
 struct te_link_subtlv_link_type {
-       struct te_tlv_header header; /* Value length is 1 octet. */
+       struct tlv_header header; /* Value length is 1 octet. */
        struct {
 #define        LINK_TYPE_SUBTLV_VALUE_PTP      1
 #define        LINK_TYPE_SUBTLV_VALUE_MA       2
-               u_char value;
-               u_char padding[3];
+               uint8_t value;
+               uint8_t padding[3];
        } link_type;
 };
 
 /* Link Sub-TLV: Link ID */ /* Mandatory */
 #define        TE_LINK_SUBTLV_LINK_ID          2
 struct te_link_subtlv_link_id {
-       struct te_tlv_header header; /* Value length is 4 octets. */
-       struct in_addr value;   /* Same as router-lsa's link-id. */
+       struct tlv_header header; /* Value length is 4 octets. */
+       struct in_addr value;     /* Same as router-lsa's link-id. */
 };
 
 /* Link Sub-TLV: Local Interface IP Address */ /* Optional */
 #define        TE_LINK_SUBTLV_LCLIF_IPADDR     3
 struct te_link_subtlv_lclif_ipaddr {
-       struct te_tlv_header header; /* Value length is 4 x N octets. */
-       struct in_addr value[1];     /* Local IP address(es). */
+       struct tlv_header header; /* Value length is 4 x N octets. */
+       struct in_addr value[1];  /* Local IP address(es). */
 };
 
 /* Link Sub-TLV: Remote Interface IP Address */ /* Optional */
 #define        TE_LINK_SUBTLV_RMTIF_IPADDR     4
 struct te_link_subtlv_rmtif_ipaddr {
-       struct te_tlv_header header; /* Value length is 4 x N octets. */
-       struct in_addr value[1];     /* Neighbor's IP address(es). */
+       struct tlv_header header; /* Value length is 4 x N octets. */
+       struct in_addr value[1];  /* Neighbor's IP address(es). */
 };
 
 /* Link Sub-TLV: Traffic Engineering Metric */ /* Optional */
 #define        TE_LINK_SUBTLV_TE_METRIC        5
 struct te_link_subtlv_te_metric {
-       struct te_tlv_header header; /* Value length is 4 octets. */
-       u_int32_t value;             /* Link metric for TE purpose. */
+       struct tlv_header header; /* Value length is 4 octets. */
+       uint32_t value;           /* Link metric for TE purpose. */
 };
 
 /* Link Sub-TLV: Maximum Bandwidth */ /* Optional */
 #define        TE_LINK_SUBTLV_MAX_BW           6
 struct te_link_subtlv_max_bw {
-       struct te_tlv_header header; /* Value length is 4 octets. */
-       float value;                 /* bytes/sec */
+       struct tlv_header header; /* Value length is 4 octets. */
+       float value;              /* bytes/sec */
 };
 
 /* Link Sub-TLV: Maximum Reservable Bandwidth */ /* Optional */
 #define        TE_LINK_SUBTLV_MAX_RSV_BW       7
 struct te_link_subtlv_max_rsv_bw {
-       struct te_tlv_header header; /* Value length is 4 octets. */
-       float value;                 /* bytes/sec */
+       struct tlv_header header; /* Value length is 4 octets. */
+       float value;              /* bytes/sec */
 };
 
 /* Link Sub-TLV: Unreserved Bandwidth */ /* Optional */
 #define        TE_LINK_SUBTLV_UNRSV_BW         8
 #define TE_LINK_SUBTLV_UNRSV_SIZE      32
 struct te_link_subtlv_unrsv_bw {
-       struct te_tlv_header header; /* Value length is 32 octets. */
+       struct tlv_header header;    /* Value length is 32 octets. */
        float value[MAX_CLASS_TYPE]; /* One for each priority level. */
 };
 
 /* Link Sub-TLV: Resource Class/Color */ /* Optional */
 #define        TE_LINK_SUBTLV_RSC_CLSCLR       9
 struct te_link_subtlv_rsc_clsclr {
-       struct te_tlv_header header; /* Value length is 4 octets. */
-       u_int32_t value;             /* Admin. group membership. */
+       struct tlv_header header; /* Value length is 4 octets. */
+       uint32_t value;           /* Admin. group membership. */
 };
 
 /* For RFC6827 */
@@ -216,18 +190,18 @@ struct te_link_subtlv_rsc_clsclr {
 #define TE_LINK_SUBTLV_LRRID           10
 #define TE_LINK_SUBTLV_LRRID_SIZE      8
 struct te_link_subtlv_lrrid {
-       struct te_tlv_header header; /* Value length is 8 octets. */
-       struct in_addr local;   /* Local TE Router Identifier */
-       struct in_addr remote;       /* Remote TE Router Identifier */
+       struct tlv_header header; /* Value length is 8 octets. */
+       struct in_addr local;     /* Local TE Router Identifier */
+       struct in_addr remote;    /* Remote TE Router Identifier */
 };
 
 /* RFC4203: Link Local/Remote Identifiers */
 #define TE_LINK_SUBTLV_LLRI            11
 #define TE_LINK_SUBTLV_LLRI_SIZE       8
 struct te_link_subtlv_llri {
-       struct te_tlv_header header; /* Value length is 8 octets. */
-       u_int32_t local;             /* Link Local Identifier */
-       u_int32_t remote;           /* Link Remote Identifier */
+       struct tlv_header header; /* Value length is 8 octets. */
+       uint32_t local;           /* Link Local Identifier */
+       uint32_t remote;          /* Link Remote Identifier */
 };
 
 /* Inter-RA Export Upward sub-TLV (12) and Inter-RA Export Downward sub-TLV (13)
@@ -240,15 +214,15 @@ struct te_link_subtlv_llri {
 /* Remote AS Number sub-TLV */
 #define TE_LINK_SUBTLV_RAS             21
 struct te_link_subtlv_ras {
-       struct te_tlv_header header; /* Value length is 4 octets. */
-       u_int32_t value;             /* Remote AS number */
+       struct tlv_header header; /* Value length is 4 octets. */
+       uint32_t value;           /* Remote AS number */
 };
 
 /* IPv4 Remote ASBR ID Sub-TLV */
 #define TE_LINK_SUBTLV_RIP             22
 struct te_link_subtlv_rip {
-       struct te_tlv_header header; /* Value length is 4 octets. */
-       struct in_addr value;   /* Remote ASBR IP address */
+       struct tlv_header header; /* Value length is 4 octets. */
+       struct in_addr value;     /* Remote ASBR IP address */
 };
 
 /* SUBTLV 24 is IPv6 Remote ASBR ID (RFC5392). see ospf6d */
@@ -261,63 +235,69 @@ struct te_link_subtlv_rip {
 /* Link Sub-TLV: Average Link Delay */ /* Optional */
 #define TE_LINK_SUBTLV_AV_DELAY                27
 struct te_link_subtlv_av_delay {
-       struct te_tlv_header header; /* Value length is 4 bytes. */
-       u_int32_t
-               value; /* delay in micro-seconds only 24 bits => 0 ... 16777215
-                         with Anomalous Bit as Upper most bit */
+       struct tlv_header header; /* Value length is 4 bytes. */
+       /*
+        * delay in micro-seconds only 24 bits => 0 ... 16777215
+        * with Anomalous Bit as Upper most bit
+        */
+       uint32_t value;
 };
 
 /* Link Sub-TLV: Low/High Link Delay */
 #define TE_LINK_SUBTLV_MM_DELAY         28
 #define TE_LINK_SUBTLV_MM_DELAY_SIZE    8
 struct te_link_subtlv_mm_delay {
-       struct te_tlv_header header; /* Value length is 8 bytes. */
-       u_int32_t low;  /* low delay in micro-seconds only 24 bits => 0 ...
-                          16777215
-                          with Anomalous Bit (A) as Upper most bit */
-       u_int32_t high; /* high delay in micro-seconds only 24 bits => 0 ...
-                          16777215 */
+       struct tlv_header header; /* Value length is 8 bytes. */
+       /*
+        * low delay in micro-seconds only 24 bits => 0 ... 16777215
+        * with Anomalous Bit (A) as Upper most bit
+        */
+       uint32_t low;
+       /* high delay in micro-seconds only 24 bits => 0 ... 16777215 */
+       uint32_t high;
 };
 
 /* Link Sub-TLV: Link Delay Variation i.e. Jitter */
 #define TE_LINK_SUBTLV_DELAY_VAR       29
 struct te_link_subtlv_delay_var {
-       struct te_tlv_header header; /* Value length is 4 bytes. */
-       u_int32_t value; /* interval in micro-seconds only 24 bits => 0 ...
-                           16777215 */
+       struct tlv_header header; /* Value length is 4 bytes. */
+       /* interval in micro-seconds only 24 bits => 0 ... 16777215 */
+       uint32_t value;
 };
 
 /* Link Sub-TLV: Routine Unidirectional Link Packet Loss */
 #define TE_LINK_SUBTLV_PKT_LOSS                30
 struct te_link_subtlv_pkt_loss {
-       struct te_tlv_header header; /* Value length is 4 bytes. */
-       u_int32_t
-               value; /* in percentage of total traffic only 24 bits (2^24 - 2)
-                         with Anomalous Bit as Upper most bit */
+       struct tlv_header header; /* Value length is 4 bytes. */
+       /*
+        * in percentage of total traffic only 24 bits (2^24 - 2)
+        * with Anomalous Bit as Upper most bit
+        */
+       uint32_t value;
 };
 
 /* Link Sub-TLV: Unidirectional Residual Bandwidth */ /* Optional */
 #define TE_LINK_SUBTLV_RES_BW          31
 struct te_link_subtlv_res_bw {
-       struct te_tlv_header header; /* Value length is 4 bytes. */
-       float value; /* bandwidth in IEEE floating point format with units in
-                       bytes per second */
+       struct tlv_header header; /* Value length is 4 bytes. */
+       /* bandwidth in IEEE floating point format with units in bytes/second */
+       float value;
 };
 
 /* Link Sub-TLV: Unidirectional Available Bandwidth */ /* Optional */
 #define TE_LINK_SUBTLV_AVA_BW          32
 struct te_link_subtlv_ava_bw {
-       struct te_tlv_header header; /* Value length is 4 octets. */
-       float value; /* bandwidth in IEEE floating point format with units in
-                       bytes per second */
+       struct tlv_header header; /* Value length is 4 octets. */
+       /* bandwidth in IEEE floating point format with units in bytes/second */
+       float value;
 };
 
 /* Link Sub-TLV: Unidirectional Utilized Bandwidth */ /* Optional */
 #define TE_LINK_SUBTLV_USE_BW           33
 struct te_link_subtlv_use_bw {
-       struct te_tlv_header header; /* Value length is 4 octets. */
-       float value; /* bandwidth in IEEE floating point format with units in
-                       bytes per second */
+       struct tlv_header header; /* Value length is 4 octets. */
+       /* bandwidth in IEEE floating point format with units in bytes/second */
+       float value;
 };
 
 #define TE_LINK_SUBTLV_MAX             34      /* Last SUBTLV + 1 */
@@ -325,38 +305,29 @@ struct te_link_subtlv_use_bw {
 /* Here are "non-official" architectural constants. */
 #define MPLS_TE_MINIMUM_BANDWIDTH      1.0     /* Reasonable? *//* XXX */
 
-/* Following declaration concerns the MPLS-TE and LINk-TE management */
-typedef enum _opcode_t {
-       REORIGINATE_THIS_LSA,
-       REFRESH_THIS_LSA,
-       FLUSH_THIS_LSA
-} opcode_t;
-
-typedef enum _status_t { disabled, enabled } status_t;
-
 /* Mode for Inter-AS Opaque-LSA */
-enum inter_as_mode { Disable, AS, Area };
+enum inter_as_mode { Off, AS, Area };
 
 struct te_link_subtlv {
-       struct te_tlv_header header;
+       struct tlv_header header;
        union {
-               u_int32_t link_type;
+               uint32_t link_type;
                struct in_addr link_id;
                struct in_addr lclif;
                struct in_addr rmtif;
-               u_int32_t te_metric;
+               uint32_t te_metric;
                float max_bw;
                float max_rsv_bw;
                float unrsv[8];
-               u_int32_t rsc_clsclr;
-               u_int32_t llri[2];
-               u_int32_t ras;
+               uint32_t rsc_clsclr;
+               uint32_t llri[2];
+               uint32_t ras;
                struct in_addr rip;
                struct in_addr lrrid[2];
-               u_int32_t av_delay;
-               u_int32_t mm_delay;
-               u_int32_t delay_var;
-               u_int32_t pkt_loss;
+               uint32_t av_delay;
+               uint32_t mm_delay;
+               uint32_t delay_var;
+               uint32_t pkt_loss;
                float res_bw;
                float ava_bw;
                float use_bw;
@@ -366,7 +337,7 @@ struct te_link_subtlv {
 /* Following structure are internal use only. */
 struct ospf_mpls_te {
        /* Status of MPLS-TE: enable or disbale */
-       status_t status;
+       bool enabled;
 
        /* RFC5392 */
        enum inter_as_mode inter_as;
@@ -386,7 +357,7 @@ struct mpls_te_link {
         * is subdivided into 8-bit "unused" field and 16-bit "instance" field.
         * In this implementation, each Link-TLV has its own instance.
         */
-       u_int32_t instance;
+       uint32_t instance;
 
        /* Reference pointer to a Zebra-interface. */
        struct interface *ifp;
@@ -395,10 +366,10 @@ struct mpls_te_link {
        struct ospf_area *area;
 
        /* Flags to manage this link parameters. */
-       u_int32_t flags;
+       uint32_t flags;
 
        /* Type of MPLS-TE link: RFC3630, RFC5392, RFC5392 emulated, RFC6827 */
-       u_int8_t type;
+       uint8_t type;
 
        /* Store Link-TLV in network byte order. */
        /* RFC3630 & RFC6827 / RFC 6827 */
@@ -435,11 +406,11 @@ struct mpls_te_link {
 /* Prototypes. */
 extern int ospf_mpls_te_init(void);
 extern void ospf_mpls_te_term(void);
+extern void ospf_mpls_te_finish(void);
 extern struct ospf_mpls_te *get_ospf_mpls_te(void);
 extern void ospf_mpls_te_update_if(struct interface *);
-extern void ospf_mpls_te_lsa_schedule(struct mpls_te_link *, opcode_t);
-extern u_int32_t get_mpls_te_instance_value(void);
-extern void set_linkparams_llri(struct mpls_te_link *, u_int32_t, u_int32_t);
+extern void ospf_mpls_te_lsa_schedule(struct mpls_te_link *, enum lsa_opcode);
+extern void set_linkparams_llri(struct mpls_te_link *, uint32_t, uint32_t);
 extern void set_linkparams_lrrid(struct mpls_te_link *, struct in_addr,
                                 struct in_addr);