File: //opt/alt/python37/lib/python3.7/site-packages/exabgp/protocol/ip/icmp.py
# encoding: utf-8
"""
icmp.py
Created by Thomas Mangin on 2010-01-15.
Copyright (c) 2009-2017 Exa Networks. All rights reserved.
License: 3-clause BSD. (See the COPYRIGHT file)
"""
from exabgp.protocol.resource import Resource
# ============================================================== ICMP Code Field
# https://www.iana.org/assignments/icmp-parameters
class ICMPType(Resource):
NAME = 'icmp type'
ECHO_REPLY = 0x00
# DESTINATION_UNREACHEABLE = 0x03
UNREACHABLE = 0x03
SOURCE_QUENCH = 0x04
REDIRECT = 0x05
ECHO_REQUEST = 0x08
ROUTER_ADVERTISEMENT = 0x09
ROUTER_SOLICIT = 0x0A
TIME_EXCEEDED = 0x0B
PARAMETER_PROBLEM = 0x0C
TIMESTAMP = 0x0D
TIMESTAMP_REPLY = 0x0E
INFO_REQUEST = 0x0F
INFO_REPLY = 0x10
MASK_REQUEST = 0x11
MASK_REPLY = 0x12
TRACEROUTE = 0x1E
codes = dict(
(k.lower().replace('_', '-'), v)
for (k, v) in {
'ECHO_REPLY': ECHO_REPLY,
'UNREACHABLE': UNREACHABLE,
'SOURCE_QUENCH': SOURCE_QUENCH,
'REDIRECT': REDIRECT,
'ECHO_REQUEST': ECHO_REQUEST,
'ROUTER_ADVERTISEMENT': ROUTER_ADVERTISEMENT,
'ROUTER_SOLICIT': ROUTER_SOLICIT,
'TIME_EXCEEDED': TIME_EXCEEDED,
'PARAMETER_PROBLEM': PARAMETER_PROBLEM,
'TIMESTAMP': TIMESTAMP,
'TIMESTAMP_REPLY': TIMESTAMP_REPLY,
'INFO_REQUEST': INFO_REQUEST,
'INFO_REPLY': INFO_REPLY,
'MASK_REQUEST': MASK_REQUEST,
'MASK_REPLY': MASK_REPLY,
'TRACEROUTE': TRACEROUTE,
}.items()
)
names = dict([(r, l) for (l, r) in codes.items()])
# https://www.iana.org/assignments/icmp-parameters
class ICMPCode(Resource):
NAME = 'icmp code'
# Destination Unreacheable (type 3)
NETWORK_UNREACHABLE = 0x0
HOST_UNREACHABLE = 0x1
PROTOCOL_UNREACHABLE = 0x2
PORT_UNREACHABLE = 0x3
FRAGMENTATION_NEEDED = 0x4
SOURCE_ROUTE_FAILED = 0x5
DESTINATION_NETWORK_UNKNOWN = 0x6
DESTINATION_HOST_UNKNOWN = 0x7
SOURCE_HOST_ISOLATED = 0x8
DESTINATION_NETWORK_PROHIBITED = 0x9
DESTINATION_HOST_PROHIBITED = 0xA
NETWORK_UNREACHABLE_FOR_TOS = 0xB
HOST_UNREACHABLE_FOR_TOS = 0xC
COMMUNICATION_PROHIBITED_BY_FILTERING = 0xD
HOST_PRECEDENCE_VIOLATION = 0xE
PRECEDENCE_CUTOFF_IN_EFFECT = 0xF
# Redirect (Type 5)
REDIRECT_FOR_NETWORK = 0x0
REDIRECT_FOR_HOST = 0x1
REDIRECT_FOR_TOS_AND_NET = 0x2
REDIRECT_FOR_TOS_AND_HOST = 0x3
# Time Exceeded (Type 11)
TTL_EQ_ZERO_DURING_TRANSIT = 0x0
TTL_EQ_ZERO_DURING_REASSEMBLY = 0x1
# parameter Problem (Type 12)
REQUIRED_OPTION_MISSING = 0x1
IP_HEADER_BAD = 0x2
codes = dict(
(k.lower().replace('_', '-'), v)
for (k, v) in {
'NETWORK_UNREACHABLE': NETWORK_UNREACHABLE,
'HOST_UNREACHABLE': HOST_UNREACHABLE,
'PROTOCOL_UNREACHABLE': PROTOCOL_UNREACHABLE,
'PORT_UNREACHABLE': PORT_UNREACHABLE,
'FRAGMENTATION_NEEDED': FRAGMENTATION_NEEDED,
'SOURCE_ROUTE_FAILED': SOURCE_ROUTE_FAILED,
'DESTINATION_NETWORK_UNKNOWN': DESTINATION_NETWORK_UNKNOWN,
'DESTINATION_HOST_UNKNOWN': DESTINATION_HOST_UNKNOWN,
'SOURCE_HOST_ISOLATED': SOURCE_HOST_ISOLATED,
'DESTINATION_NETWORK_PROHIBITED': DESTINATION_NETWORK_PROHIBITED,
'DESTINATION_HOST_PROHIBITED': DESTINATION_HOST_PROHIBITED,
'NETWORK_UNREACHABLE_FOR_TOS': NETWORK_UNREACHABLE_FOR_TOS,
'HOST_UNREACHABLE_FOR_TOS': HOST_UNREACHABLE_FOR_TOS,
'COMMUNICATION_PROHIBITED_BY_FILTERING': COMMUNICATION_PROHIBITED_BY_FILTERING,
'HOST_PRECEDENCE_VIOLATION': HOST_PRECEDENCE_VIOLATION,
'PRECEDENCE_CUTOFF_IN_EFFECT': PRECEDENCE_CUTOFF_IN_EFFECT,
'REDIRECT_FOR_NETWORK': REDIRECT_FOR_NETWORK,
'REDIRECT_FOR_HOST': REDIRECT_FOR_HOST,
'REDIRECT_FOR_TOS_AND_NET': REDIRECT_FOR_TOS_AND_NET,
'REDIRECT_FOR_TOS_AND_HOST': REDIRECT_FOR_TOS_AND_HOST,
'TTL_EQ_ZERO_DURING_TRANSIT': TTL_EQ_ZERO_DURING_TRANSIT,
'TTL_EQ_ZERO_DURING_REASSEMBLY': TTL_EQ_ZERO_DURING_REASSEMBLY,
'REQUIRED_OPTION_MISSING': REQUIRED_OPTION_MISSING,
'IP_HEADER_BAD': IP_HEADER_BAD,
}.items()
)
# names would have non-unique keys
def __str__(self):
return '%d' % int(self)