/*
 * Copyright (c) 2015 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/* Emacs editing mode -*-C-*-

From http://www.iana.org/assignments/protocol-numbers

PROTOCOL NUMBERS

(last updated 18 October 2004)

In the Internet Protocol version 4 (IPv4) [RFC791] there is a field,
called "Protocol", to identify the next level protocol.  This is an 8
bit field.  In Internet Protocol version 6 (IPv6) [RFC1883] this field
is called the "Next Header" field.
*/
ip_protocol (0, IP6_HOP_BY_HOP_OPTIONS)
ip_protocol (1, ICMP)
ip_protocol (2, IGMP)
ip_protocol (3, GGP)
ip_protocol (4, IP_IN_IP)
ip_protocol (5, ST)
ip_protocol (6, TCP)
ip_protocol (7, CBT)
ip_protocol (8, EGP)
ip_protocol (9, IGP)
ip_protocol (10, BBN_RCC_MON)
ip_protocol (11, NVP_II)
ip_protocol (12, PUP)
ip_protocol (13, ARGUS)
ip_protocol (14, EMCON)
ip_protocol (15, XNET)
ip_protocol (16, CHAOS)
ip_protocol (17, UDP)
ip_protocol (18, MUX)
ip_protocol (19, DCN_MEAS)
ip_protocol (20, HMP)
ip_protocol (21, PRM)
ip_protocol (22, XNS_IDP)
ip_protocol (23, TRUNK_1)
ip_protocol (24, TRUNK_2)
ip_protocol (25, LEAF_1)
ip_protocol (26, LEAF_2)
ip_protocol (27, RDP)
ip_protocol (28, IRTP)
ip_protocol (29, ISO_TP4)
ip_protocol (30, NETBLT)
ip_protocol (31, MFE_NSP)
ip_protocol (32, MERIT_INP)
ip_protocol (33, SEP)
ip_protocol (34, 3PC)
ip_protocol (35, IDPR)
ip_protocol (36, XTP)
ip_protocol (37, DDP)
ip_protocol (38, IDPR_CMTP)
ip_protocol (39, TP)
ip_protocol (40, IL)
ip_protocol (41, IPV6)
ip_protocol (42, SDRP)
ip_protocol (43, IPV6_ROUTE)
ip_protocol (44, IPV6_FRAGMENTATION)
ip_protocol (45, IDRP)
ip_protocol (46, RSVP)
ip_protocol (47, GRE)
ip_protocol (48, MHRP)
ip_protocol (49, BNA)
ip_protocol (50, IPSEC_ESP)
ip_protocol (51, IPSEC_AH)
ip_protocol (52, I_NLSP)
ip_protocol (53, SWIPE)
ip_protocol (54, NARP)
ip_protocol (55, MOBILE)
ip_protocol (56, TLSP)
ip_protocol (57, SKIP)
ip_protocol (58, ICMP6)
ip_protocol (59, IP6_NONXT)
ip_protocol (60, IP6_DESTINATION_OPTIONS)
ip_protocol (62, CFTP)
ip_protocol (64, SAT_EXPAK)
ip_protocol (65, KRYPTOLAN)
ip_protocol (66, RVD)
ip_protocol (67, IPPC)
ip_protocol (69, SAT_MON)
ip_protocol (70, VISA)
ip_protocol (71, IPCV)
ip_protocol (72, CPNX)
ip_protocol (73, CPHB)
ip_protocol (74, WSN)
ip_protocol (75, PVP)
ip_protocol (76, BR_SAT_MON)
ip_protocol (77, SUN_ND)
ip_protocol (78, WB_MON)
ip_protocol (79, WB_EXPAK)
ip_protocol (80, ISO_IP)
ip_protocol (81, VMTP)
ip_protocol (82, SECURE_VMTP)
ip_protocol (83, VINES)
ip_protocol (84, TTP)
ip_protocol (85, NSFNET_IGP)
ip_protocol (86, DGP)
ip_protocol (87, TCF)
ip_protocol (88, EIGRP)
ip_protocol (89, OSPF)
ip_protocol (90, SPRITE_RPC)
ip_protocol (91, LARP)
ip_protocol (92, MTP)
ip_protocol (93, AX)
ip_protocol (94, IPIP)
ip_protocol (95, MICP)
ip_protocol (96, SCC_SP)
ip_protocol (97, ETHERIP)
ip_protocol (98, ENCAP)
ip_protocol (100, GMTP)
ip_protocol (101, IFMP)
ip_protocol (102, PNNI)
ip_protocol (103, PIM)
ip_protocol (104, ARIS)
ip_protocol (105, SCPS)
ip_protocol (106, QNX)
ip_protocol (107, A)
ip_protocol (108, IPCOMP)
ip_protocol (109, SNP)
ip_protocol (110, COMPAQ_PEER)
ip_protocol (111, IPX_IN_IP)
ip_protocol (112, VRRP)
ip_protocol (113, PGM)
ip_protocol (115, L2TP)
ip_protocol (116, DDX)
ip_protocol (117, IATP)
ip_protocol (118, STP)
ip_protocol (119, SRP)
ip_protocol (120, UTI)
ip_protocol (121, SMP)
ip_protocol (122, SM)
ip_protocol (123, PTP)
ip_protocol (124, ISIS)
ip_protocol (125, FIRE)
ip_protocol (126, CRTP)
ip_protocol (127, CRUDP)
ip_protocol (128, SSCOPMCE)
ip_protocol (129, IPLT)
ip_protocol (130, SPS)
ip_protocol (131, PIPE)
ip_protocol (132, SCTP)
ip_protocol (133, FC)
ip_protocol (134, RSVP_E2E_IGNORE)
ip_protocol (135, MOBILITY)
ip_protocol (136, UDP_LITE)
ip_protocol (137, MPLS_IN_IP)
ip_protocol (138, MANET)
ip_protocol (139, HIP)
ip_protocol (140, SHIM6)
ip_protocol (141, WESP)
ip_protocol (142, ROHC)
ip_protocol (143, IP6_ETHERNET)

/* unassigned 144 - 252 */

ip_protocol (253, EXP1)
ip_protocol (254, EXP2)
ip_protocol (255, RESERVED)

