12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions retain the above copyright notice and this paragraph
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * in its entirety, and (2) distributions including binary code include
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the above copyright notice and this paragraph in its entirety in
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the documentation or other materials provided with the distribution.
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR A PARTICULAR PURPOSE.
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Original code by Hannes Gredler (hannes@juniper.net)
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  and Steinar Haug (sthaug@nethelp.no)
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
1953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    "@(#) $Header: /tcpdump/master/tcpdump/print-ldp.c,v 1.20 2006-06-23 02:03:09 hannes Exp $";
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h>
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "decode_prefix.h"
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "l2vpn.h"
3853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "af.h"
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ldp common header
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  0                   1                   2                   3
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  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
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |  Version                      |         PDU Length            |
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                         LDP Identifier                        |
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                               |
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct ldp_common_header {
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t version[2];
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t pdu_length[2];
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t lsr_id[4];
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t label_space[2];
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_VERSION 1
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ldp message header
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  0                   1                   2                   3
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  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
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |U|   Message Type              |      Message Length           |
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                     Message ID                                |
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                                                               |
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +                                                               +
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                     Mandatory Parameters                      |
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +                                                               +
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                                                               |
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                                                               |
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +                                                               +
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                     Optional Parameters                       |
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +                                                               +
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                                                               |
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct ldp_msg_header {
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t type[2];
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t length[2];
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t id[4];
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MASK_MSG_TYPE(x)  ((x)&0x7fff)
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MASK_U_BIT(x)     ((x)&0x8000)
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MSG_NOTIF                0x0001
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MSG_HELLO                0x0100
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MSG_INIT                 0x0200
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MSG_KEEPALIVE            0x0201
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MSG_ADDRESS              0x0300
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MSG_ADDRESS_WITHDRAW     0x0301
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MSG_LABEL_MAPPING        0x0400
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MSG_LABEL_REQUEST        0x0401
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MSG_LABEL_WITHDRAW       0x0402
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MSG_LABEL_RELEASE        0x0403
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MSG_LABEL_ABORT_REQUEST  0x0404
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_VENDOR_PRIVATE_MIN       0x3e00
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_VENDOR_PRIVATE_MAX       0x3eff
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_EXPERIMENTAL_MIN         0x3f00
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_EXPERIMENTAL_MAX         0x3fff
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok ldp_msg_values[] = {
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_MSG_NOTIF,	             "Notification" },
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_MSG_HELLO,	             "Hello" },
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_MSG_INIT,	             "Initialization" },
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_MSG_KEEPALIVE,             "Keepalive" },
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_MSG_ADDRESS,	             "Address" },
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_MSG_ADDRESS_WITHDRAW,	     "Address Withdraw" },
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_MSG_LABEL_MAPPING,	     "Label Mapping" },
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_MSG_LABEL_REQUEST,	     "Label Request" },
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_MSG_LABEL_WITHDRAW,	     "Label Withdraw" },
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_MSG_LABEL_RELEASE,	     "Label Release" },
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_MSG_LABEL_ABORT_REQUEST,   "Label Abort Request" },
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MASK_TLV_TYPE(x)  ((x)&0x3fff)
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_MASK_F_BIT(x) ((x)&0x4000)
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_FEC                  0x0100
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_ADDRESS_LIST         0x0101
13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LDP_TLV_ADDRESS_LIST_AFNUM_LEN 2
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_HOP_COUNT            0x0103
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_PATH_VECTOR          0x0104
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_GENERIC_LABEL        0x0200
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_ATM_LABEL            0x0201
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_FR_LABEL             0x0202
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_STATUS               0x0300
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_EXTD_STATUS          0x0301
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_RETURNED_PDU         0x0302
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_RETURNED_MSG         0x0303
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_COMMON_HELLO         0x0400
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_IPV4_TRANSPORT_ADDR  0x0401
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_CONFIG_SEQ_NUMBER    0x0402
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_IPV6_TRANSPORT_ADDR  0x0403
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_COMMON_SESSION       0x0500
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_ATM_SESSION_PARM     0x0501
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_FR_SESSION_PARM      0x0502
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_TLV_FT_SESSION	     0x0503
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LDP_TLV_LABEL_REQUEST_MSG_ID 0x0600
15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LDP_TLV_MTU                  0x0601 /* rfc 3988 */
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok ldp_tlv_values[] = {
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_FEC,	             "FEC" },
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_ADDRESS_LIST,          "Address List" },
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_HOP_COUNT,             "Hop Count" },
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_PATH_VECTOR,           "Path Vector" },
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_GENERIC_LABEL,         "Generic Label" },
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_ATM_LABEL,             "ATM Label" },
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_FR_LABEL,              "Frame-Relay Label" },
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_STATUS,                "Status" },
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_EXTD_STATUS,           "Extended Status" },
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_RETURNED_PDU,          "Returned PDU" },
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_RETURNED_MSG,          "Returned Message" },
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_COMMON_HELLO,          "Common Hello Parameters" },
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_IPV4_TRANSPORT_ADDR,   "IPv4 Transport Address" },
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_CONFIG_SEQ_NUMBER,     "Configuration Sequence Number" },
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_IPV6_TRANSPORT_ADDR,   "IPv6 Transport Address" },
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_COMMON_SESSION,        "Common Session Parameters" },
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_ATM_SESSION_PARM,      "ATM Session Parameters" },
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_FR_SESSION_PARM,       "Frame-Relay Session Parameters" },
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_FT_SESSION,            "Fault-Tolerant Session Parameters" },
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_TLV_LABEL_REQUEST_MSG_ID,  "Label Request Message ID" },
17653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LDP_TLV_MTU,                   "MTU" },
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_WILDCARD	0x01
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_PREFIX		0x02
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_HOSTADDRESS	0x03
18353f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* From RFC 4906; should probably be updated to RFC 4447 (e.g., VC -> PW) */
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_MARTINI_VC	0x80
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok ldp_fec_values[] = {
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_FEC_WILDCARD,		"Wildcard" },
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_FEC_PREFIX,		"Prefix" },
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_FEC_HOSTADDRESS,	"Host address" },
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_FEC_MARTINI_VC,	"Martini VC" },
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_MARTINI_IFPARM_MTU  0x01
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_MARTINI_IFPARM_DESC 0x03
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_FEC_MARTINI_IFPARM_VCCV 0x0c
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok ldp_fec_martini_ifparm_values[] = {
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_FEC_MARTINI_IFPARM_MTU, "MTU" },
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_FEC_MARTINI_IFPARM_DESC, "Description" },
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { LDP_FEC_MARTINI_IFPARM_VCCV, "VCCV" },
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* draft-ietf-pwe3-vccv-04.txt */
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok ldp_fec_martini_ifparm_vccv_cc_values[] = {
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x01, "PWE3 control word" },
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x02, "MPLS Router Alert Label" },
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x04, "MPLS inner label TTL = 1" },
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* draft-ietf-pwe3-vccv-04.txt */
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok ldp_fec_martini_ifparm_vccv_cv_values[] = {
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x01, "ICMP Ping" },
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x02, "LSP Ping" },
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x04, "BFD" },
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint ldp_msg_print(register const u_char *);
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint ldp_tlv_print(register const u_char *);
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ldp tlv header
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  0                   1                   2                   3
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  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
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |U|F|        Type               |            Length             |
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                                                               |
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                             Value                             |
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ~                                                               ~
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                                                               |
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * |                               |
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TLV_TCHECK(minlen) \
24253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    TCHECK2(*tptr, minlen); if (tlv_tlen < minlen) goto badtlv;
24353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectldp_tlv_print(register const u_char *tptr) {
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    struct ldp_tlv_header {
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        u_int8_t type[2];
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        u_int8_t length[2];
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    };
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct ldp_tlv_header *ldp_tlv_header;
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_short tlv_type,tlv_len,tlv_tlen,af,ft_flags;
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_char fec_type;
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int ui,vc_info_len, vc_info_tlv_type, vc_info_tlv_len,idx;
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char buf[100];
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int i;
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    ldp_tlv_header = (const struct ldp_tlv_header *)tptr;
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tlv_len=EXTRACT_16BITS(ldp_tlv_header->length);
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tlv_tlen=tlv_len;
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tlv_type=LDP_MASK_TLV_TYPE(EXTRACT_16BITS(ldp_tlv_header->type));
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* FIXME vendor private / experimental check */
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("\n\t    %s TLV (0x%04x), length: %u, Flags: [%s and %s forward if unknown]",
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           tok2str(ldp_tlv_values,
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   "Unknown",
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tlv_type),
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           tlv_type,
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           tlv_len,
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           LDP_MASK_U_BIT(EXTRACT_16BITS(&ldp_tlv_header->type)) ? "continue processing" : "ignore",
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           LDP_MASK_F_BIT(EXTRACT_16BITS(&ldp_tlv_header->type)) ? "do" : "don't");
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tptr+=sizeof(struct ldp_tlv_header);
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    switch(tlv_type) {
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_COMMON_HELLO:
27953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        TLV_TCHECK(4);
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("\n\t      Hold Time: %us, Flags: [%s Hello%s]",
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               EXTRACT_16BITS(tptr),
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               (EXTRACT_16BITS(tptr+2)&0x8000) ? "Targeted" : "Link",
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               (EXTRACT_16BITS(tptr+2)&0x4000) ? ", Request for targeted Hellos" : "");
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        break;
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_IPV4_TRANSPORT_ADDR:
28753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        TLV_TCHECK(4);
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("\n\t      IPv4 Transport Address: %s", ipaddr_string(tptr));
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        break;
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_IPV6_TRANSPORT_ADDR:
29253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        TLV_TCHECK(16);
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("\n\t      IPv6 Transport Address: %s", ip6addr_string(tptr));
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        break;
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_CONFIG_SEQ_NUMBER:
29753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        TLV_TCHECK(4);
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("\n\t      Sequence Number: %u", EXTRACT_32BITS(tptr));
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        break;
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_ADDRESS_LIST:
30253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        TLV_TCHECK(LDP_TLV_ADDRESS_LIST_AFNUM_LEN);
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	af = EXTRACT_16BITS(tptr);
30453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	tptr+=LDP_TLV_ADDRESS_LIST_AFNUM_LEN;
30553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tlv_tlen -= LDP_TLV_ADDRESS_LIST_AFNUM_LEN;
30653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printf("\n\t      Address Family: %s, addresses",
30753f17a9db278d33517d9888dd77848f554522a38JP Abgrall               tok2str(af_values, "Unknown (%u)", af));
30853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        switch (af) {
30953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case AFNUM_INET:
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while(tlv_tlen >= sizeof(struct in_addr)) {
31153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		TCHECK2(*tptr, sizeof(struct in_addr));
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %s",ipaddr_string(tptr));
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tlv_tlen-=sizeof(struct in_addr);
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tptr+=sizeof(struct in_addr);
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
31653f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
31853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case AFNUM_INET6:
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    while(tlv_tlen >= sizeof(struct in6_addr)) {
32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		TCHECK2(*tptr, sizeof(struct in6_addr));
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %s",ip6addr_string(tptr));
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tlv_tlen-=sizeof(struct in6_addr);
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tptr+=sizeof(struct in6_addr);
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
32553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        default:
32853f17a9db278d33517d9888dd77848f554522a38JP Abgrall            /* unknown AF */
32953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
33053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_COMMON_SESSION:
33453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	TLV_TCHECK(8);
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t      Version: %u, Keepalive: %us, Flags: [Downstream %s, Loop Detection %s]",
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_16BITS(tptr), EXTRACT_16BITS(tptr+2),
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       (EXTRACT_16BITS(tptr+6)&0x8000) ? "On Demand" : "Unsolicited",
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       (EXTRACT_16BITS(tptr+6)&0x4000) ? "Enabled" : "Disabled"
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       );
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_FEC:
34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        TLV_TCHECK(1);
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        fec_type = *tptr;
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t      %s FEC (0x%02x)",
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       tok2str(ldp_fec_values, "Unknown", fec_type),
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       fec_type);
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	tptr+=1;
35053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	tlv_tlen-=1;
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch(fec_type) {
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LDP_FEC_WILDCARD:
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LDP_FEC_PREFIX:
35653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    TLV_TCHECK(2);
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    af = EXTRACT_16BITS(tptr);
35853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    tptr+=LDP_TLV_ADDRESS_LIST_AFNUM_LEN;
35953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    tlv_tlen-=LDP_TLV_ADDRESS_LIST_AFNUM_LEN;
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (af == AFNUM_INET) {
36153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		i=decode_prefix4(tptr,tlv_tlen,buf,sizeof(buf));
36253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (i == -2)
36353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    goto trunc;
36453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (i == -3)
36553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    printf(": IPv4 prefix (goes past end of TLV)");
36653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		else if (i == -1)
36753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    printf(": IPv4 prefix (invalid length)");
36853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		else
36953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    printf(": IPv4 prefix %s",buf);
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    else if (af == AFNUM_INET6) {
37353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		i=decode_prefix6(tptr,tlv_tlen,buf,sizeof(buf));
37453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (i == -2)
37553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    goto trunc;
37653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (i == -3)
37753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    printf(": IPv4 prefix (goes past end of TLV)");
37853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		else if (i == -1)
37953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    printf(": IPv6 prefix (invalid length)");
38053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		else
38153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    printf(": IPv6 prefix %s",buf);
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
38453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    else
38553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf(": Address family %u prefix", af);
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LDP_FEC_HOSTADDRESS:
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case LDP_FEC_MARTINI_VC:
39053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            /*
39153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	     * According to RFC 4908, the VC info Length field can be zero,
39253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	     * in which case not only are there no interface parameters,
39353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	     * there's no VC ID.
39453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	     */
39553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            TLV_TCHECK(7);
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            vc_info_len = *(tptr+2);
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
39853f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (vc_info_len == 0) {
39953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf(": %s, %scontrol word, group-ID %u, VC-info-length: %u",
40053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       tok2str(l2vpn_encaps_values, "Unknown", EXTRACT_16BITS(tptr)&0x7fff),
40153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       EXTRACT_16BITS(tptr)&0x8000 ? "" : "no ",
40253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       EXTRACT_32BITS(tptr+3),
40353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                       vc_info_len);
40453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                break;
40553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
40653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
40753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            /* Make sure we have the VC ID as well */
40853f17a9db278d33517d9888dd77848f554522a38JP Abgrall            TLV_TCHECK(11);
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(": %s, %scontrol word, group-ID %u, VC-ID %u, VC-info-length: %u",
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   tok2str(l2vpn_encaps_values, "Unknown", EXTRACT_16BITS(tptr)&0x7fff),
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   EXTRACT_16BITS(tptr)&0x8000 ? "" : "no ",
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   EXTRACT_32BITS(tptr+3),
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   EXTRACT_32BITS(tptr+7),
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   vc_info_len);
41553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (vc_info_len < 4)
41653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                goto trunc; /* minimum 4, for the VC ID */
41753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            vc_info_len -= 4; /* subtract out the VC ID, giving the length of the interface parameters */
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
41953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            /* Skip past the fixed information and the VC ID */
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr+=11;
42153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            tlv_tlen-=11;
42253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            TLV_TCHECK(vc_info_len);
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            while (vc_info_len > 2) {
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                vc_info_tlv_type = *tptr;
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                vc_info_tlv_len = *(tptr+1);
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (vc_info_tlv_len < 2)
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (vc_info_len < vc_info_tlv_len)
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("\n\t\tInterface Parameter: %s (0x%02x), len %u",
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(ldp_fec_martini_ifparm_values,"Unknown",vc_info_tlv_type),
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       vc_info_tlv_type,
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       vc_info_tlv_len);
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                switch(vc_info_tlv_type) {
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                case LDP_FEC_MARTINI_IFPARM_MTU:
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf(": %u",EXTRACT_16BITS(tptr+2));
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                case LDP_FEC_MARTINI_IFPARM_DESC:
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf(": ");
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    for (idx = 2; idx < vc_info_tlv_len; idx++)
4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        safeputchar(*(tptr+idx));
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                case LDP_FEC_MARTINI_IFPARM_VCCV:
4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("\n\t\t  Control Channels (0x%02x) = [%s]",
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           *(tptr+2),
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           bittok2str(ldp_fec_martini_ifparm_vccv_cc_values,"none",*(tptr+2)));
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("\n\t\t  CV Types (0x%02x) = [%s]",
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           *(tptr+3),
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           bittok2str(ldp_fec_martini_ifparm_vccv_cv_values,"none",*(tptr+3)));
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                default:
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    print_unknown_data(tptr+2,"\n\t\t  ",vc_info_tlv_len-2);
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                }
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                vc_info_len -= vc_info_tlv_len;
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tptr += vc_info_tlv_len;
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_GENERIC_LABEL:
47153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	TLV_TCHECK(4);
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t      Label: %u", EXTRACT_32BITS(tptr) & 0xfffff);
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_STATUS:
47653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	TLV_TCHECK(8);
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ui = EXTRACT_32BITS(tptr);
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	tptr+=4;
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t      Status: 0x%02x, Flags: [%s and %s forward]",
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       ui&0x3fffffff,
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       ui&0x80000000 ? "Fatal error" : "Advisory Notification",
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       ui&0x40000000 ? "do" : "don't");
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ui = EXTRACT_32BITS(tptr);
4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	tptr+=4;
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ui)
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", causing Message ID: 0x%08x", ui);
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_FT_SESSION:
49053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	TLV_TCHECK(8);
4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ft_flags = EXTRACT_16BITS(tptr);
4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n\t      Flags: [%sReconnect, %sSave State, %sAll-Label Protection, %s Checkpoint, %sRe-Learn State]",
4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       ft_flags&0x8000 ? "" : "No ",
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       ft_flags&0x8 ? "" : "Don't ",
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       ft_flags&0x4 ? "" : "No ",
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       ft_flags&0x2 ? "Sequence Numbered Label" : "All Labels",
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       ft_flags&0x1 ? "" : "Don't ");
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	tptr+=4;
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ui = EXTRACT_32BITS(tptr);
5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ui)
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", Reconnect Timeout: %ums", ui);
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	tptr+=4;
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ui = EXTRACT_32BITS(tptr);
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ui)
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(", Recovery Time: %ums", ui);
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
50853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    case LDP_TLV_MTU:
50953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	TLV_TCHECK(2);
51053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printf("\n\t      MTU: %u", EXTRACT_16BITS(tptr));
51153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	break;
51253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /*
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     *  FIXME those are the defined TLVs that lack a decoder
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     *  you are welcome to contribute code ;-)
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     */
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_HOP_COUNT:
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_PATH_VECTOR:
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_ATM_LABEL:
5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_FR_LABEL:
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_EXTD_STATUS:
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_RETURNED_PDU:
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_RETURNED_MSG:
5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_ATM_SESSION_PARM:
5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_FR_SESSION_PARM:
5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case LDP_TLV_LABEL_REQUEST_MSG_ID:
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    default:
5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (vflag <= 1)
5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            print_unknown_data(tptr,"\n\t      ",tlv_tlen);
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        break;
5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return(tlv_len+4); /* Type & Length fields not included */
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("\n\t\t packet exceeded snapshot");
5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return 0;
54053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
54153f17a9db278d33517d9888dd77848f554522a38JP Abgrallbadtlv:
54253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t\t TLV contents go past end of TLV");
54353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    return(tlv_len+4); /* Type & Length fields not included */
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectldp_print(register const u_char *pptr, register u_int len) {
5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int processed;
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    while (len > (sizeof(struct ldp_common_header) + sizeof(struct ldp_msg_header))) {
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        processed = ldp_msg_print(pptr);
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (processed == 0)
5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return;
5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        len -= processed;
5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        pptr += processed;
5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectldp_msg_print(register const u_char *pptr) {
5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct ldp_common_header *ldp_com_header;
5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct ldp_msg_header *ldp_msg_header;
5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *tptr,*msg_tptr;
5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_short tlen;
5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_short pdu_len,msg_len,msg_type,msg_tlen;
5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int hexdump,processed;
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tptr=pptr;
5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    ldp_com_header = (const struct ldp_common_header *)pptr;
5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK(*ldp_com_header);
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /*
5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     * Sanity checking of the header.
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     */
5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (EXTRACT_16BITS(&ldp_com_header->version) != LDP_VERSION) {
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%sLDP version %u packet not supported",
5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               (vflag < 1) ? "" : "\n\t",
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               EXTRACT_16BITS(&ldp_com_header->version));
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return 0;
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* print the LSR-ID, label-space & length */
5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    pdu_len = EXTRACT_16BITS(&ldp_com_header->pdu_length);
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("%sLDP, Label-Space-ID: %s:%u, pdu-length: %u",
5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           (vflag < 1) ? "" : "\n\t",
5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           ipaddr_string(&ldp_com_header->lsr_id),
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           EXTRACT_16BITS(&ldp_com_header->label_space),
5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           pdu_len);
5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* bail out if non-verbose */
5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (vflag < 1)
5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return 0;
5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* ok they seem to want to know everything - lets fully decode it */
5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tlen=pdu_len;
5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tptr += sizeof(const struct ldp_common_header);
6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tlen -= sizeof(const struct ldp_common_header)-4;	/* Type & Length fields not included */
6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    while(tlen>0) {
6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* did we capture enough for fully decoding the msg header ? */
60453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        TCHECK2(*tptr, sizeof(struct ldp_msg_header));
6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        ldp_msg_header = (const struct ldp_msg_header *)tptr;
6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        msg_len=EXTRACT_16BITS(ldp_msg_header->length);
6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        msg_type=LDP_MASK_MSG_TYPE(EXTRACT_16BITS(ldp_msg_header->type));
6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* FIXME vendor private / experimental check */
6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("\n\t  %s Message (0x%04x), length: %u, Message ID: 0x%08x, Flags: [%s if unknown]",
6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tok2str(ldp_msg_values,
6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       "Unknown",
6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       msg_type),
6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               msg_type,
6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               msg_len,
6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               EXTRACT_32BITS(&ldp_msg_header->id),
6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               LDP_MASK_U_BIT(EXTRACT_16BITS(&ldp_msg_header->type)) ? "continue processing" : "ignore");
6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (msg_len == 0) /* infinite loop protection */
6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return 0;
6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        msg_tptr=tptr+sizeof(struct ldp_msg_header);
6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        msg_tlen=msg_len-sizeof(struct ldp_msg_header)+4; /* Type & Length fields not included */
6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* did we capture enough for fully decoding the message ? */
62753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        TCHECK2(*tptr, msg_len);
6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        hexdump=FALSE;
6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        switch(msg_type) {
6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case LDP_MSG_NOTIF:
6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case LDP_MSG_HELLO:
6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case LDP_MSG_INIT:
6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case LDP_MSG_KEEPALIVE:
6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case LDP_MSG_ADDRESS:
6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case LDP_MSG_LABEL_MAPPING:
6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case LDP_MSG_ADDRESS_WITHDRAW:
6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case LDP_MSG_LABEL_WITHDRAW:
6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            while(msg_tlen >= 4) {
6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                processed = ldp_tlv_print(msg_tptr);
6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (processed == 0)
6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                msg_tlen-=processed;
6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                msg_tptr+=processed;
6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /*
6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  FIXME those are the defined messages that lack a decoder
6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *  you are welcome to contribute code ;-)
6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         */
6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case LDP_MSG_LABEL_REQUEST:
6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case LDP_MSG_LABEL_RELEASE:
6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case LDP_MSG_LABEL_ABORT_REQUEST:
6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        default:
6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (vflag <= 1)
6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data(msg_tptr,"\n\t  ",msg_tlen);
6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* do we want to see an additionally hexdump ? */
6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (vflag > 1 || hexdump==TRUE)
66553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            print_unknown_data(tptr+sizeof(struct ldp_msg_header),"\n\t  ",
6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               msg_len);
6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        tptr += msg_len+4;
6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        tlen -= msg_len+4;
6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return pdu_len+4;
6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("\n\t\t packet exceeded snapshot");
6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return 0;
6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
677