Annotation of embedaddon/quagga/isisd/isis_tlv.h, revision 1.1.1.2

1.1       misho       1: /*
                      2:  * IS-IS Rout(e)ing protocol - isis_tlv.h
                      3:  *                             IS-IS TLV related routines
                      4:  *
                      5:  * Copyright (C) 2001,2002   Sampo Saaristo
                      6:  *                           Tampere University of Technology      
                      7:  *                           Institute of Communications Engineering
                      8:  *
                      9:  * This program is free software; you can redistribute it and/or modify it 
                     10:  * under the terms of the GNU General Public Licenseas published by the Free 
                     11:  * Software Foundation; either version 2 of the License, or (at your option) 
                     12:  * any later version.
                     13:  *
                     14:  * This program is distributed in the hope that it will be useful,but WITHOUT 
                     15:  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
                     16:  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
                     17:  * more details.
                     18:  *
                     19:  * You should have received a copy of the GNU General Public License along 
                     20:  * with this program; if not, write to the Free Software Foundation, Inc., 
                     21:  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
                     22:  */
                     23: 
                     24: #ifndef _ZEBRA_ISIS_TLV_H
                     25: #define _ZEBRA_ISIS_TLV_H
                     26: 
                     27: /*
                     28:  * The list of TLVs we (should) support.
                     29:  * ____________________________________________________________________________
                     30:  * Name                   Value  IIH LSP SNP Status
                     31:  *                               LAN
                     32:  * ____________________________________________________________________________
1.1.1.2 ! misho      33:  *
1.1       misho      34:  * Area Addresses             1   y   y   n  ISO10589
                     35:  * IIS Neighbors              2   n   y   n  ISO10589
                     36:  * ES Neighbors               3   n   y   n  ISO10589
                     37:  * IIS Neighbors              6   y   n   n  ISO10589
                     38:  * Padding                    8   y   n   n  ISO10589
                     39:  * LSP Entries                9   n   n   y  ISO10589
                     40:  * Authentication            10   y   y   y  ISO10589, RFC3567
                     41:  * Checksum                  12   y   n   y  RFC3358
1.1.1.2 ! misho      42:  * TE IS Reachability        22   n   y   n  RFC5305
1.1       misho      43:  * IS Alias                  24   n   y   n  RFC3786
                     44:  * IP Int. Reachability     128   n   y   n  RFC1195
                     45:  * Protocols Supported      129   y   y   n  RFC1195
                     46:  * IP Ext. Reachability     130   n   y   n  RFC1195
                     47:  * IDRPI                    131   n   y   y  RFC1195
                     48:  * IP Interface Address     132   y   y   n  RFC1195
1.1.1.2 ! misho      49:  * TE Router ID             134   n   y   n  RFC5305
        !            50:  * Extended IP Reachability 135   n   y   n  RFC5305
1.1       misho      51:  * Dynamic Hostname         137   n   y   n  RFC2763
1.1.1.2 ! misho      52:  * Shared Risk Link Group   138   n   y   y  RFC5307
1.1       misho      53:  * Restart TLV              211   y   n   n  RFC3847
1.1.1.2 ! misho      54:  * MT IS Reachability       222   n   y   n  RFC5120
        !            55:  * MT Supported             229   y   y   n  RFC5120
        !            56:  * IPv6 Interface Address   232   y   y   n  RFC5308
        !            57:  * MT IP Reachability       235   n   y   n  RFC5120
        !            58:  * IPv6 IP Reachability     236   n   y   n  RFC5308
        !            59:  * MT IPv6 IP Reachability  237   n   y   n  RFC5120
1.1       misho      60:  * P2P Adjacency State      240   y   n   n  RFC3373
                     61:  * IIH Sequence Number      241   y   n   n  draft-shen-isis-iih-sequence
                     62:  * Router Capability        242   -   -   -  draft-ietf-isis-caps
                     63:  *
1.1.1.2 ! misho      64:  *
1.1       misho      65:  * IS Reachability sub-TLVs we (should) support.
                     66:  * ____________________________________________________________________________
                     67:  * Name                           Value   Status
                     68:  * ____________________________________________________________________________
1.1.1.2 ! misho      69:  * Administartive group (color)       3   RFC5305
        !            70:  * Link Local/Remote Identifiers      4   RFC5307
        !            71:  * IPv4 interface address             6   RFC5305
        !            72:  * IPv4 neighbor address              8   RFC5305
        !            73:  * Maximum link bandwidth             9   RFC5305
        !            74:  * Reservable link bandwidth         10   RFC5305
        !            75:  * Unreserved bandwidth              11   RFC5305
        !            76:  * TE Default metric                 18   RFC5305
        !            77:  * Link Protection Type              20   RFC5307
        !            78:  * Interface Switching Capability    21   RFC5307
        !            79:  *
1.1       misho      80:  *
                     81:  * IP Reachability sub-TLVs we (should) support.
                     82:  * ____________________________________________________________________________
                     83:  * Name                           Value   Status
                     84:  * ____________________________________________________________________________
1.1.1.2 ! misho      85:  * 32bit administrative tag           1   RFC5130
        !            86:  * 64bit administrative tag           2   RFC5130
        !            87:  * Management prefix color          117   RFC5120
1.1       misho      88:  */
                     89: 
                     90: #define AREA_ADDRESSES            1
                     91: #define IS_NEIGHBOURS             2
                     92: #define ES_NEIGHBOURS             3
                     93: #define LAN_NEIGHBOURS            6
                     94: #define PADDING                   8
                     95: #define LSP_ENTRIES               9
                     96: #define AUTH_INFO                 10
                     97: #define CHECKSUM                  12
                     98: #define TE_IS_NEIGHBOURS          22
                     99: #define IS_ALIAS                  24
                    100: #define IPV4_INT_REACHABILITY     128
                    101: #define PROTOCOLS_SUPPORTED       129
                    102: #define IPV4_EXT_REACHABILITY     130
                    103: #define IDRP_INFO                 131
                    104: #define IPV4_ADDR                 132
                    105: #define TE_ROUTER_ID              134
                    106: #define TE_IPV4_REACHABILITY      135
                    107: #define DYNAMIC_HOSTNAME          137
                    108: #define GRACEFUL_RESTART          211
                    109: #define IPV6_ADDR                 232
                    110: #define IPV6_REACHABILITY         236
                    111: #define WAY3_HELLO                240
                    112: 
