]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ospf6.c
More UNALIGNED_MEM{CPY,CMP} on IP addresses.
[tcpdump] / print-ospf6.c
index 90d4bac8623905386ccedfe26fe0d7cd1e4ff130..98352cbd1dbf6302874b24d64b6d5963363f5cf9 100644 (file)
  * OSPF support contributed by Jeffrey Honig ([email protected])
  */
 
-#ifndef lint
-static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-ospf6.c,v 1.15 2006-09-13 06:31:11 guy Exp $ (LBL)";
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -40,7 +35,257 @@ static const char rcsid[] _U_ =
 #include "extract.h"
 
 #include "ospf.h"
-#include "ospf6.h"
+
+#define        OSPF_TYPE_HELLO         1       /* Hello */
+#define        OSPF_TYPE_DD            2       /* Database Description */
+#define        OSPF_TYPE_LS_REQ        3       /* Link State Request */
+#define        OSPF_TYPE_LS_UPDATE     4       /* Link State Update */
+#define        OSPF_TYPE_LS_ACK        5       /* Link State Ack */
+
+/* Options *_options   */
+#define OSPF6_OPTION_V6        0x01    /* V6 bit: A bit for peeping tom */
+#define OSPF6_OPTION_E 0x02    /* E bit: External routes advertised    */
+#define OSPF6_OPTION_MC        0x04    /* MC bit: Multicast capable */
+#define OSPF6_OPTION_N 0x08    /* N bit: For type-7 LSA */
+#define OSPF6_OPTION_R 0x10    /* R bit: Router bit */
+#define OSPF6_OPTION_DC        0x20    /* DC bit: Demand circuits */
+/* The field is actually 24-bit (RFC5340 Section A.2). */
+#define OSPF6_OPTION_AF        0x0100  /* AF bit: Multiple address families */
+#define OSPF6_OPTION_L 0x0200  /* L bit: Link-local signaling (LLS) */
+#define OSPF6_OPTION_AT        0x0400  /* AT bit: Authentication trailer */
+
+
+/* db_flags    */
+#define        OSPF6_DB_INIT           0x04        /*  */
+#define        OSPF6_DB_MORE           0x02
+#define        OSPF6_DB_MASTER         0x01
+#define        OSPF6_DB_M6             0x10  /* IPv6 MTU */
+
+/* ls_type     */
+#define        LS_TYPE_ROUTER          1   /* router link */
+#define        LS_TYPE_NETWORK         2   /* network link */
+#define        LS_TYPE_INTER_AP        3   /* Inter-Area-Prefix */
+#define        LS_TYPE_INTER_AR        4   /* Inter-Area-Router */
+#define        LS_TYPE_ASE             5   /* ASE */
+#define        LS_TYPE_GROUP           6   /* Group membership */
+#define        LS_TYPE_NSSA            7   /* NSSA */
+#define        LS_TYPE_LINK            8   /* Link LSA */
+#define        LS_TYPE_INTRA_AP        9   /* Intra-Area-Prefix */
+#define LS_TYPE_INTRA_ATE       10  /* Intra-Area-TE */
+#define LS_TYPE_GRACE           11  /* Grace LSA */
+#define LS_TYPE_RI             12  /* Router information */
+#define LS_TYPE_INTER_ASTE     13  /* Inter-AS-TE */
+#define LS_TYPE_L1VPN          14  /* L1VPN */
+#define LS_TYPE_MASK           0x1fff
+
+#define LS_SCOPE_LINKLOCAL     0x0000
+#define LS_SCOPE_AREA          0x2000
+#define LS_SCOPE_AS            0x4000
+#define LS_SCOPE_MASK          0x6000
+#define LS_SCOPE_U              0x8000
+
+/* rla_link.link_type  */
+#define        RLA_TYPE_ROUTER         1   /* point-to-point to another router */
+#define        RLA_TYPE_TRANSIT        2   /* connection to transit network    */
+#define RLA_TYPE_VIRTUAL       4   /* virtual link                     */
+
+/* rla_flags   */
+#define        RLA_FLAG_B      0x01
+#define        RLA_FLAG_E      0x02
+#define        RLA_FLAG_V      0x04
+#define        RLA_FLAG_W      0x08
+#define RLA_FLAG_N      0x10
+
+/* lsa_prefix options */
+#define LSA_PREFIX_OPT_NU 0x01
+#define LSA_PREFIX_OPT_LA 0x02
+#define LSA_PREFIX_OPT_MC 0x04
+#define LSA_PREFIX_OPT_P  0x08
+#define LSA_PREFIX_OPT_DN 0x10
+
+/* sla_tosmetric breakdown     */
+#define        SLA_MASK_TOS            0x7f000000
+#define        SLA_MASK_METRIC         0x00ffffff
+#define SLA_SHIFT_TOS          24
+
+/* asla_metric */
+#define ASLA_FLAG_FWDADDR      0x02000000
+#define ASLA_FLAG_ROUTETAG     0x01000000
+#define        ASLA_MASK_METRIC        0x00ffffff
+
+/* RFC6506 Section 4.1 */
+#define OSPF6_AT_HDRLEN             16U
+#define OSPF6_AUTH_TYPE_HMAC        0x0001
+
+typedef u_int32_t rtrid_t;
+
+/* link state advertisement header */
+struct lsa6_hdr {
+    u_int16_t ls_age;
+    u_int16_t ls_type;
+    rtrid_t ls_stateid;
+    rtrid_t ls_router;
+    u_int32_t ls_seq;
+    u_int16_t ls_chksum;
+    u_int16_t ls_length;
+};
+
+struct lsa6_prefix {
+    u_int8_t lsa_p_len;
+    u_int8_t lsa_p_opt;
+    u_int16_t lsa_p_metric;
+    u_int8_t lsa_p_prefix[4];
+};
+
+/* link state advertisement */
+struct lsa6 {
+    struct lsa6_hdr ls_hdr;
+
+    /* Link state types */
+    union {
+       /* Router links advertisements */
+       struct {
+           union {
+               u_int8_t flg;
+               u_int32_t opt;
+           } rla_flgandopt;
+#define rla_flags      rla_flgandopt.flg
+#define rla_options    rla_flgandopt.opt
+           struct rlalink6 {
+               u_int8_t link_type;
+               u_int8_t link_zero[1];
+               u_int16_t link_metric;
+               u_int32_t link_ifid;
+               u_int32_t link_nifid;
+               rtrid_t link_nrtid;
+           } rla_link[1];              /* may repeat   */
+       } un_rla;
+
+       /* Network links advertisements */
+       struct {
+           u_int32_t nla_options;
+           rtrid_t nla_router[1];      /* may repeat   */
+       } un_nla;
+
+       /* Inter Area Prefix LSA */
+       struct {
+           u_int32_t inter_ap_metric;
+           struct lsa6_prefix inter_ap_prefix[1];
+       } un_inter_ap;
+
+       /* AS external links advertisements */
+       struct {
+           u_int32_t asla_metric;
+           struct lsa6_prefix asla_prefix[1];
+           /* some optional fields follow */
+       } un_asla;
+
+#if 0
+       /* Summary links advertisements */
+       struct {
+           struct in_addr sla_mask;
+           u_int32_t sla_tosmetric[1]; /* may repeat   */
+       } un_sla;
+
+       /* Multicast group membership */
+       struct mcla {
+           u_int32_t mcla_vtype;
+           struct in_addr mcla_vid;
+       } un_mcla[1];
+#endif
+
+       /* Type 7 LSA */
+
+       /* Link LSA */
+       struct llsa {
+           union {
+               u_int8_t pri;
+               u_int32_t opt;
+           } llsa_priandopt;
+#define llsa_priority  llsa_priandopt.pri
+#define llsa_options   llsa_priandopt.opt
+           struct in6_addr llsa_lladdr;
+           u_int32_t llsa_nprefix;
+           struct lsa6_prefix llsa_prefix[1];
+       } un_llsa;
+
+       /* Intra-Area-Prefix */
+       struct {
+           u_int16_t intra_ap_nprefix;
+           u_int16_t intra_ap_lstype;
+           rtrid_t intra_ap_lsid;
+           rtrid_t intra_ap_rtid;
+           struct lsa6_prefix intra_ap_prefix[1];
+       } un_intra_ap;
+    } lsa_un;
+};
+
+/*
+ * the main header
+ */
+struct ospf6hdr {
+    u_int8_t ospf6_version;
+    u_int8_t ospf6_type;
+    u_int16_t ospf6_len;
+    rtrid_t ospf6_routerid;
+    rtrid_t ospf6_areaid;
+    u_int16_t ospf6_chksum;
+    u_int8_t ospf6_instanceid;
+    u_int8_t ospf6_rsvd;
+    union {
+
+       /* Hello packet */
+       struct {
+           u_int32_t hello_ifid;
+           union {
+               u_int8_t pri;
+               u_int32_t opt;
+           } hello_priandopt;
+#define hello_priority hello_priandopt.pri
+#define hello_options  hello_priandopt.opt
+           u_int16_t hello_helloint;
+           u_int16_t hello_deadint;
+           rtrid_t hello_dr;
+           rtrid_t hello_bdr;
+           rtrid_t hello_neighbor[1]; /* may repeat    */
+       } un_hello;
+
+       /* Database Description packet */
+       struct {
+           u_int32_t db_options;
+           u_int16_t db_mtu;
+           u_int8_t db_mbz;
+           u_int8_t db_flags;
+           u_int32_t db_seq;
+           struct lsa6_hdr db_lshdr[1]; /* may repeat  */
+       } un_db;
+
+       /* Link State Request */
+       struct lsr6 {
+           u_int16_t ls_mbz;
+           u_int16_t ls_type;
+           rtrid_t ls_stateid;
+           rtrid_t ls_router;
+       } un_lsr[1];            /* may repeat   */
+
+       /* Link State Update */
+       struct {
+           u_int32_t lsu_count;
+           struct lsa6 lsu_lsa[1]; /* may repeat       */
+       } un_lsu;
+
+       /* Link State Acknowledgement */
+       struct {
+           struct lsa6_hdr lsa_lshdr[1]; /* may repeat */
+       } un_lsa ;
+    } ospf6_un ;
+};
+
+#define        ospf6_hello     ospf6_un.un_hello
+#define        ospf6_db        ospf6_un.un_db
+#define        ospf6_lsr       ospf6_un.un_lsr
+#define        ospf6_lsu       ospf6_un.un_lsu
+#define        ospf6_lsa       ospf6_un.un_lsa
 
 static const char tstr[] = " [|ospf3]";
 
