]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Initial commit for support of Type 3 and Type 4 LISP packets.
authorritsz <[email protected]>
Fri, 14 Aug 2015 16:06:52 +0000 (21:36 +0530)
committerFrancois-Xavier Le Bail <[email protected]>
Sun, 4 Oct 2015 10:47:13 +0000 (12:47 +0200)
Fixing Travis CI build for LISP commit

Adding testcases for lisp notify and register

Fixing build warnings

Added ND_TCHECK for relevant headers

Fixing ND_TCHECK2 issues

Adding support for multiple LOC records for same EID entry

Fixing review issues, adding detailed tests

Adding support for verbose outputs

Adding RFC information for UDP PORT defination

Removing Spaces in type names

Print EID record related flags in verbose mode

Using tok2str

Fixing -Wpedantic issues

Negative testcases, Packet structure comments, verbose mode flag printing

Printing Map Version

Print auth_data, decouple type and xtr_present extraction, handle malformed packets correctly

Tests for latest code changes

Printing useful info incase not built with IPv6 support

12 files changed:
Makefile.in
netdissect.h
print-lisp.c [new file with mode: 0644]
print-udp.c
tests/TESTLIST
tests/lisp_eid_notify.out [new file with mode: 0644]
tests/lisp_eid_notify.pcap [new file with mode: 0644]
tests/lisp_eid_register.out [new file with mode: 0644]
tests/lisp_eid_register.pcap [new file with mode: 0644]
tests/lisp_ipv6.out [new file with mode: 0644]
tests/lisp_ipv6.pcap [new file with mode: 0644]
udp.h

index 966545e7058214a07bef3dce1795b4261729f494..db50bf74b3cd21d2f5d94d1fee0d6d90cf61bc69 100644 (file)
@@ -154,6 +154,7 @@ LIBNETDISSECT_SRC=\
        print-l2tp.c \
        print-lane.c \
        print-ldp.c \
+       print-lisp.c \
        print-llc.c \
        print-lldp.c \
        print-lmp.c \
index 0e9c06a61ebe9f84fc09a30c762df785c27947f7..29c4e0a11986c19d368c2f85864a469616d0b054 100644 (file)
@@ -462,6 +462,7 @@ extern void krb_print(netdissect_options *, const u_char *);
 extern void l2tp_print(netdissect_options *, const u_char *, u_int);
 extern void lane_print(netdissect_options *, const u_char *, u_int, u_int);
 extern void ldp_print(netdissect_options *, const u_char *, u_int);
+extern void lisp_print(netdissect_options *, const u_char *, u_int);
 extern u_int llap_print(netdissect_options *, const u_char *, u_int);
 extern int llc_print(netdissect_options *, const u_char *, u_int, u_int, const u_char *, const u_char *);
 extern void lldp_print(netdissect_options *, const u_char *, u_int);