1.1.1.2 ! misho     113: #define AUTH_INFO_HDRLEN          3
        !           114: 
1.1       misho     115: #define IS_NEIGHBOURS_LEN (ISIS_SYS_ID_LEN + 5)
                    116: #define LAN_NEIGHBOURS_LEN 6
                    117: #define LSP_ENTRIES_LEN (10 + ISIS_SYS_ID_LEN) /* FIXME: should be entry */
                    118: #define IPV4_REACH_LEN 12
                    119: #define IPV6_REACH_LEN 22
1.1.1.2 ! misho     120: #define TE_IPV4_REACH_LEN 9
1.1       misho     121: 
                    122: /* struct for neighbor */
                    123: struct is_neigh
                    124: {
                    125:   struct metric metrics;
                    126:   u_char neigh_id[ISIS_SYS_ID_LEN + 1];
                    127: };
                    128: 
                    129: /* struct for te is neighbor */
                    130: struct te_is_neigh
                    131: {
                    132:   u_char neigh_id[ISIS_SYS_ID_LEN + 1];
                    133:   u_char te_metric[3];
                    134:   u_char sub_tlvs_length;
                    135: };
                    136: 
1.1.1.2 ! misho     137: /* Decode and encode three-octet metric into host byte order integer */
        !           138: #define GET_TE_METRIC(t) \
        !           139:   (((unsigned)(t)->te_metric[0]<<16) | ((t)->te_metric[1]<<8) | \
        !           140:    (t)->te_metric[2])
        !           141: #define SET_TE_METRIC(t, m) \
        !           142:   (((t)->te_metric[0] = (m) >> 16), \
        !           143:    ((t)->te_metric[1] = (m) >> 8), \
        !           144:    ((t)->te_metric[2] = (m)))
        !           145: 
