dissertation/usr.sbin/eigrpd/eigrp.h
renato e14e95d763 Simplify handling of multicast addresses.
During the initialization of the eigrpe process, use inet_pton() to
store the EIGRP multicast addresses in two global variables:
* global.mcast_addr_v4 (in_addr);
* global.mcast_addr_v6 (in6_addr).

This way we don't need to create temporary in_addr/in6_addr variables
everytime we need to use these multicast addresses for something.

"I like this" claudio@ ok benno@
2016-09-02 16:34:20 +00:00

226 lines
5.7 KiB
C

/* $OpenBSD: eigrp.h,v 1.6 2016/09/02 16:34:20 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* EIGRP protocol definitions */
#ifndef _EIGRP_H_
#define _EIGRP_H_
/* misc */
#define EIGRP_VERSION 2
#define IPPROTO_EIGRP 88
#define EIGRP_IP_TTL 2
/* EIGRP multicast group addresses */
#define AllEIGRPRouters_v4 "224.0.0.10"
#define AllEIGRPRouters_v6 "ff02::a"
#define EIGRP_INFINITE_METRIC ((uint32_t )(~0))
#define RTP_RTRNS_INTERVAL 5
#define RTP_RTRNS_MAX_ATTEMPTS 16
#define RTP_ACK_TIMEOUT 100000
#define EIGRP_VERSION_MAJOR 1
#define EIGRP_VERSION_MINOR 2
#define EIGRP_MIN_AS 1
#define EIGRP_MAX_AS 65535
#define DEFAULT_HELLO_INTERVAL 5
#define MIN_HELLO_INTERVAL 1
#define MAX_HELLO_INTERVAL 65535
#define DEFAULT_HELLO_HOLDTIME 15
#define MIN_HELLO_HOLDTIME 1
#define MAX_HELLO_HOLDTIME 65535
#define EIGRP_SCALING_FACTOR 256
#define DEFAULT_DELAY 10
#define MIN_DELAY 1
#define MAX_DELAY 16777215
#define DEFAULT_BANDWIDTH 100000
#define MIN_BANDWIDTH 1
#define MAX_BANDWIDTH 10000000
#define DEFAULT_RELIABILITY 255
#define MIN_RELIABILITY 1
#define MAX_RELIABILITY 255
#define DEFAULT_LOAD 1
#define MIN_LOAD 1
#define MAX_LOAD 255
#define MIN_MTU 1
#define MAX_MTU 65535
#define MIN_KVALUE 0
#define MAX_KVALUE 254
#define DEFAULT_ACTIVE_TIMEOUT 3
#define MIN_ACTIVE_TIMEOUT 0
#define MAX_ACTIVE_TIMEOUT 65535
#define DEFAULT_MAXIMUM_HOPS 100
#define MIN_MAXIMUM_HOPS 1
#define MAX_MAXIMUM_HOPS 255
#define DEFAULT_MAXIMUM_PATHS 4
#define MIN_MAXIMUM_PATHS 1
#define MAX_MAXIMUM_PATHS 32
#define DEFAULT_VARIANCE 1
#define MIN_VARIANCE 1
#define MAX_VARIANCE 128
#define EIGRP_HEADER_VERSION 2
#define EIGRP_VRID_UNICAST_AF 0x0000
#define EIGRP_VRID_MULTICAST_AF 0x0001
#define EIGRP_VRID_UNICAST_SF 0x8000
/* EIGRP packet types */
#define EIGRP_OPC_UPDATE 1
#define EIGRP_OPC_REQUEST 2
#define EIGRP_OPC_QUERY 3
#define EIGRP_OPC_REPLY 4
#define EIGRP_OPC_HELLO 5
#define EIGRP_OPC_PROBE 7
#define EIGRP_OPC_SIAQUERY 10
#define EIGRP_OPC_SIAREPLY 11
struct eigrp_hdr {
uint8_t version;
uint8_t opcode;
uint16_t chksum;
uint32_t flags;
uint32_t seq_num;
uint32_t ack_num;
uint16_t vrid;
uint16_t as;
};
/* EIGRP header flags */
#define EIGRP_HDR_FLAG_INIT 0x01
#define EIGRP_HDR_FLAG_CR 0x02
#define EIGRP_HDR_FLAG_RS 0x04
#define EIGRP_HDR_FLAG_EOT 0x08
/* TLV record */
struct tlv {
uint16_t type;
uint16_t length;
};
#define TLV_HDR_LEN 4
struct tlv_parameter {
uint16_t type;
uint16_t length;
uint8_t kvalues[6];
uint16_t holdtime;
};
struct tlv_sw_version {
uint16_t type;
uint16_t length;
uint8_t vendor_os_major;
uint8_t vendor_os_minor;
uint8_t eigrp_major;
uint8_t eigrp_minor;
};
struct tlv_mcast_seq {
uint16_t type;
uint16_t length;
uint32_t seq;
};
struct classic_metric {
uint32_t delay;
uint32_t bandwidth;
uint8_t mtu[3]; /* 3 bytes, yeah... */
uint8_t hop_count;
uint8_t reliability;
uint8_t load;
uint8_t tag;
uint8_t flags;
};
#define F_METRIC_SRC_WITHDRAW 0x01
#define F_METRIC_C_DEFAULT 0x02
#define F_METRIC_ACTIVE 0x04
struct classic_emetric {
uint32_t routerid;
uint32_t as;
uint32_t tag;
uint32_t metric;
uint16_t reserved;
uint8_t protocol;
uint8_t flags;
};
#define EIGRP_EXT_PROTO_IGRP 1
#define EIGRP_EXT_PROTO_EIGRP 2
#define EIGRP_EXT_PROTO_STATIC 3
#define EIGRP_EXT_PROTO_RIP 4
#define EIGRP_EXT_PROTO_HELLO 5
#define EIGRP_EXT_PROTO_OSPF 6
#define EIGRP_EXT_PROTO_ISIS 7
#define EIGRP_EXT_PROTO_EGP 8
#define EIGRP_EXT_PROTO_BGP 9
#define EIGRP_EXT_PROTO_IDRP 10
#define EIGRP_EXT_PROTO_CONN 11
/* EIGRP TLV types (v1.2) */
#define TLV_PROTO_GENERAL 0x0000
#define TLV_PROTO_IPV4 0x0100
#define TLV_PROTO_IPV6 0x0400
#define TLV_PROTO_MASK 0xff00
#define TLV_ROUTE_REQUEST 0x0001
#define TLV_ROUTE_INTERNAL 0x0002
#define TLV_ROUTE_EXTERNAL 0x0003
#define TLV_ROUTE_COMMUNITY 0x0004
#define TLV_TYPE_PARAMETER (TLV_PROTO_GENERAL | 0x0001)
#define TLV_TYPE_AUTH (TLV_PROTO_GENERAL | 0x0002)
#define TLV_TYPE_SEQ (TLV_PROTO_GENERAL | 0x0003)
#define TLV_TYPE_SW_VERSION (TLV_PROTO_GENERAL | 0x0004)
#define TLV_TYPE_MCAST_SEQ (TLV_PROTO_GENERAL | 0x0005)
#define TLV_TYPE_PEER_TERM (TLV_PROTO_GENERAL | 0x0007)
#define TLV_TYPE_IPV4_REQUEST (TLV_PROTO_IPV4 | TLV_ROUTE_REQUEST)
#define TLV_TYPE_IPV4_INTERNAL (TLV_PROTO_IPV4 | TLV_ROUTE_INTERNAL)
#define TLV_TYPE_IPV4_EXTERNAL (TLV_PROTO_IPV4 | TLV_ROUTE_EXTERNAL)
#define TLV_TYPE_IPV4_COMMUNITY (TLV_PROTO_IPV4 | TLV_ROUTE_COMMUNITY)
#define TLV_TYPE_IPV6_REQUEST (TLV_PROTO_IPV6 | TLV_ROUTE_REQUEST)
#define TLV_TYPE_IPV6_INTERNAL (TLV_PROTO_IPV6 | TLV_ROUTE_INTERNAL)
#define TLV_TYPE_IPV6_EXTERNAL (TLV_PROTO_IPV6 | TLV_ROUTE_EXTERNAL)
#define TLV_TYPE_IPV6_COMMUNITY (TLV_PROTO_IPV6 | TLV_ROUTE_COMMUNITY)
#define TLV_TYPE_MASK 0x00ff
/* TLV lengths */
#define TLV_TYPE_PARAMETER_LEN 0x000C
#define TLV_TYPE_SW_VERSION_LEN 0x0008
#define TLV_TYPE_MCAST_SEQ_LEN 0x0008
#define TLV_TYPE_IPV4_INT_MIN_LEN 0x0019
#define TLV_TYPE_IPV6_INT_MIN_LEN 0x0025
#endif /* _EIGRP_H_ */