@@ -266,7 +511,7 @@ ospf6_print_lsa(register const struct lsa6 *lsap, const u_char *dataend)
                                        "\n\t      Neighbor Interface-ID %s, Interface %s",
                                        ipaddr_string(&rlp->link_nrtid),
                                        ipaddr_string(&rlp->link_nifid),
-                                       ipaddr_string(&rlp->link_ifid)); 
+                                       ipaddr_string(&rlp->link_ifid));
                                 break;
 
                        case RLA_TYPE_ROUTER:
@@ -274,7 +519,7 @@ ospf6_print_lsa(register const struct lsa6 *lsap, const u_char *dataend)
                                        "\n\t      Neighbor Interface-ID %s, Interface %s",
                                        ipaddr_string(&rlp->link_nrtid),
                                        ipaddr_string(&rlp->link_nifid),
-                                       ipaddr_string(&rlp->link_ifid)); 
+                                       ipaddr_string(&rlp->link_ifid));
                                break;
 
                        case RLA_TYPE_TRANSIT:
@@ -460,7 +705,7 @@ ospf6_print_lsa(register const struct lsa6 *lsap, const u_char *dataend)
                 break;
 
        default:
-                if(!print_unknown_data(tptr,
+                if(!print_unknown_data(gndo,tptr,
                                        "\n\t      ",
                                        lsa_length)) {
                     return (1);
@@ -655,7 +900,7 @@ ospf6_decode_at(const u_char *cp, const u_int len)
        /* Authentication Data */
        TCHECK2(*cp, authdatalen - OSPF6_AT_HDRLEN);
        if (vflag > 1)
-               print_unknown_data(cp, "\n\tAuthentication Data ", authdatalen - OSPF6_AT_HDRLEN);
+               print_unknown_data(gndo,cp, "\n\tAuthentication Data ", authdatalen - OSPF6_AT_HDRLEN);
        return 0;
 
 trunc: