mirror of
https://github.com/rtbrick/bngblaster.git
synced 2024-05-06 15:54:57 +00:00
1038 lines
36 KiB
C
1038 lines
36 KiB
C
/*
|
|
* Protocol Encode/Decode Functions
|
|
*
|
|
* Christian Giese, July 2020
|
|
*
|
|
* Copyright (C) 2020-2023, RtBrick, Inc.
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef __BBL_PROTOCOLS_H__
|
|
#define __BBL_PROTOCOLS_H__
|
|
|
|
#include <endian.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <netinet/if_ether.h>
|
|
#include <netinet/ip.h>
|
|
|
|
#define BROADBAND_FORUM 3561
|
|
#define RTBRICK 50058
|
|
|
|
#define BBL_MAGIC_NUMBER 0x5274427269636b21
|
|
#define BBL_UDP_PORT 65056
|
|
#define BBL_HEADER_LEN 48
|
|
#define BBL_MIN_LEN 90
|
|
#define BBL_TYPE_UNICAST 1
|
|
#define BBL_TYPE_MULTICAST 2
|
|
#define BBL_SUB_TYPE_IPV4 1
|
|
#define BBL_SUB_TYPE_IPV6 2
|
|
#define BBL_SUB_TYPE_IPV6PD 3
|
|
#define BBL_DIRECTION_UP 1
|
|
#define BBL_DIRECTION_DOWN 2
|
|
#define BBL_DIRECTION_BOTH 3
|
|
|
|
#define BROADBAND_FORUM_VENDOR_ID 3561
|
|
|
|
#define ETH_TYPE_VLAN 0x8100
|
|
#define ETH_TYPE_QINQ 0x88A8
|
|
#define ETH_TYPE_PPPOE_DISCOVERY 0x8863
|
|
#define ETH_TYPE_PPPOE_SESSION 0x8864
|
|
#define ETH_TYPE_ARP 0x0806
|
|
#define ETH_TYPE_IPV4 0x0800
|
|
#define ETH_TYPE_IPV6 0x86dd
|
|
#define ETH_TYPE_CFM 0x8902
|
|
#define ETH_TYPE_MPLS 0x8847
|
|
#define ETH_TYPE_LACP 0x8809
|
|
#define ETH_TYPE_RAW 0xffff
|
|
|
|
#define SLOW_PROTOCOLS_LACP 0x01
|
|
#define LACP_TLV_TERMINATOR 0x00
|
|
#define LACP_TLV_ACTOR_INFORMATION 0x01
|
|
#define LACP_TLV_PARTNER_INFORMATION 0x02
|
|
#define LACP_TLV_COLLECTOR_INFORMATION 0x03
|
|
|
|
#define LACP_STATE_FLAG_ACTIVE 0x01
|
|
#define LACP_STATE_FLAG_SHORT_TIMEOUT 0x02
|
|
#define LACP_STATE_FLAG_AGGREGATION 0x04
|
|
#define LACP_STATE_FLAG_IN_SYNC 0x08
|
|
#define LACP_STATE_FLAG_COLLECTING 0x10
|
|
#define LACP_STATE_FLAG_DISTRIBUTING 0x20
|
|
#define LACP_STATE_FLAG_DEFAULTED 0x40
|
|
#define LACP_STATE_FLAG_EXPIRED 0x80
|
|
|
|
|
|
/* Ethernet types in network byte order */
|
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
|
#define NB_ETH_TYPE_VLAN 0x0081
|
|
#define NB_ETH_TYPE_QINQ 0xA888
|
|
#define NB_ETH_TYPE_PPPOE_DISCOVERY 0x6388
|
|
#define NB_ETH_TYPE_PPPOE_SESSION 0x6488
|
|
#define NB_ETH_TYPE_ARP 0x0608
|
|
#define NB_ETH_TYPE_IPV4 0x0008
|
|
#define NB_ETH_TYPE_IPV6 0xdd86
|
|
#define NB_ETH_TYPE_CFM 0x0289
|
|
#define NB_ETH_TYPE_MPLS 0x4788
|
|
#else
|
|
#define NB_ETH_TYPE_VLAN 0x8100
|
|
#define NB_ETH_TYPE_QINQ 0x88A8
|
|
#define NB_ETH_TYPE_PPPOE_DISCOVERY 0x8863
|
|
#define NB_ETH_TYPE_PPPOE_SESSION 0x8864
|
|
#define NB_ETH_TYPE_ARP 0x0806
|
|
#define NB_ETH_TYPE_IPV4 0x0800
|
|
#define NB_ETH_TYPE_IPV6 0x86dd
|
|
#define NB_ETH_TYPE_CFM 0x8902
|
|
#define NB_ETH_TYPE_MPLS 0x8847
|
|
#endif
|
|
|
|
#define BBL_ETH_VLAN_ID_MAX 4095
|
|
#define BBL_ETH_VLAN_PBIT_MAX 7
|
|
|
|
#define ETH_IEEE_802_3_MAX_LEN 1500
|
|
|
|
#define LLC_HDR_LEN 3
|
|
|
|
#define OUI_LEN 3
|
|
|
|
#define IPV4_RF 0x8000 /* reserved fragment flag */
|
|
#define IPV4_DF 0x4000 /* dont fragment flag */
|
|
#define IPV4_MF 0x2000 /* more fragments flag */
|
|
#define IPV4_OFFMASK 0x1fff /* mask for fragmenting bits */
|
|
|
|
#define IPV6_HDR_LEN 40
|
|
#define IPV6_IDENTIFER_LEN 8
|
|
|
|
#define PPPOE_TAG_SERVICE_NAME 0x0101
|
|
#define PPPOE_TAG_HOST_UNIQ 0x0103
|
|
#define PPPOE_TAG_AC_COOKIE 0x0104
|
|
#define PPPOE_TAG_VENDOR 0x0105
|
|
#define PPPOE_TAG_MAX_PAYLOAD 0x0120
|
|
|
|
#define PPPOE_PADI 0x09
|
|
#define PPPOE_PADO 0x07
|
|
#define PPPOE_PADR 0x19
|
|
#define PPPOE_PADS 0x65
|
|
#define PPPOE_PADT 0xa7
|
|
|
|
#define PPPOE_DEFAULT_MRU 1492
|
|
|
|
#define PROTOCOL_LCP 0xc021
|
|
#define PROTOCOL_IPCP 0x8021
|
|
#define PROTOCOL_IP6CP 0x8057
|
|
#define PROTOCOL_IPV4 0x0021
|
|
#define PROTOCOL_IPV6 0x0057
|
|
#define PROTOCOL_PAP 0xc023 /* Password Authentication Protocol */
|
|
#define PROTOCOL_CHAP 0xc223 /* Challenge Handshake Authentication Protocol */
|
|
#define PROTOCOL_IPV4_ICMP 0x01
|
|
#define PROTOCOL_IPV4_IGMP 0x02
|
|
#define PROTOCOL_IPV4_TCP 0x06
|
|
#define PROTOCOL_IPV4_UDP 0x11
|
|
#define PROTOCOL_IPV4_OSPF 0x59
|
|
#define PROTOCOL_IPV4_INTERNAL 0x3D
|
|
|
|
#define ICMP_TYPE_ECHO_REPLY 0x00
|
|
#define ICMP_TYPE_ECHO_REQUEST 0x08
|
|
|
|
#define PPP_CODE_VENDOR_SPECIFIC 0
|
|
#define PPP_CODE_CONF_REQUEST 1
|
|
#define PPP_CODE_CONF_ACK 2
|
|
#define PPP_CODE_CONF_NAK 3
|
|
#define PPP_CODE_CONF_REJECT 4
|
|
#define PPP_CODE_TERM_REQUEST 5
|
|
#define PPP_CODE_TERM_ACK 6
|
|
#define PPP_CODE_CODE_REJECT 7
|
|
#define PPP_CODE_PROT_REJECT 8
|
|
#define PPP_CODE_ECHO_REQUEST 9
|
|
#define PPP_CODE_ECHO_REPLY 10
|
|
#define PPP_CODE_DISCARD_REQUEST 11
|
|
|
|
#define PPP_MAX_OPTIONS 8
|
|
|
|
#define PAP_CODE_REQUEST 1
|
|
#define PAP_CODE_ACK 2
|
|
#define PAP_CODE_NAK 3
|
|
|
|
#define CHAP_CODE_CHALLENGE 1
|
|
#define CHAP_CODE_RESPONSE 2
|
|
#define CHAP_CODE_SUCCESS 3
|
|
#define CHAP_CODE_FAILURE 4
|
|
|
|
#define PPP_OPTIONS_BUFFER 64
|
|
|
|
#define PPP_LCP_OPTION_MRU 1
|
|
#define PPP_LCP_OPTION_AUTH 3
|
|
#define PPP_LCP_OPTION_MAGIC 5
|
|
|
|
#define PPP_IPCP_OPTION_ADDRESS 3
|
|
#define PPP_IPCP_OPTION_DNS1 129
|
|
#define PPP_IPCP_OPTION_DNS2 131
|
|
|
|
#define PPP_IP6CP_OPTION_IDENTIFIER 1
|
|
|
|
#define IGMP_VERSION_1 1
|
|
#define IGMP_VERSION_2 2
|
|
#define IGMP_VERSION_3 3
|
|
|
|
#define IGMP_TYPE_QUERY 0x11
|
|
#define IGMP_TYPE_REPORT_V1 0x12
|
|
#define IGMP_TYPE_REPORT_V2 0x16
|
|
#define IGMP_TYPE_REPORT_V3 0x22
|
|
#define IGMP_TYPE_LEAVE 0x17
|
|
|
|
#define IGMP_INCLUDE 1
|
|
#define IGMP_EXCLUDE 2
|
|
#define IGMP_CHANGE_TO_INCLUDE 3
|
|
#define IGMP_CHANGE_TO_EXCLUDE 4
|
|
#define IGMP_ALLOW_NEW_SOURCES 5
|
|
#define IGMP_BLOCK_OLD_SOURCES 6
|
|
|
|
#define IGMP_MAX_SOURCES 3
|
|
#define IGMP_MAX_GROUPS 12
|
|
|
|
#define IPV4_BROADCAST 0xffffffff /* 255.255.255.255 */
|
|
#define IPV4_MC_ALL_HOSTS 0x010000e0 /* 224.0.0.1 */
|
|
#define IPV4_MC_ALL_ROUTERS 0x020000e0 /* 224.0.0.2 */
|
|
#define IPV4_MC_IGMP 0x160000e0 /* 224.0.0.22 */
|
|
#define IPV4_MC_ALL_OSPF_ROUTERS 0x050000e0 /* 224.0.0.5 */
|
|
#define IPV4_MC_ALL_DR_ROUTERS 0x060000e0 /* 224.0.0.6 */
|
|
|
|
#define ARP_REQUEST 1
|
|
#define ARP_REPLY 2
|
|
|
|
#define UDP_PROTOCOL_DHCPV6 1
|
|
#define UDP_PROTOCOL_BBL 2
|
|
#define UDP_PROTOCOL_L2TP 3
|
|
#define UDP_PROTOCOL_QMX_LI 4
|
|
#define UDP_PROTOCOL_DHCP 5
|
|
#define UDP_PROTOCOL_LDP 6
|
|
|
|
#define IPV6_NEXT_HEADER_TCP 6
|
|
#define IPV6_NEXT_HEADER_UDP 17
|
|
#define IPV6_NEXT_HEADER_ICMPV6 58
|
|
#define IPV6_NEXT_HEADER_NO 59
|
|
#define IPV6_NEXT_HEADER_INTERNAL 61
|
|
#define IPV6_NEXT_HEADER_OSPF 89
|
|
|
|
#define ICMPV6_FLAGS_MANAGED 0x80
|
|
#define ICMPV6_FLAGS_OTHER_CONFIG 0x40
|
|
#define ICMPV6_OPTION_DEST_LINK_LAYER 2
|
|
#define ICMPV6_OPTION_PREFIX 3
|
|
#define ICMPV6_OPTION_DNS 25
|
|
|
|
#define BOOTREQUEST 1
|
|
#define BOOTREPLY 2
|
|
#define DHCP_UDP_CLIENT 68
|
|
#define DHCP_UDP_SERVER 67
|
|
#define DHCP_MAGIC_COOKIE htobe32(0x63825363)
|
|
#define DHCP_RELAY_AGENT_VENDOR_SUBOPT 9
|
|
|
|
#define DHCPV6_TRANS_ID_LEN 3
|
|
#define DHCPV6_TYPE_MASK 0x00ffffff
|
|
#define DHCPV6_DUID_LEN_MIN 3
|
|
#define DHCPV6_DUID_LEN_MAX 130
|
|
#define DHCPV6_HDR_LEN 4
|
|
#define DHCPV6_OPTION_HDR_LEN 4
|
|
#define DHCPV6_STATUS_CODE_LEN 2
|
|
#define DHCPV6_IA_ADDRESS_OPTION_LEN 24
|
|
#define DHCPV6_IA_PREFIX_OPTION_LEN 25
|
|
#define DHCPV6_ORO_OPTION_LEN 2
|
|
#define DHCPV6_UDP_CLIENT 546
|
|
#define DHCPV6_UDP_SERVER 547
|
|
|
|
#define L2TP_UDP_PORT 1701
|
|
#define L2TP_HDR_VERSION_MASK 0x0f
|
|
#define L2TP_HDR_CTRL_BIT_MASK 0x80
|
|
#define L2TP_HDR_LEN_BIT_MASK 0x40
|
|
#define L2TP_HDR_SEQ_BIT_MASK 0x08
|
|
#define L2TP_HDR_OFFSET_BIT_MASK 0x02
|
|
#define L2TP_HDR_PRIORITY_BIT_MASK 0x01
|
|
#define L2TP_HDR_LEN_MIN_WITH_LEN 8
|
|
#define L2TP_AVP_M_BIT_SHIFT 15
|
|
#define L2TP_AVP_H_BIT_SHIFT 14
|
|
#define L2TP_AVP_LEN_MASK 0x03FF
|
|
#define L2TP_AVP_HDR_LEN 6
|
|
#define L2TP_AVP_M_BIT_MASK 0x8000
|
|
#define L2TP_AVP_H_BIT_MASK 0x4000
|
|
#define L2TP_AVP_TYPE_LEN 2
|
|
#define L2TP_AVP_TYPE_LEN 2
|
|
#define L2TP_AVP_HIDDEN_FIXED_LEN 2
|
|
#define L2TP_AVP_MAX_LEN 1024
|
|
|
|
#define L2TP_NH_TYPE_VALUE 18
|
|
|
|
#define QMX_LI_UDP_PORT 49152
|
|
|
|
#define CFM_TYPE_CCM 1
|
|
#define CMF_MD_NAME_FORMAT_NONE 1
|
|
#define CMF_MD_NAME_FORMAT_STRING 4
|
|
#define CMF_MA_NAME_FORMAT_STRING 2
|
|
|
|
#define MAX_VLANS 3
|
|
|
|
#define BUMP_BUFFER(_buf, _len, _size) \
|
|
(_buf) += _size; \
|
|
_len -= _size
|
|
|
|
#define BUMP_WRITE_BUFFER(_buf, _len, _size) \
|
|
(_buf) += _size; \
|
|
*(uint16_t*)(_len) += _size
|
|
|
|
/* IPv6 Addresses */
|
|
static const ipv6addr_t ipv6_link_local_prefix = {0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
static const ipv6addr_t ipv6_link_local_address = {0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
|
|
static const ipv6addr_t ipv6_multicast_all_nodes = {0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
|
|
static const ipv6addr_t ipv6_multicast_all_routers = {0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02};
|
|
static const ipv6addr_t ipv6_multicast_ospf_routers = {0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05};
|
|
static const ipv6addr_t ipv6_multicast_dr_routers = {0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06};
|
|
static const ipv6addr_t ipv6_multicast_all_dhcp = {0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02};
|
|
static const ipv6addr_t ipv6_solicited_node_multicast = {0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00};
|
|
|
|
/* MAC Addresses */
|
|
static const uint8_t broadcast_mac[ETH_ADDR_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
|
|
static const uint8_t slow_mac[ETH_ADDR_LEN] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x02};
|
|
static const uint8_t all_hosts_mac[ETH_ADDR_LEN] = {0x01, 0x00, 0x5e, 0x00, 0x00, 0x01};
|
|
static const uint8_t all_routers_mac[ETH_ADDR_LEN] = {0x01, 0x00, 0x5e, 0x00, 0x00, 0x02};
|
|
static const uint8_t all_ospf_routers_mac[ETH_ADDR_LEN] = {0x01, 0x00, 0x5e, 0x00, 0x00, 0x05};
|
|
static const uint8_t all_dr_routers_mac[ETH_ADDR_LEN] = {0x01, 0x00, 0x5e, 0x00, 0x00, 0x06};
|
|
|
|
typedef enum protocol_error_ {
|
|
PROTOCOL_SUCCESS = 0,
|
|
SEND_ERROR,
|
|
DECODE_ERROR,
|
|
ENCODE_ERROR,
|
|
UNKNOWN_PROTOCOL,
|
|
WRONG_PROTOCOL_STATE,
|
|
IGNORED,
|
|
EMPTY,
|
|
FULL,
|
|
} protocol_error_t;
|
|
|
|
typedef enum icmpv6_message_ {
|
|
IPV6_ICMPV6_ECHO_REQUEST = 128,
|
|
IPV6_ICMPV6_ECHO_REPLY = 129,
|
|
IPV6_ICMPV6_ROUTER_SOLICITATION = 133,
|
|
IPV6_ICMPV6_ROUTER_ADVERTISEMENT = 134,
|
|
IPV6_ICMPV6_NEIGHBOR_SOLICITATION = 135,
|
|
IPV6_ICMPV6_NEIGHBOR_ADVERTISEMENT = 136
|
|
} icmpv6_message_t;
|
|
|
|
typedef enum dhcpv6_message_ {
|
|
DHCPV6_MESSAGE_SOLICIT = 1,
|
|
DHCPV6_MESSAGE_ADVERTISE = 2,
|
|
DHCPV6_MESSAGE_REQUEST = 3,
|
|
DHCPV6_MESSAGE_CONFIRM = 4,
|
|
DHCPV6_MESSAGE_RENEW = 5,
|
|
DHCPV6_MESSAGE_REBIND = 6,
|
|
DHCPV6_MESSAGE_REPLY = 7,
|
|
DHCPV6_MESSAGE_RELEASE = 8,
|
|
DHCPV6_MESSAGE_DECLINE = 9,
|
|
DHCPV6_MESSAGE_RECONFIGURE = 10,
|
|
DHCPV6_MESSAGE_INFORMATION_REQUEST = 11,
|
|
DHCPV6_MESSAGE_RELAY_FORW = 12,
|
|
DHCPV6_MESSAGE_RELAY_REPL = 13,
|
|
DHCPV6_MESSAGE_MAX,
|
|
} dhcpv6_message_t;
|
|
|
|
typedef enum l2tp_message_ {
|
|
L2TP_MESSAGE_DATA = 0,
|
|
L2TP_MESSAGE_SCCRQ = 1,
|
|
L2TP_MESSAGE_SCCRP = 2,
|
|
L2TP_MESSAGE_SCCCN = 3,
|
|
L2TP_MESSAGE_STOPCCN = 4,
|
|
L2TP_MESSAGE_HELLO = 6,
|
|
L2TP_MESSAGE_OCRQ = 7,
|
|
L2TP_MESSAGE_OCRP = 8,
|
|
L2TP_MESSAGE_OCCN = 9,
|
|
L2TP_MESSAGE_ICRQ = 10,
|
|
L2TP_MESSAGE_ICRP = 11,
|
|
L2TP_MESSAGE_ICCN = 12,
|
|
L2TP_MESSAGE_CDN = 14,
|
|
L2TP_MESSAGE_WEN = 15,
|
|
L2TP_MESSAGE_CSUN = 28,
|
|
L2TP_MESSAGE_CSURQ = 29,
|
|
L2TP_MESSAGE_ZLB = 32767,
|
|
L2TP_MESSAGE_MAX,
|
|
} l2tp_message_t;
|
|
|
|
typedef enum dhcpv6_option_ {
|
|
DHCPV6_OPTION_CLIENTID = 1,
|
|
DHCPV6_OPTION_SERVERID = 2,
|
|
DHCPV6_OPTION_IA_NA = 3,
|
|
DHCPV6_OPTION_IA_TA = 4,
|
|
DHCPV6_OPTION_IAADDR = 5,
|
|
DHCPV6_OPTION_ORO = 6,
|
|
DHCPV6_OPTION_PREFERENCE = 7,
|
|
DHCPV6_OPTION_ELAPSED_TIME = 8,
|
|
DHCPV6_OPTION_RELAY_MSG = 9,
|
|
DHCPV6_OPTION_AUTH = 11,
|
|
DHCPV6_OPTION_UNICAST = 12,
|
|
DHCPV6_OPTION_STATUS_CODE = 13,
|
|
DHCPV6_OPTION_RAPID_COMMIT = 14,
|
|
DHCPV6_OPTION_USER_CLASS = 15,
|
|
DHCPV6_OPTION_VENDOR_CLASS = 16,
|
|
DHCPV6_OPTION_VENDOR_OPTS = 17,
|
|
DHCPV6_OPTION_INTERFACE_ID = 18,
|
|
DHCPV6_OPTION_DNS_SERVERS = 23,
|
|
DHCPV6_OPTION_DOMAIN_LIST = 24,
|
|
DHCPV6_OPTION_IA_PD = 25,
|
|
DHCPV6_OPTION_IAPREFIX = 26,
|
|
DHCPV6_OPTION_REMOTE_ID = 37,
|
|
DHCPV6_OPTION_MAX,
|
|
} dhcpv6_option_t;
|
|
|
|
typedef enum {
|
|
DHCPV6_STATUS_CODE_SUCCESS = 0,
|
|
DHCPV6_STATUS_CODE_UNSPECFAIL = 1,
|
|
DHCPV6_STATUS_CODE_NOADDRSAVAIL = 2,
|
|
DHCPV6_STATUS_CODE_NOBINDING = 3,
|
|
DHCPV6_STATUS_CODE_NOTONLINK = 4,
|
|
DHCPV6_STATUS_CODE_USEMULTICAST = 5,
|
|
DHCPV6_STATUS_CODE_NOPREFIXAVAIL = 6
|
|
} dhcpv6_status_code_t;
|
|
|
|
|
|
typedef enum dhcp_message_ {
|
|
DHCP_MESSAGE_DISCOVER = 1,
|
|
DHCP_MESSAGE_OFFER = 2,
|
|
DHCP_MESSAGE_REQUEST = 3,
|
|
DHCP_MESSAGE_DECLINE = 4,
|
|
DHCP_MESSAGE_ACK = 5,
|
|
DHCP_MESSAGE_NAK = 6,
|
|
DHCP_MESSAGE_RELEASE = 7,
|
|
DHCP_MESSAGE_INFORM = 8,
|
|
DHCP_MESSAGE_MAX
|
|
} dhcp_message_t;
|
|
|
|
typedef enum dhcp_option_ {
|
|
DHCP_OPTION_PAD = 0,
|
|
DHCP_OPTION_SUBNET_MASK = 1,
|
|
DHCP_OPTION_TIME_OFFSET = 2,
|
|
DHCP_OPTION_ROUTER = 3,
|
|
DHCP_OPTION_TIME_SERVER = 4,
|
|
DHCP_OPTION_NAME_SERVER = 5,
|
|
DHCP_OPTION_DNS_SERVER = 6,
|
|
DHCP_OPTION_LOG_SERVER = 7,
|
|
DHCP_OPTION_COOKIE_SERVER = 8,
|
|
DHCP_OPTION_LPR_SERVER = 9,
|
|
DHCP_OPTION_IMPRESS_SERVER = 10,
|
|
DHCP_OPTION_RESOURCE_LOCATION_SERVER = 11,
|
|
DHCP_OPTION_HOST_NAME = 12,
|
|
DHCP_OPTION_BOOT_FILE_SIZE = 13,
|
|
DHCP_OPTION_MERIT_DUMP_FILE = 14,
|
|
DHCP_OPTION_DOMAIN_NAME = 15,
|
|
DHCP_OPTION_SWAP_SERVER = 16,
|
|
DHCP_OPTION_ROOT_PATH = 17,
|
|
DHCP_OPTION_EXTENSIONS_PATH = 18,
|
|
DHCP_OPTION_IP_FORWARDING = 19,
|
|
DHCP_OPTION_NON_LOCAL_SOURCE_ROUTING = 20,
|
|
DHCP_OPTION_POLICY_FILTER = 21,
|
|
DHCP_OPTION_MAX_DATAGRAM_REASSEMBLY_SIZE = 22,
|
|
DHCP_OPTION_DEFAULT_IP_TTL = 23,
|
|
DHCP_OPTION_PATH_MTU_AGING_TIMEOUT = 24,
|
|
DHCP_OPTION_PATH_MTU_PLATEAU_TABLE = 25,
|
|
DHCP_OPTION_INTERFACE_MTU = 26,
|
|
DHCP_OPTION_ALL_SUBNETS_ARE_LOCAL = 27,
|
|
DHCP_OPTION_BROADCAST_ADDRESS = 28,
|
|
DHCP_OPTION_PERFORM_MASK_DISCOVERY = 29,
|
|
DHCP_OPTION_MASK_SUPPLIER = 30,
|
|
DHCP_OPTION_PERFORM_ROUTER_DISCOVERY = 31,
|
|
DHCP_OPTION_ROUTER_SOLICITATION_ADDRESS = 32,
|
|
DHCP_OPTION_STATIC_ROUTE = 33,
|
|
DHCP_OPTION_TRAILER_ENCAPSULATION = 34,
|
|
DHCP_OPTION_ARP_CACHE_TIMEOUT = 35,
|
|
DHCP_OPTION_ETHERNET_ENCAPSULATION = 36,
|
|
DHCP_OPTION_TCP_DEFAULT_TTL = 37,
|
|
DHCP_OPTION_TCP_KEEPALIVE_INTERVAL = 38,
|
|
DHCP_OPTION_TCP_KEEPALIVE_GARBAGE = 39,
|
|
DHCP_OPTION_NIS_DOMAIN = 40,
|
|
DHCP_OPTION_NIS_SERVER = 41,
|
|
DHCP_OPTION_NTP_SERVER = 42,
|
|
DHCP_OPTION_VENDOR_SPECIFIC_INFO = 43,
|
|
DHCP_OPTION_NETBIOS_NBNS_SERVER = 44,
|
|
DHCP_OPTION_NETBIOS_NBDD_SERVER = 45,
|
|
DHCP_OPTION_NETBIOS_NODE_TYPE = 46,
|
|
DHCP_OPTION_NETBIOS_SCOPE = 47,
|
|
DHCP_OPTION_X11_FONT_SERVER = 48,
|
|
DHCP_OPTION_X11_DISPLAY_MANAGER = 49,
|
|
DHCP_OPTION_REQUESTED_IP_ADDRESS = 50,
|
|
DHCP_OPTION_IP_ADDRESS_LEASE_TIME = 51,
|
|
DHCP_OPTION_OPTION_OVERLOAD = 52,
|
|
DHCP_OPTION_DHCP_MESSAGE_TYPE = 53,
|
|
DHCP_OPTION_SERVER_IDENTIFIER = 54,
|
|
DHCP_OPTION_PARAM_REQUEST_LIST = 55,
|
|
DHCP_OPTION_MESSAGE = 56,
|
|
DHCP_OPTION_MAX_DHCP_MESSAGE_SIZE = 57,
|
|
DHCP_OPTION_RENEWAL_TIME_VALUE = 58,
|
|
DHCP_OPTION_REBINDING_TIME_VALUE = 59,
|
|
DHCP_OPTION_VENDOR_CLASS_IDENTIFIER = 60,
|
|
DHCP_OPTION_CLIENT_IDENTIFIER = 61,
|
|
DHCP_OPTION_NISP_DOMAIN = 64,
|
|
DHCP_OPTION_NISP_SERVER = 65,
|
|
DHCP_OPTION_TFTP_SERVER_NAME = 66,
|
|
DHCP_OPTION_BOOTFILE_NAME = 67,
|
|
DHCP_OPTION_MOBILE_IP_HOME_AGENT = 68,
|
|
DHCP_OPTION_SMTP_SERVER = 69,
|
|
DHCP_OPTION_POP3_SERVER = 70,
|
|
DHCP_OPTION_NNTP_SERVER = 71,
|
|
DHCP_OPTION_DEFAULT_WWW_SERVER = 72,
|
|
DHCP_OPTION_DEFAULT_FINGER_SERVER = 73,
|
|
DHCP_OPTION_DEFAULT_IRC_SERVER = 74,
|
|
DHCP_OPTION_STREETTALK_SERVER = 75,
|
|
DHCP_OPTION_STDA_SERVER = 76,
|
|
DHCP_OPTION_RAPID_COMMIT = 80,
|
|
DHCP_OPTION_RELAY_AGENT_INFORMATION = 82,
|
|
DHCP_OPTION_CAPTIVE_PORTAL = 160,
|
|
DHCP_OPTION_END = 255
|
|
} dhcp_option_t;
|
|
|
|
typedef enum access_line_attr_ {
|
|
/* broadband forum tr101 */
|
|
|
|
ACCESS_LINE_ACI = 0x01, /* Agent Circuit ID */
|
|
ACCESS_LINE_ARI = 0x02, /* Agent Remote ID */
|
|
ACCESS_LINE_AGG_ACC_CIRCUIT_ID_ASCII = 0x03, /* Access-Aggregation-Circuit-ID-ASCII */
|
|
ACCESS_LINE_AGG_ACC_CIRCUIT_ID_BIN = 0x06, /* Access-Aggregation-Circuit-ID-BINARY */
|
|
ACCESS_LINE_ACT_UP = 0x81, /* Actual Data Rate Upstream */
|
|
ACCESS_LINE_ACT_DOWN = 0x82, /* Actual Data Rate Downstream */
|
|
ACCESS_LINE_MIN_UP = 0x83, /* Minimum Data Rate Upstream */
|
|
ACCESS_LINE_MIN_DOWN = 0x84, /* Minimum Data Rate Downstream */
|
|
ACCESS_LINE_ATT_UP = 0x85, /* Attainable DataRate Upstream */
|
|
ACCESS_LINE_ATT_DOWN = 0x86, /* Attainable DataRate Downstream */
|
|
ACCESS_LINE_MAX_UP = 0x87, /* Maximum Data Rate Upstream */
|
|
ACCESS_LINE_MAX_DOWN = 0x88, /* Maximum Data Rate Downstream */
|
|
ACCESS_LINE_MIN_UP_LOW = 0x89, /* Min Data Rate Upstream in low power state */
|
|
ACCESS_LINE_MIN_DOWN_LOW = 0x8a, /* Min Data Rate Downstream in low power state */
|
|
ACCESS_LINE_MAX_INTERL_DELAY_UP = 0x8b, /* Max Interleaving Delay Upstream */
|
|
ACCESS_LINE_ACT_INTERL_DELAY_UP = 0x8c, /* Actual Interleaving Delay Upstream */
|
|
ACCESS_LINE_MAX_INTERL_DELAY_DOWN = 0x8d, /* Max Interleaving Delay Downstream */
|
|
ACCESS_LINE_ACT_INTERL_DELAY_DOWN = 0x8e, /* Actual Interleaving Delay Downstream */
|
|
ACCESS_LINE_DATA_LINK_ENCAPS = 0x90, /* Data Link Encapsulation */
|
|
ACCESS_LINE_DSL_TYPE = 0x91, /* DSL Type */
|
|
|
|
/* draft-lihawi-ancp-protocol-access-extension-04 */
|
|
|
|
ACCESS_LINE_PON_TYPE = 0x97, /* PON-Access-Type */
|
|
ACCESS_LINE_ETR_UP = 0x9b, /* Expected Throughput (ETR) Upstream */
|
|
ACCESS_LINE_ETR_DOWN = 0x9c, /* Expected Throughput (ETR) Downstream */
|
|
ACCESS_LINE_ATTETR_UP = 0x9d, /* Attainable Expected Throughput (ATTETR) Upstream */
|
|
ACCESS_LINE_ATTETR_DOWN = 0x9e, /* Attainable Expected Throughput (ATTETR) Downstream */
|
|
ACCESS_LINE_GDR_UP = 0x9f, /* Gamma Data Rate (GDR) Upstream */
|
|
ACCESS_LINE_GDR_DOWN = 0xa0, /* Gamma Data Rate (GDR) Downstream */
|
|
ACCESS_LINE_ATTGDR_UP = 0xa1, /* Attainable Gamma Data Rate (ATTGDR) Upstream */
|
|
ACCESS_LINE_ATTGDR_DOWN = 0xa2, /* Attainable Gamma Data Rate (ATTGDR) Downstream */
|
|
ACCESS_LINE_ONT_ONU_AVG_DOWN = 0xb0, /* ONT/ONU-Average-Data-Rate-Downstream */
|
|
ACCESS_LINE_ONT_ONU_PEAK_DOWN = 0xb1, /* ONT/ONU-Peak-Data-Rate-Downstream */
|
|
ACCESS_LINE_ONT_ONU_MAX_UP = 0xb2, /* ONT/ONU-Maximum-Data-Rate-Upstream */
|
|
ACCESS_LINE_ONT_ONU_ASS_UP = 0xb3, /* ONT/ONU-Assured-Data-Rate-Upstream */
|
|
ACCESS_LINE_PON_MAX_UP = 0xb4, /* PON-Tree-Maximum-Data-Rate-Upstream */
|
|
ACCESS_LINE_PON_MAX_DOWN = 0xb5, /* PON-Tree-Maximum-Data-Rate-Downstream */
|
|
} access_line_attr_t;
|
|
|
|
/* draft-lihawi-ancp-protocol-access-extension-00 */
|
|
typedef enum access_line_attr_lihawi_00_ {
|
|
ACCESS_LINE_PON_TYPE_LIHAWI_00 = 0x92, /* PON-Access-Type */
|
|
ACCESS_LINE_ONT_ONU_AVG_DOWN_LIHAWI_00 = 0x93, /* ONT/ONU-Average-Data-Rate-Downstream */
|
|
ACCESS_LINE_ONT_ONU_PEAK_DOWN_LIHAWI_00 = 0x94, /* ONT/ONU-Peak-Data-Rate-Downstream */
|
|
ACCESS_LINE_ONT_ONU_MAX_UP_LIHAWI_00 = 0x95, /* ONT/ONU-Maximum-Data-Rate-Upstream */
|
|
ACCESS_LINE_ONT_ONU_ASS_UP_LIHAWI_00 = 0x96, /* ONT/ONU-Assured-Data-Rate-Upstream */
|
|
ACCESS_LINE_PON_MAX_UP_LIHAWI_00 = 0x97, /* PON-Tree-Maximum-Data-Rate-Upstream */
|
|
ACCESS_LINE_PON_MAX_DOWN_LIHAWI_00 = 0x98, /* PON-Tree-Maximum-Data-Rate-Downstream */
|
|
}access_line_attr_lihawi_00_t;
|
|
|
|
typedef enum pon_access_line_version{
|
|
DRAFT_LIHAWI_00 = 0,
|
|
DRAFT_LIHAWI_04 = 4,
|
|
} __attribute__ ((__packed__)) pon_access_line_version_t;
|
|
|
|
typedef struct access_line_ {
|
|
char *aci; /* Agent Circuit ID */
|
|
char *ari; /* Agent Remote ID */
|
|
char *aaci; /* Access Aggregation Circuit ID */
|
|
uint32_t up; /* Actual Data Rate Upstream */
|
|
uint32_t down; /* Actual Data Rate Downstream */
|
|
uint32_t dsl_type; /* DSL Type */
|
|
void *profile;
|
|
} access_line_s;
|
|
|
|
/*
|
|
* MPLS Label
|
|
*/
|
|
typedef struct bbl_mpls_ {
|
|
uint32_t label; /* 20 bit label */
|
|
uint8_t exp;
|
|
uint8_t ttl;
|
|
void *next; /* next label */
|
|
} bbl_mpls_s;
|
|
|
|
/*
|
|
* ISIS PDU
|
|
*/
|
|
typedef struct bbl_isis_ {
|
|
uint8_t type;
|
|
uint8_t *pdu;
|
|
uint16_t pdu_len;
|
|
} bbl_isis_s;
|
|
|
|
/*
|
|
* OSPF PDU
|
|
*/
|
|
typedef struct bbl_ospf_ {
|
|
uint8_t version;
|
|
uint8_t type;
|
|
uint8_t *pdu;
|
|
uint16_t pdu_len;
|
|
} bbl_ospf_s;
|
|
|
|
typedef struct bbl_ldp_hello_ {
|
|
uint32_t lsr_id;
|
|
uint16_t label_space_id;
|
|
uint16_t hold_time;
|
|
uint32_t msg_id;
|
|
uint32_t ipv4_transport_address;
|
|
ipv6addr_t *ipv6_transport_address;
|
|
uint8_t dual_stack_capability;
|
|
} bbl_ldp_hello_s;
|
|
|
|
typedef struct bbl_bbl_ {
|
|
uint16_t padding;
|
|
uint8_t type;
|
|
uint8_t sub_type;
|
|
uint8_t direction;
|
|
uint8_t tos;
|
|
uint32_t session_id;
|
|
uint32_t ifindex;
|
|
uint16_t outer_vlan_id;
|
|
uint16_t inner_vlan_id;
|
|
uint32_t mc_source;
|
|
uint32_t mc_group;
|
|
uint64_t flow_id;
|
|
uint64_t flow_seq;
|
|
struct timespec timestamp;
|
|
} bbl_bbl_s;
|
|
|
|
/*
|
|
* Ethernet Header Structure
|
|
*/
|
|
typedef struct bbl_ethernet_header_ {
|
|
uint16_t length; /* frame length */
|
|
uint16_t type; /* ethertype */
|
|
uint16_t vlan_outer; /* outer VLAN identifier */
|
|
uint16_t vlan_inner; /* inner VLAN identifier */
|
|
uint16_t vlan_three; /* third VLAN */
|
|
uint8_t vlan_outer_priority;
|
|
uint8_t vlan_inner_priority;
|
|
|
|
uint8_t tos;
|
|
bool lwip;
|
|
bool qinq; /* ethertype 0x88a8 */
|
|
|
|
uint8_t *dst; /* destination MAC address */
|
|
uint8_t *src; /* source MAC address */
|
|
bbl_bbl_s *bbl; /* BBL stream header */
|
|
bbl_mpls_s *mpls; /* MPLS */
|
|
void *next; /* next header */
|
|
|
|
struct timespec timestamp; /* receive timestamp */
|
|
} bbl_ethernet_header_s;
|
|
|
|
/*
|
|
* PPPoE Discovery Structure
|
|
*/
|
|
typedef struct bbl_pppoe_discovery_ {
|
|
uint8_t code;
|
|
uint16_t session_id;
|
|
uint8_t *service_name;
|
|
uint16_t service_name_len;
|
|
uint8_t *ac_name;
|
|
uint16_t ac_name_len;
|
|
uint8_t *ac_cookie;
|
|
uint16_t ac_cookie_len;
|
|
uint8_t *host_uniq;
|
|
uint16_t host_uniq_len;
|
|
uint16_t max_payload;
|
|
access_line_s *access_line;
|
|
} bbl_pppoe_discovery_s;
|
|
|
|
/*
|
|
* PPPoE Session Structure
|
|
*
|
|
* Combined structure for 6 byte PPPoE
|
|
* session and 2 byte PPP header.
|
|
*/
|
|
typedef struct bbl_pppoe_session_ {
|
|
uint16_t session_id;
|
|
uint16_t protocol;
|
|
bool lwip;
|
|
void *next; /* next header */
|
|
void *payload; /* PPP payload */
|
|
uint16_t payload_len; /* PPP payload length */
|
|
} bbl_pppoe_session_s;
|
|
|
|
|
|
struct pppoe_ppp_session_header {
|
|
uint8_t version_type;
|
|
uint8_t code;
|
|
uint16_t session_id;
|
|
uint16_t len;
|
|
uint16_t protocol;
|
|
} __attribute__ ((__packed__));
|
|
|
|
/*
|
|
* PPP LCP Structure
|
|
*/
|
|
typedef struct bbl_lcp_ {
|
|
uint8_t code;
|
|
uint8_t identifier;
|
|
uint8_t *options;
|
|
uint8_t options_len;
|
|
uint16_t mru;
|
|
uint16_t auth;
|
|
uint16_t protocol;
|
|
uint32_t magic;
|
|
uint8_t vendor_oui[OUI_LEN];
|
|
uint8_t vendor_kind;
|
|
uint8_t *vendor_value;
|
|
uint16_t vendor_value_len;
|
|
uint8_t *start;
|
|
uint16_t len;
|
|
uint16_t padding;
|
|
uint8_t *option[PPP_MAX_OPTIONS];
|
|
bool unknown_options;
|
|
} bbl_lcp_s;
|
|
|
|
/*
|
|
* PPP IPCP Structure
|
|
*/
|
|
typedef struct bbl_ipcp_ {
|
|
uint8_t code;
|
|
uint8_t identifier;
|
|
uint8_t *options;
|
|
uint8_t options_len;
|
|
uint32_t address;
|
|
uint32_t dns1;
|
|
uint32_t dns2;
|
|
bool option_address;
|
|
bool option_dns1;
|
|
bool option_dns2;
|
|
uint8_t *option[PPP_MAX_OPTIONS];
|
|
bool unknown_options;
|
|
} bbl_ipcp_s;
|
|
|
|
/*
|
|
* PPP IP6CP Structure
|
|
*/
|
|
typedef struct bbl_ip6cp_ {
|
|
uint8_t code;
|
|
uint8_t identifier;
|
|
uint8_t *options;
|
|
uint8_t options_len;
|
|
uint64_t ipv6_identifier;
|
|
uint8_t *option[PPP_MAX_OPTIONS];
|
|
bool unknown_options;
|
|
} bbl_ip6cp_s;
|
|
|
|
/*
|
|
* PPP PAP Structure
|
|
*/
|
|
typedef struct bbl_ppp_pap_ {
|
|
uint8_t code;
|
|
uint8_t identifier;
|
|
char *username;
|
|
uint8_t username_len;
|
|
char *password;
|
|
uint8_t password_len;
|
|
char *reply_message;
|
|
uint8_t reply_message_len;
|
|
} bbl_pap_s;
|
|
|
|
/*
|
|
* PPP CHAP Structure
|
|
*/
|
|
typedef struct bbl_ppp_chap_ {
|
|
uint8_t code;
|
|
uint8_t identifier;
|
|
char *name;
|
|
uint8_t name_len;
|
|
uint8_t *challenge;
|
|
uint8_t challenge_len;
|
|
char *reply_message;
|
|
uint8_t reply_message_len;
|
|
} bbl_chap_s;
|
|
|
|
/*
|
|
* IPv4 Structure
|
|
*/
|
|
typedef struct bbl_ipv4_ {
|
|
uint32_t src;
|
|
uint32_t dst;
|
|
uint8_t tos;
|
|
uint8_t ttl;
|
|
uint8_t protocol;
|
|
bool router_alert_option; /* add router alert option if true */
|
|
uint16_t offset;
|
|
uint16_t len; /* IPv4 total length */
|
|
uint8_t *hdr; /* IPv4 header start */
|
|
void *next; /* next header */
|
|
void *payload; /* IPv4 payload */
|
|
uint16_t payload_len; /* IPv4 payload length */
|
|
} bbl_ipv4_s;
|
|
|
|
/*
|
|
* IPv6 Structure
|
|
*/
|
|
typedef struct bbl_ipv6_ {
|
|
uint8_t *src;
|
|
uint8_t *dst;
|
|
uint8_t tos;
|
|
uint8_t ttl;
|
|
uint8_t protocol;
|
|
uint16_t len; /* IPv6 total length */
|
|
uint8_t *hdr; /* IPv6 header start */
|
|
void *next; /* next header */
|
|
void *payload; /* IPv6 payload */
|
|
uint16_t payload_len; /* IPv6 payload length */
|
|
} bbl_ipv6_s;
|
|
|
|
/*
|
|
* UDP Structure
|
|
*/
|
|
typedef struct bbl_udp_ {
|
|
uint16_t src;
|
|
uint16_t dst;
|
|
uint8_t protocol;
|
|
void *next; /* next header */
|
|
void *payload; /* UDP payload */
|
|
uint16_t payload_len; /* UDP payload length */
|
|
} bbl_udp_s;
|
|
|
|
/*
|
|
* TCP Structure
|
|
*/
|
|
typedef struct bbl_tcp_ {
|
|
uint16_t src;
|
|
uint16_t dst;
|
|
uint16_t len; /* TCP total length */
|
|
uint8_t *hdr; /* TCP header start */
|
|
} bbl_tcp_s;
|
|
|
|
/*
|
|
* IGMP Structure
|
|
*/
|
|
typedef struct bbl_igmp_group_record_ {
|
|
uint8_t type;
|
|
uint32_t group;
|
|
uint8_t sources;
|
|
uint32_t source[IGMP_MAX_SOURCES];
|
|
} bbl_igmp_group_record_s;
|
|
|
|
typedef struct bbl_igmp_ {
|
|
uint8_t version;
|
|
uint8_t type;
|
|
uint8_t robustness;
|
|
uint32_t group;
|
|
uint32_t source;
|
|
uint8_t group_records;
|
|
bbl_igmp_group_record_s group_record[IGMP_MAX_GROUPS];
|
|
} bbl_igmp_s;
|
|
|
|
typedef struct bbl_icmp_ {
|
|
uint8_t type;
|
|
uint8_t code;
|
|
uint8_t *data;
|
|
uint16_t data_len;
|
|
} bbl_icmp_s;
|
|
|
|
typedef struct bbl_arp_ {
|
|
uint16_t code;
|
|
uint8_t *sender;
|
|
uint32_t sender_ip;
|
|
uint8_t *target;
|
|
uint32_t target_ip;
|
|
} bbl_arp_s;
|
|
|
|
typedef struct bbl_icmpv6_ {
|
|
uint8_t type;
|
|
uint8_t code;
|
|
uint8_t flags;
|
|
ipv6_prefix prefix;
|
|
uint8_t *mac;
|
|
uint8_t *data;
|
|
uint16_t data_len;
|
|
ipv6addr_t *dns1;
|
|
ipv6addr_t *dns2;
|
|
uint8_t *dst_mac;
|
|
} bbl_icmpv6_s;
|
|
|
|
typedef struct bbl_dhcpv6_ {
|
|
uint8_t type;
|
|
uint8_t hops;
|
|
uint32_t xid;
|
|
uint8_t *interface_id;
|
|
uint8_t interface_id_len;
|
|
uint8_t *client_duid;
|
|
uint8_t client_duid_len;
|
|
uint8_t *server_duid;
|
|
uint8_t server_duid_len;
|
|
ipv6addr_t *dns1;
|
|
ipv6addr_t *dns2;
|
|
bool rapid;
|
|
bool oro;
|
|
uint8_t *ia_na_option;
|
|
uint8_t ia_na_option_len;
|
|
uint32_t ia_na_iaid;
|
|
uint16_t ia_na_status_code;
|
|
ipv6addr_t *ia_na_address;
|
|
uint32_t ia_na_t1;
|
|
uint32_t ia_na_t2;
|
|
uint32_t ia_na_preferred_lifetime;
|
|
uint32_t ia_na_valid_lifetime;
|
|
uint8_t *ia_pd_option;
|
|
uint8_t ia_pd_option_len;
|
|
uint32_t ia_pd_iaid;
|
|
uint16_t ia_pd_status_code;
|
|
ipv6_prefix *ia_pd_prefix;
|
|
uint32_t ia_pd_t1;
|
|
uint32_t ia_pd_t2;
|
|
uint32_t ia_pd_preferred_lifetime;
|
|
uint32_t ia_pd_valid_lifetime;
|
|
access_line_s *access_line;
|
|
|
|
/* DHCPv6 Relay Attributes */
|
|
|
|
ipv6addr_t *link_address;
|
|
ipv6addr_t *peer_address;
|
|
struct bbl_dhcpv6_ *relay_message;
|
|
} bbl_dhcpv6_s;
|
|
|
|
struct dhcp_header {
|
|
uint8_t op;
|
|
uint8_t htype;
|
|
uint8_t hlen;
|
|
uint8_t hops;
|
|
uint32_t xid;
|
|
uint16_t secs;
|
|
uint16_t flags;
|
|
uint32_t ciaddr;
|
|
uint32_t yiaddr;
|
|
uint32_t siaddr;
|
|
uint32_t giaddr;
|
|
char chaddr[16];
|
|
char sname[64];
|
|
char file[128];
|
|
} __attribute__ ((__packed__));
|
|
|
|
typedef struct bbl_dhcp_ {
|
|
struct dhcp_header *header;
|
|
uint8_t type;
|
|
|
|
uint32_t server_identifier;
|
|
uint32_t lease_time;
|
|
uint32_t address;
|
|
uint32_t netmask;
|
|
uint32_t dns1;
|
|
uint32_t dns2;
|
|
uint32_t router;
|
|
uint16_t mtu;
|
|
char *host_name;
|
|
uint8_t host_name_len;
|
|
char *domain_name;
|
|
uint8_t domain_name_len;
|
|
|
|
bool parameter_request_list;
|
|
bool option_server_identifier;
|
|
bool option_lease_time;
|
|
bool option_address;
|
|
bool option_netmask;
|
|
bool option_dns1;
|
|
bool option_dns2;
|
|
bool option_router;
|
|
bool option_mtu;
|
|
bool option_host_name;
|
|
bool option_domain_name;
|
|
|
|
access_line_s *access_line;
|
|
uint8_t *client_identifier;
|
|
uint8_t client_identifier_len;
|
|
} bbl_dhcp_s;
|
|
|
|
typedef struct bbl_l2tp_ {
|
|
bool with_length; /* L Bit */
|
|
bool with_sequence; /* S Bit */
|
|
bool with_offset; /* O Bit */
|
|
bool with_priority; /* P Bit */
|
|
uint16_t type;
|
|
uint16_t length;
|
|
uint16_t tunnel_id;
|
|
uint16_t session_id;
|
|
uint16_t ns;
|
|
uint16_t nr;
|
|
uint16_t offset;
|
|
uint16_t protocol;
|
|
void *next; /* next header */
|
|
void *payload; /* l2tp payload */
|
|
uint16_t payload_len; /* l2tp payload length */
|
|
} bbl_l2tp_s;
|
|
|
|
typedef struct bbl_qmx_li_ {
|
|
uint32_t header;
|
|
uint8_t direction;
|
|
uint8_t packet_type;
|
|
uint8_t sub_packet_type;
|
|
uint32_t liid;
|
|
void *next; /* next header */
|
|
void *payload; /* LI payload */
|
|
uint16_t payload_len; /* LI payload length */
|
|
} bbl_qmx_li_s;
|
|
|
|
typedef struct bbl_cfm_ {
|
|
uint8_t type;
|
|
uint32_t seq;
|
|
bool rdi;
|
|
uint8_t md_level;
|
|
uint8_t md_name_format;
|
|
uint8_t md_name_len;
|
|
uint8_t *md_name;
|
|
uint16_t ma_id;
|
|
uint8_t ma_name_format;
|
|
uint8_t ma_name_len;
|
|
uint8_t *ma_name;
|
|
} bbl_cfm_s;
|
|
|
|
typedef struct bbl_lacp_ {
|
|
uint8_t *actor_system_id;
|
|
uint16_t actor_system_priority;
|
|
uint16_t actor_key;
|
|
uint16_t actor_port_priority;
|
|
uint16_t actor_port_id;
|
|
uint8_t actor_state;
|
|
|
|
uint8_t *partner_system_id;
|
|
uint16_t partner_system_priority;
|
|
uint16_t partner_key;
|
|
uint16_t partner_port_priority;
|
|
uint16_t partner_port_id;
|
|
uint8_t partner_state;
|
|
} bbl_lacp_s;
|
|
|
|
bool
|
|
packet_is_bbl(uint8_t *buf, uint16_t len);
|
|
|
|
uint16_t
|
|
bbl_checksum(uint8_t *buf, uint16_t len);
|
|
|
|
uint16_t
|
|
bbl_ipv6_ospf_checksum(ipv6addr_t src, ipv6addr_t dst, uint8_t *ospf, uint16_t ospf_len);
|
|
|
|
protocol_error_t
|
|
decode_ethernet(uint8_t *buf, uint16_t len,
|
|
uint8_t *sp, uint16_t sp_len,
|
|
bbl_ethernet_header_s **ethernet);
|
|
|
|
protocol_error_t
|
|
encode_ethernet(uint8_t *buf, uint16_t *len,
|
|
bbl_ethernet_header_s *eth);
|
|
|
|
#endif
|