1.1       misho     146: /* struct for es neighbors */
                    147: struct es_neigh
                    148: {
                    149:   struct metric metrics;
                    150:   /* approximate position of first, we use the
                    151:    * length ((uchar*)metric-1) to know all     */
                    152:   u_char first_es_neigh[ISIS_SYS_ID_LEN];
                    153: 
                    154: };
                    155: 
                    156: struct partition_desig_level2_is
                    157: {
                    158:   struct list *isis_system_ids;
                    159: };
                    160: 
                    161: /* struct for lan neighbors */
                    162: struct lan_neigh
                    163: {
                    164:   u_char LAN_addr[6];
                    165: };
                    166: 
                    167: #ifdef __SUNPRO_C
                    168: #pragma pack(1)
                    169: #endif
                    170: 
                    171: /* struct for LSP entry */
                    172: struct lsp_entry
                    173: {
                    174:   u_int16_t rem_lifetime;
                    175:   u_char lsp_id[ISIS_SYS_ID_LEN + 2];
                    176:   u_int32_t seq_num;
                    177:   u_int16_t checksum;
                    178: } __attribute__ ((packed));
                    179: 
                    180: #ifdef __SUNPRO_C
                    181: #pragma pack()
                    182: #endif
                    183: 
                    184: /* struct for checksum */
                    185: struct checksum
                    186: {
                    187:   u_int16_t checksum;
                    188: };
                    189: 
                    190: /* ipv4 reachability */
                    191: struct ipv4_reachability
                    192: {
                    193:   struct metric metrics;
                    194:   struct in_addr prefix;
                    195:   struct in_addr mask;
                    196: };
                    197: 
                    198: /* te router id */
                    199: struct te_router_id
                    200: {
                    201:   struct in_addr id;
                    202: };
                    203: 
                    204: /* te ipv4 reachability */
                    205: struct te_ipv4_reachability
                    206: {
                    207:   u_int32_t te_metric;
                    208:   u_char control;
                    209:   u_char prefix_start;         /* since this is variable length by nature it only */
                    210: };                             /* points to an approximate location */
                    211: 
                    212: 
                    213: 
                    214: struct idrp_info
                    215: {
                    216:   u_char len;
                    217:   u_char *value;
                    218: };
                    219: 
                    220: #ifdef HAVE_IPV6
                    221: struct ipv6_reachability
                    222: {
                    223:   u_int32_t metric;
                    224:   u_char control_info;
                    225:   u_char prefix_len;
                    226:   u_char prefix[16];
                    227: };
                    228: 
                    229: /* bits in control_info */
                    230: #define CTRL_INFO_DIRECTION    0x80
                    231: #define DIRECTION_UP           0
                    232: #define DIRECTION_DOWN         1
                    233: #define CTRL_INFO_DISTRIBUTION 0x40
                    234: #define DISTRIBUTION_INTERNAL  0
                    235: #define DISTRIBUTION_EXTERNAL  1
                    236: #define CTRL_INFO_SUBTLVS      0x20