diff --git a/print-lisp.c b/print-lisp.c
new file mode 100644 (file)
index 0000000..327e99e
--- /dev/null
@@ -0,0 +1,461 @@
+/*
+ * Copyright (c) 2015 Ritesh Ranjan ([email protected])
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * tcpdump filter for LISP - Locator/Identifier Separation Protocol
+ * RFC 6830
+ *
+ *
+ * The Map-Register message format is:
+ *
+ *       0                   1                   2                   3
+ *       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *      |Type=3 |P|S|I|R|      Reserved               |M| Record Count  |
+ *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *      |                         Nonce . . .                           |
+ *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *      |                         . . . Nonce                           |
+ *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *      |            Key ID             |  Authentication Data Length   |
+ *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *      ~                     Authentication Data                       ~
+ *  +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |   |                          Record TTL                           |
+ *  |   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  R   | Locator Count | EID mask-len  | ACT |A|      Reserved         |
+ *  e   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  c   | Rsvd  |  Map-Version Number   |        EID-Prefix-AFI         |
+ *  o   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  r   |                          EID-Prefix                           |
+ *  d   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  /|    Priority   |    Weight     |  M Priority   |   M Weight    |
+ *  | L +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  | o |        Unused Flags     |L|p|R|           Loc-AFI             |
+ *  | c +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  \|                             Locator                           |
+ *  +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ *
+ * The Map-Notify message format is:
+ *
+ *       0                   1                   2                   3
+ *       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *      |Type=4 |I|R|          Reserved                 | Record Count  |
+ *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *      |                         Nonce . . .                           |
+ *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *      |                         . . . Nonce                           |
+ *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *      |            Key ID             |  Authentication Data Length   |
+ *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *      ~                     Authentication Data                       ~
+ *  +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |   |                          Record TTL                           |
+ *  |   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  R   | Locator Count | EID mask-len  | ACT |A|      Reserved         |
+ *  e   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  c   | Rsvd  |  Map-Version Number   |         EID-Prefix-AFI        |
+ *  o   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  r   |                          EID-Prefix                           |
+ *  d   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  /|    Priority   |    Weight     |  M Priority   |   M Weight    |
+ *  | L +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  | o |        Unused Flags     |L|p|R|           Loc-AFI             |
+ *  | c +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  \|                             Locator                           |
+ *  +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <netdissect-stdinc.h>
+#include <netdissect.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "ip.h"
+#ifdef INET6
+#include "ip6.h"
+#endif
+
+#include "extract.h"
+#include "interface.h"
+#include "addrtoname.h"
+
+#define IPv4_AFI                       1
+#define IPv6_AFI                       2
+#define TYPE_INDEX                     4
+#define LISP_MAP_NOTIFY_IBIT_MASK      8
+#define LISP_MAP_REGISTER_IBIT_MASK    2
+
+enum {
+       LISP_MAP_REQUEST = 1,
+       LISP_MAP_REPLY,
+       LISP_MAP_REGISTER,
+       LISP_MAP_NOTIFY,
+       LISP_ENCAPSULATED_CONTROL_MESSAGE = 8
+};
+
+enum {
+       LISP_AUTH_NONE,
+       LISP_AUTH_SHA1,
+       LISP_AUTH_SHA256
+};
+
+static const struct tok lisp_type [] = {
+       { 0, "LISP-Reserved"                    },
+       { 1, "LISP-Map-Request"                 },
+       { 2, "LISP-Map-Reply"                   },
+       { 3, "LISP-Map-Register"                },
+       { 4, "LISP-Map-Notify"                  },
+       { 8, "LISP-Encapsulated-Contol-Message" },
+       { 0, NULL }
+};
+
+/*
+ * P-Bit : Request for Proxy Map-Reply from the MS/MR
+ * S-Bit : Security Enhancement. ETR is LISP-SEC enabled. draft-ietf-lisp-sec
+ * I-Bit : 128 bit xTR-ID and 64 bit Site-ID present.
+ *        xTR-ID and Site-ID help in differentiation of xTRs in multi xTR
+ *        and multi Site deployment scenarios.
+ * R-Bit : Built for a Reencapsulating-Tunnel-Router. Used in Traffic
+ *        Engineering and Service Chaining
+ */
+static const struct tok map_register_hdr_flag[] = {
+       { 0x08000000, "P-Proxy-Map-Reply"  },
+       { 0x04000000, "S-LISP-SEC-Capable" },
+       { 0x02000000, "I-xTR-ID-Present"   },
+       { 0x01000000, "R-Build-For-RTR"    },
+       { 0x00000100, "M-Want-Map-Notify"  },
+       { 0, NULL }
+};
+
+static const struct tok map_notify_hdr_flag[] = {
+       { 0x08000000, "I-xTR-ID-Present"   },
+       { 0x04000000, "R-Build-For-RTR"    },
+       { 0, NULL }
+};
+
+static const struct tok auth_type[] = {
+       { LISP_AUTH_NONE,   "None"   },
+       { LISP_AUTH_SHA1,   "SHA1"   },
+       { LISP_AUTH_SHA256, "SHA256" },
+       { 0, NULL}
+};
+
+static const struct tok lisp_eid_action[] = {
+       { 0, "No-Action"        },
+       { 1, "Natively-Forward" },
+       { 2, "Send-Map-Request" },
+       { 3, "Drop"             },
+       { 0, NULL}
+};
+
+static const struct tok lisp_loc_flag[] = {
+       { 0x0004, "Local-Locator" },
+       { 0x0002, "RLoc-Probed"   },
+       { 0x0001, "Reachable"     },
+       { 0, NULL }
+};
+
+typedef struct map_register_hdr {
+       uint8_t type_and_flag;
+       uint8_t reserved;
+       uint8_t reserved_and_flag2;
+       uint8_t record_count;
+       uint64_t nonce;
+       uint16_t key_id;
+       uint16_t auth_data_len;
+} UNALIGNED lisp_map_register_hdr;
+
+#define MAP_REGISTER_HDR_LEN sizeof(lisp_map_register_hdr)
+
+typedef struct map_register_eid {
+       uint32_t ttl;
+       uint8_t locator_count;
+       uint8_t eid_prefix_mask_length;
+       uint8_t act_auth_inc_res;
+       uint8_t reserved;
+       uint8_t reserved_version_hi;
+       uint8_t version_low;
+       uint16_t eid_prefix_afi;
+} UNALIGNED lisp_map_register_eid;
+
+#define MAP_REGISTER_EID_LEN sizeof(lisp_map_register_eid)
+
+typedef struct map_register_loc {
+       uint8_t priority;
+       uint8_t weight;
+       uint8_t m_priority;
+       uint8_t m_weight;
+       uint16_t unused_and_flag;
+       uint16_t locator_afi;
+} UNALIGNED lisp_map_register_loc;
+
+#define MAP_REGISTER_LOC_LEN sizeof(lisp_map_register_loc)
+
+static inline uint8_t extract_lisp_type(uint8_t);
+static inline uint8_t is_xtr_data_present(uint8_t , uint8_t);
+static void lisp_hdr_flag(netdissect_options *, const lisp_map_register_hdr *);
+static void action_flag(netdissect_options *, uint8_t);
+static void loc_hdr_flag(netdissect_options *, uint16_t);
+
+void lisp_print(netdissect_options *ndo, const u_char *bp, u_int length)
+{
+       uint8_t type;
+       uint8_t mask_len;
+       uint8_t loc_count;
+       uint8_t xtr_present;
+       uint8_t record_count;
+       uint16_t key_id;
+       uint16_t eid_afi;
+       uint16_t loc_afi;
+       uint16_t map_version;
+       uint16_t packet_offset;
+       uint16_t auth_data_len;
+       uint32_t ttl;
+       const u_char *packet_iterator;
+       const u_char *loc_ip_pointer;
+       const lisp_map_register_hdr *lisp_hdr;
+       const lisp_map_register_eid *lisp_eid;
+       const lisp_map_register_loc *lisp_loc;
+
+       /* Check if enough bytes for header are available */
+       ND_TCHECK2(*bp, MAP_REGISTER_HDR_LEN);
+       lisp_hdr = (const lisp_map_register_hdr *) bp;
+       lisp_hdr_flag(ndo, lisp_hdr);
+       /* Supporting only MAP NOTIFY and MAP REGISTER LISP packets */
+       type = extract_lisp_type(lisp_hdr->type_and_flag);
+       if ((type != LISP_MAP_REGISTER) && (type != LISP_MAP_NOTIFY))
+               return;
+
+       /* Find if the packet contains xTR and Site-ID data */
+       xtr_present = is_xtr_data_present(type, lisp_hdr->type_and_flag);
+
+       /* Extract the number of EID records present */
+       auth_data_len = EXTRACT_16BITS(&lisp_hdr->auth_data_len);
+       packet_iterator = (const u_char *)(lisp_hdr);
+       packet_offset = MAP_REGISTER_HDR_LEN;
+       record_count = lisp_hdr->record_count;
+
+       if (ndo->ndo_vflag) {
+               key_id = EXTRACT_16BITS(&lisp_hdr->key_id);
+               ND_PRINT((ndo, "\n    %u record(s), ", record_count));
+               ND_PRINT((ndo, "Authentication %s,",
+                       tok2str(auth_type, "unknown-type", key_id)));
+               hex_print(ndo, "\n    Authentication-Data: ", packet_iterator +
+                                               packet_offset, auth_data_len);
+       } else {
+               ND_PRINT((ndo, " %u record(s),", record_count));
+       }
+       packet_offset += auth_data_len;
+
+       if (record_count == 0)
+               goto malformed;
+
+       /* Print all the EID records */
+       while ((length > packet_offset) && (record_count--)) {
+
+               ND_TCHECK2(*(packet_iterator + packet_offset), MAP_REGISTER_EID_LEN);
+               ND_PRINT((ndo, "\n"));
+               lisp_eid = (const lisp_map_register_eid *)
+                               ((const u_char *)lisp_hdr + packet_offset);
+               packet_offset += MAP_REGISTER_EID_LEN;
+               mask_len = lisp_eid->eid_prefix_mask_length;
+               eid_afi = EXTRACT_16BITS(&lisp_eid->eid_prefix_afi);
+               loc_count = lisp_eid->locator_count;
+
+               if (ndo->ndo_vflag) {
+                       ttl = EXTRACT_32BITS(&lisp_eid->ttl);
+                       ND_PRINT((ndo, "      Record TTL %u,", ttl));
+                       action_flag(ndo, lisp_eid->act_auth_inc_res);
+                       map_version = (((lisp_eid->reserved_version_hi) & 15 ) * 255) +
+                                       lisp_eid->version_low;
+                       ND_PRINT((ndo, " Map Version: %u,", map_version));
+               }
+
+               switch (eid_afi) {
+               case IPv4_AFI:
+                       ND_TCHECK2(*(packet_iterator + packet_offset), 4);
+                       ND_PRINT((ndo, " EID %s/%u,", getname(ndo,
+                               packet_iterator + packet_offset), mask_len));
+                       packet_offset += 4;
+                       break;
+               case IPv6_AFI:
+                       ND_TCHECK2(*(packet_iterator + packet_offset), 16);
+                       #ifdef INET6
+                       ND_PRINT((ndo, " EID %s/%u,", getname6(ndo,
+                               packet_iterator + packet_offset), mask_len));
+                       #else
+                       ND_PRINT((ndo, " IPv6 EID,"));
+                       #endif
+                       packet_offset += 16;
+                       break;
+               default:
+                       /*
+                        * No support for LCAF right now.
+                        */
+                       return;
+                       break;
+               }
+
+               ND_PRINT((ndo, " %u locator(s)", loc_count));
+
+               while (loc_count--) {
+                       ND_TCHECK2(*(packet_iterator + packet_offset), MAP_REGISTER_LOC_LEN);
+                       lisp_loc = (const lisp_map_register_loc *) (packet_iterator + packet_offset);
+                       loc_ip_pointer = (const u_char *) (lisp_loc + 1);
+                       packet_offset += MAP_REGISTER_LOC_LEN;
+                       loc_afi = EXTRACT_16BITS(&lisp_loc->locator_afi);
+
+                       if (ndo->ndo_vflag)
+                               ND_PRINT((ndo, "\n       "));
+
+                       switch (loc_afi) {
+                       case IPv4_AFI:
+                               ND_TCHECK2(*(packet_iterator + packet_offset), 4);
+                               ND_PRINT((ndo, " LOC %s", getname(ndo, loc_ip_pointer)));
+                               packet_offset += 4;
+                               break;
+                       case IPv6_AFI:
+                               ND_TCHECK2(*(packet_iterator + packet_offset), 16);
+                               #ifdef INET6
+                               ND_PRINT((ndo, " LOC %s", getname6(ndo, loc_ip_pointer)));
+                               #else
+                               ND_PRINT((ndo, " LOC IPv6"));
+                               #endif
+                               packet_offset += 16;
+                               break;
+                       default:
+                               break;
+                       }
+                       if (ndo->ndo_vflag) {
+                               ND_PRINT((ndo, "\n          Priority/Weight %u/%u,"
+                                               " Multicast Priority/Weight %u/%u,",
+                                               lisp_loc->priority, lisp_loc->weight,
+                                               lisp_loc->m_priority, lisp_loc->m_weight));
+                               loc_hdr_flag(ndo, EXTRACT_16BITS(&lisp_loc->unused_and_flag));
+                       }
+               }
+       }
+
+       /*
+        * Print xTR and Site ID. Handle the fact that the packet could be malformed.
+        * If the xTR_ID_Present bit is not set, and we still have data to display,
+        * show it as hex data.
+        */
+       if (xtr_present) {
+               if (!ND_TTEST2(*(packet_iterator + packet_offset), 24))
+                       goto malformed;
+               hex_print_with_offset(ndo, "\n    xTR-ID: ", packet_iterator + packet_offset, 16, 0);
+               ND_PRINT((ndo, "\n    SITE-ID: %" PRIu64,
+                       EXTRACT_64BITS(packet_iterator + packet_offset + 16)));
+       } else {
+               /* Check if packet isn't over yet */
+               if (packet_iterator + packet_offset < ndo->ndo_snapend) {
+                       hex_print_with_offset(ndo, "\n    Data: ", packet_iterator + packet_offset,
+                               (ndo->ndo_snapend - (packet_iterator + packet_offset)), 0);
+               }
+       }
+       return;
+trunc:
+       ND_PRINT((ndo, "\n    [|LISP]"));
+       return;
+malformed:
+       ND_PRINT((ndo, "\n    (malformed-packet)"));
+       return;
+}
+
+
+static inline uint8_t extract_lisp_type(uint8_t lisp_hdr_flags)
+{
+       return (lisp_hdr_flags) >> TYPE_INDEX;
+}
+
+static inline uint8_t is_xtr_data_present(uint8_t type, uint8_t lisp_hdr_flags)
+{
+       uint8_t xtr_present;
+
+       if (type == LISP_MAP_REGISTER)
+               xtr_present = (lisp_hdr_flags) & LISP_MAP_REGISTER_IBIT_MASK;
+       else if (type == LISP_MAP_NOTIFY)
+               xtr_present = (lisp_hdr_flags) & LISP_MAP_NOTIFY_IBIT_MASK;
+
+       return xtr_present;
+}
+
+static void lisp_hdr_flag(netdissect_options *ndo, const lisp_map_register_hdr *lisp_hdr)
+{
+       uint8_t type = extract_lisp_type(lisp_hdr->type_and_flag);
+
+       if (!ndo->ndo_vflag) {
+               ND_PRINT((ndo, "%s,", tok2str(lisp_type, "unknown-type-%u", type)));
+               return;
+       } else {
+               ND_PRINT((ndo, "%s,", tok2str(lisp_type, "unknown-type-%u", type)));
+       }
+
+       if (type == LISP_MAP_REGISTER) {
+               ND_PRINT((ndo, " flags [%s],", bittok2str(map_register_hdr_flag,
+                        "none", EXTRACT_32BITS(lisp_hdr))));
+       } else if (type == LISP_MAP_NOTIFY) {
+               ND_PRINT((ndo, " flags [%s],", bittok2str(map_notify_hdr_flag,
+                        "none", EXTRACT_32BITS(lisp_hdr))));
+       }
+
+       return;
+}
+
+
+static void action_flag(netdissect_options *ndo, uint8_t act_auth_inc_res)
+{
+       uint8_t action;
+       uint8_t authoritative;
+
+       authoritative  = ((act_auth_inc_res >> 4) & 1);
+
+       if (authoritative)
+               ND_PRINT((ndo, " Authoritative,"));
+       else
+               ND_PRINT((ndo, " Non-Authoritative,"));
+
+       action = act_auth_inc_res >> 5;
+       ND_PRINT((ndo, " %s,", tok2str(lisp_eid_action, "unknown", action)));
+}
+
+
+static void loc_hdr_flag(netdissect_options *ndo, uint16_t flag)
+{
+       ND_PRINT((ndo, " flags [%s],", bittok2str(lisp_loc_flag, "none", flag)));
+}
+
index cc6b275e8d12c5dcd5e56ad8ff44792f7b9985cc..f9a6e333750581d247729e2f12c88e3ea973ac83 100644 (file)
@@ -652,6 +652,8 @@ udp_print(netdissect_options *ndo, register const u_char *bp, u_int length,
                        vxlan_print(ndo, (const u_char *)(up + 1), length);
                 else if (ISPORT(GENEVE_PORT))
                        geneve_print(ndo, (const u_char *)(up + 1), length);
+               else if (ISPORT(LISP_CONTROL_PORT))
+                       lisp_print(ndo, (const u_char *)(up + 1), length);
                else {
                        if (ulen > length)
                                ND_PRINT((ndo, "UDP, bad length %u > %u",
index 9aed41d83a79bd46892ff8e6a2d11780ab839a02..043612da2249dc762e346e8e842213b7a0903bc1 100644 (file)
@@ -306,3 +306,8 @@ olsrv1_1    OLSRv1_HNA_sgw_1.pcap           OLSRv1_HNA_sgw_1.out    -t -v
 
 # tests with unaligned data, to make sure they work on SPARC
 unaligned-nfs-1        unaligned-nfs-1.pcap    unaligned-nfs-1.out     -t -v
+
+# LISP tests
+lisp_eid_notify                lisp_eid_notify.pcap    lisp_eid_notify.out     -t -v
+lisp_eid_register      lisp_eid_register.pcap  lisp_eid_register.out   -t -v
+lisp_ipv6_eid          lisp_ipv6.pcap          lisp_ipv6.out           -t -v
diff --git a/tests/lisp_eid_notify.out b/tests/lisp_eid_notify.out
new file mode 100644 (file)
index 0000000..d333021
--- /dev/null
@@ -0,0 +1,63 @@
+IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto UDP (17), length 160)
+    192.168.0.105.4342 > 127.0.0.1.4342: LISP-Map-Notify, flags [none],
+    3 record(s), Authentication SHA1,
+    Authentication-Data: 0x0000:  4bbb 9614 a67a 8604 0407 7995 4537 1906
+    Authentication-Data: 0x0010:  836c d1d6
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.100/32, 1 locator(s)
+        LOC 20.20.8.253
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.96/32, 2 locator(s)
+        LOC 20.20.8.251
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+        LOC 20.20.8.252
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.80/32, 1 locator(s)
+        LOC 20.20.8.239
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto UDP (17), length 156)
+    192.168.0.105.4342 > 127.0.0.1.4342: LISP-Map-Notify, flags [I-xTR-ID-Present],
+    2 record(s), Authentication SHA1,
+    Authentication-Data: 0x0000:  4bbb 9614 a67a 8604 0407 7995 4537 1906
+    Authentication-Data: 0x0010:  836c d1d6
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.100/32, 1 locator(s)
+        LOC 20.20.8.253
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.96/32, 2 locator(s)
+        LOC 20.20.8.251
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+        LOC 20.20.8.252
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+    xTR-ID: 0x0000:  9787 ad75 3caf 58a7 13fa 6920 e6d2 7a8f
+    SITE-ID: 0
+IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto UDP (17), length 160)
+    192.168.0.105.4342 > 127.0.0.1.4342: LISP-Map-Notify, flags [I-xTR-ID-Present],
+    3 record(s), Authentication SHA1,
+    Authentication-Data: 0x0000:  4bbb 9614 a67a 8604 0407 7995 4537 1906
+    Authentication-Data: 0x0010:  836c d1d6
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.100/32, 1 locator(s)
+        LOC 20.20.8.253
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.96/32, 2 locator(s)
+        LOC 20.20.8.251
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+        LOC 20.20.8.252
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.80/32, 1 locator(s)
+        LOC 20.20.8.239
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+    (malformed-packet)
+IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto UDP (17), length 156)
+    192.168.0.105.4342 > 127.0.0.1.4342: LISP-Map-Notify, flags [none],
+    2 record(s), Authentication SHA1,
+    Authentication-Data: 0x0000:  4bbb 9614 a67a 8604 0407 7995 4537 1906
+    Authentication-Data: 0x0010:  836c d1d6
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.100/32, 1 locator(s)
+        LOC 20.20.8.253
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.96/32, 2 locator(s)
+        LOC 20.20.8.251
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+        LOC 20.20.8.252
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+    Data: 0x0000:  9787 ad75 3caf 58a7 13fa 6920 e6d2 7a8f
+    Data: 0x0010:  0000 0000 0000 0000
diff --git a/tests/lisp_eid_notify.pcap b/tests/lisp_eid_notify.pcap
new file mode 100644 (file)
index 0000000..1f83378
Binary files /dev/null and b/tests/lisp_eid_notify.pcap differ
diff --git a/tests/lisp_eid_register.out b/tests/lisp_eid_register.out
new file mode 100644 (file)
index 0000000..7687b65
--- /dev/null
@@ -0,0 +1,28 @@
+IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto UDP (17), length 144)
+    192.168.0.105.4342 > 127.0.0.1.4342: LISP-Map-Register, flags [I-xTR-ID-Present, M-Want-Map-Notify],
+    2 record(s), Authentication SHA1,
+    Authentication-Data: 0x0000:  4bbb 9614 a67a 8604 0407 7995 4537 1906
+    Authentication-Data: 0x0010:  836c d1d6
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.100/32, 1 locator(s)
+        LOC 20.20.8.253
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.96/32, 1 locator(s)
+        LOC 20.20.8.252
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+    xTR-ID: 0x0000:  9787 ad75 3caf 58a7 13fa 6920 e6d2 7a8f
+    SITE-ID: 0
+IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto UDP (17), length 156)
+    192.168.0.105.4342 > 127.0.0.1.4342: LISP-Map-Register, flags [I-xTR-ID-Present, M-Want-Map-Notify],
+    2 record(s), Authentication SHA1,
+    Authentication-Data: 0x0000:  4bbb 9614 a67a 8604 0407 7995 4537 1906
+    Authentication-Data: 0x0010:  836c d1d6
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.100/32, 1 locator(s)
+        LOC 20.20.8.253
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, EID 10.30.1.96/32, 2 locator(s)
+        LOC 20.20.8.251
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+        LOC 20.20.8.252
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+    xTR-ID: 0x0000:  9787 ad75 3caf 58a7 13fa 6920 e6d2 7a8f
+    SITE-ID: 0
diff --git a/tests/lisp_eid_register.pcap b/tests/lisp_eid_register.pcap
new file mode 100644 (file)
index 0000000..a6d71ef
Binary files /dev/null and b/tests/lisp_eid_register.pcap differ
diff --git a/tests/lisp_ipv6.out b/tests/lisp_ipv6.out
new file mode 100644 (file)
index 0000000..e33844c
--- /dev/null
@@ -0,0 +1,24 @@
+IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto UDP (17), length 168)
+    192.168.0.105.4342 > 127.0.0.1.4342: LISP-Map-Register, flags [I-xTR-ID-Present, M-Want-Map-Notify],
+    2 record(s), Authentication SHA1,
+    Authentication-Data: 0x0000:  4bbb 9614 a67a 8604 0407 7995 4537 1906
+    Authentication-Data: 0x0010:  836c d1d6
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, IPv6 EID, 1 locator(s)
+        LOC 20.20.8.253
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, IPv6 EID, 1 locator(s)
+        LOC 20.20.8.251
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+    xTR-ID: 0x0000:  9787 ad75 3caf 58a7 13fa 6920 e6d2 7a8f
+    SITE-ID: 0
+IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto UDP (17), length 144)
+    192.168.0.105.4342 > 127.0.0.1.4342: LISP-Map-Notify, flags [none],
+    2 record(s), Authentication SHA1,
+    Authentication-Data: 0x0000:  4bbb 9614 a67a 8604 0407 7995 4537 1906
+    Authentication-Data: 0x0010:  836c d1d6
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, IPv6 EID, 1 locator(s)
+        LOC 20.20.8.253
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
+      Record TTL 1440, Authoritative, No-Action, Map Version: 0, IPv6 EID, 1 locator(s)
+        LOC 20.20.8.251
+          Priority/Weight 1/100, Multicast Priority/Weight 1/100, flags [none],
diff --git a/tests/lisp_ipv6.pcap b/tests/lisp_ipv6.pcap
new file mode 100644 (file)
index 0000000..b878efd
Binary files /dev/null and b/tests/lisp_ipv6.pcap differ
diff --git a/udp.h b/udp.h
index ca6836fa4aee3bac691d6fba7a8c8f58fc5dbac9..184947a40652ad128b7e3143913c97937ad2cdb1 100644 (file)
--- a/udp.h
+++ b/udp.h
@@ -248,6 +248,9 @@ struct udphdr {
 #ifndef NFS_LOCK_DAEMON_PORT
 #define NFS_LOCK_DAEMON_PORT           4045    /*XXX*/
 #endif
+#ifndef LISP_CONTROL_PORT
+#define LISP_CONTROL_PORT              4342    /* RFC 6830 */
+#endif
 #ifndef ISAKMP_PORT_NATT
 #define ISAKMP_PORT_NATT               4500    /* rfc3948 */
 #endif