1.1.1.2 ! misho     237: #endif /* HAVE_IPV6 */
1.1       misho     238: 
                    239: /*
                    240:  * Pointer to each tlv type, filled by parse_tlvs()
                    241:  */
                    242: struct tlvs
                    243: {
1.1.1.2 ! misho     244:   struct checksum *checksum;
        !           245:   struct hostname *hostname;
        !           246:   struct nlpids *nlpids;
        !           247:   struct te_router_id *router_id;
1.1       misho     248:   struct list *area_addrs;
                    249:   struct list *is_neighs;
                    250:   struct list *te_is_neighs;
                    251:   struct list *es_neighs;
                    252:   struct list *lsp_entries;
                    253:   struct list *prefix_neighs;
                    254:   struct list *lan_neighs;
                    255:   struct list *ipv4_addrs;
                    256:   struct list *ipv4_int_reachs;
                    257:   struct list *ipv4_ext_reachs;
                    258:   struct list *te_ipv4_reachs;
                    259: #ifdef HAVE_IPV6
                    260:   struct list *ipv6_addrs;
                    261:   struct list *ipv6_reachs;
                    262: #endif
                    263:   struct isis_passwd auth_info;
                    264: };
                    265: 
                    266: /*
                    267:  * Own definitions - used to bitmask found and expected
                    268:  */
                    269: 
                    270: #define TLVFLAG_AREA_ADDRS                (1<<0)
                    271: #define TLVFLAG_IS_NEIGHS                 (1<<1)
                    272: #define TLVFLAG_ES_NEIGHS                 (1<<2)
                    273: #define TLVFLAG_PARTITION_DESIG_LEVEL2_IS (1<<3)
                    274: #define TLVFLAG_PREFIX_NEIGHS             (1<<4)
                    275: #define TLVFLAG_LAN_NEIGHS                (1<<5)
                    276: #define TLVFLAG_LSP_ENTRIES               (1<<6)
                    277: #define TLVFLAG_PADDING                   (1<<7)
                    278: #define TLVFLAG_AUTH_INFO                 (1<<8)
                    279: #define TLVFLAG_IPV4_INT_REACHABILITY     (1<<9)
                    280: #define TLVFLAG_NLPID                     (1<<10)
                    281: #define TLVFLAG_IPV4_EXT_REACHABILITY     (1<<11)
                    282: #define TLVFLAG_IPV4_ADDR                 (1<<12)
                    283: #define TLVFLAG_DYN_HOSTNAME              (1<<13)
                    284: #define TLVFLAG_IPV6_ADDR                 (1<<14)
                    285: #define TLVFLAG_IPV6_REACHABILITY         (1<<15)
                    286: #define TLVFLAG_TE_IS_NEIGHS              (1<<16)
                    287: #define TLVFLAG_TE_IPV4_REACHABILITY      (1<<17)
                    288: #define TLVFLAG_3WAY_HELLO                (1<<18)
                    289: #define TLVFLAG_TE_ROUTER_ID              (1<<19)
                    290: #define TLVFLAG_CHECKSUM                  (1<<20)
                    291: #define TLVFLAG_GRACEFUL_RESTART          (1<<21)
                    292: 
                    293: void init_tlvs (struct tlvs *tlvs, uint32_t expected);
                    294: void free_tlvs (struct tlvs *tlvs);
                    295: int parse_tlvs (char *areatag, u_char * stream, int size,
1.1.1.2 ! misho     296:                u_int32_t * expected, u_int32_t * found, struct tlvs *tlvs,
        !           297:                 u_int32_t * auth_tlv_offset);
        !           298: int add_tlv (u_char, u_char, u_char *, struct stream *);
1.1       misho     299: void free_tlv (void *val);
                    300: 
                    301: int tlv_add_area_addrs (struct list *area_addrs, struct stream *stream);
                    302: int tlv_add_is_neighs (struct list *is_neighs, struct stream *stream);
                    303: int tlv_add_te_is_neighs (struct list *te_is_neighs, struct stream *stream);
                    304: int tlv_add_lan_neighs (struct list *lan_neighs, struct stream *stream);
                    305: int tlv_add_nlpid (struct nlpids *nlpids, struct stream *stream);
                    306: int tlv_add_checksum (struct checksum *checksum, struct stream *stream);
1.1.1.2 ! misho     307: int tlv_add_authinfo (u_char auth_type, u_char authlen, u_char *auth_value,
1.1       misho     308:                      struct stream *stream);
                    309: int tlv_add_ip_addrs (struct list *ip_addrs, struct stream *stream);
                    310: int tlv_add_in_addr (struct in_addr *, struct stream *stream, u_char tag);
                    311: int tlv_add_dynamic_hostname (struct hostname *hostname,
                    312:                              struct stream *stream);
                    313: int tlv_add_lsp_entries (struct list *lsps, struct stream *stream);
                    314: int tlv_add_ipv4_reachs (struct list *ipv4_reachs, struct stream *stream);
                    315: int tlv_add_te_ipv4_reachs (struct list *te_ipv4_reachs, struct stream *stream);
                    316: #ifdef HAVE_IPV6
                    317: int tlv_add_ipv6_addrs (struct list *ipv6_addrs, struct stream *stream);
                    318: int tlv_add_ipv6_reachs (struct list *ipv6_reachs, struct stream *stream);
                    319: #endif /* HAVE_IPV6 */
                    320: 
                    321: int tlv_add_padding (struct stream *stream);
                    322: 
                    323: #endif /* _ZEBRA_ISIS_TLV_H */

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