diff options
Diffstat (limited to '3rdparty/openpgm-svn-r1135/pgm/include/pgm/packet.h')
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/packet.h | 475 |
1 files changed, 475 insertions, 0 deletions
diff --git a/3rdparty/openpgm-svn-r1135/pgm/include/pgm/packet.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/packet.h new file mode 100644 index 0000000..fb1c13a --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/packet.h @@ -0,0 +1,475 @@ +/* vim:ts=8:sts=4:sw=4:noai:noexpandtab + * + * PGM packet formats, RFC 3208. + * + * Copyright (c) 2006 Miru Limited. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __PGM_PACKET_H__ +#define __PGM_PACKET_H__ + +#ifndef _WIN32 +# include <sys/socket.h> +# include <netinet/in.h> +# include <netinet/ip.h> +#endif +#include <pgm/types.h> + +PGM_BEGIN_DECLS + +/* protocol number assigned by IANA */ +#ifndef IPPROTO_PGM +# define IPPROTO_PGM 113 +#endif + +/* read from /etc/protocols if available */ +extern int pgm_ipproto_pgm; + + +/* address family indicator, rfc 1700 (ADDRESS FAMILY NUMBERS) */ +#ifndef AFI_IP +# define AFI_IP 1 /* IP (IP version 4) */ +# define AFI_IP6 2 /* IP6 (IP version 6) */ +#endif + +/* UDP ports for UDP encapsulation, as per IBM WebSphere MQ */ +#define DEFAULT_UDP_ENCAP_UCAST_PORT 3055 +#define DEFAULT_UDP_ENCAP_MCAST_PORT 3056 + +/* PGM default ports */ +#define DEFAULT_DATA_DESTINATION_PORT 7500 +#define DEFAULT_DATA_SOURCE_PORT 0 /* random */ + +/* DoS limitation to protocol (MS08-036, KB950762) */ +#ifndef PGM_MAX_APDU +# define PGM_MAX_APDU UINT16_MAX +#endif + +/* Cisco default: 24 (max 8200), Juniper & H3C default: 16, SmartPGM: 64 */ +#ifndef PGM_MAX_FRAGMENTS +# define PGM_MAX_FRAGMENTS 16 +#endif + + +enum pgm_type_e { + PGM_SPM = 0x00, /* 8.1: source path message */ + PGM_POLL = 0x01, /* 14.7.1: poll request */ + PGM_POLR = 0x02, /* 14.7.2: poll response */ + PGM_ODATA = 0x04, /* 8.2: original data */ + PGM_RDATA = 0x05, /* 8.2: repair data */ + PGM_NAK = 0x08, /* 8.3: NAK or negative acknowledgement */ + PGM_NNAK = 0x09, /* 8.3: N-NAK or null negative acknowledgement */ + PGM_NCF = 0x0a, /* 8.3: NCF or NAK confirmation */ + PGM_SPMR = 0x0c, /* 13.6: SPM request */ + PGM_ACK = 0x0d, /* PGMCC: congestion control ACK */ + PGM_MAX = 0xff +}; + +#define PGM_OPT_LENGTH 0x00 /* options length */ +#define PGM_OPT_FRAGMENT 0x01 /* fragmentation */ +#define PGM_OPT_NAK_LIST 0x02 /* list of nak entries */ +#define PGM_OPT_JOIN 0x03 /* late joining */ +#define PGM_OPT_REDIRECT 0x07 /* redirect */ +#define PGM_OPT_SYN 0x0d /* synchronisation */ +#define PGM_OPT_FIN 0x0e /* session end */ +#define PGM_OPT_RST 0x0f /* session reset */ + +#define PGM_OPT_PARITY_PRM 0x08 /* forward error correction parameters */ +#define PGM_OPT_PARITY_GRP 0x09 /* group number */ +#define PGM_OPT_CURR_TGSIZE 0x0a /* group size */ + +#define PGM_OPT_CR 0x10 /* congestion report */ +#define PGM_OPT_CRQST 0x11 /* congestion report request */ + +#define PGM_OPT_PGMCC_DATA 0x12 +#define PGM_OPT_PGMCC_FEEDBACK 0x13 + +#define PGM_OPT_NAK_BO_IVL 0x04 /* nak back-off interval */ +#define PGM_OPT_NAK_BO_RNG 0x05 /* nak back-off range */ +#define PGM_OPT_NBR_UNREACH 0x0b /* neighbour unreachable */ +#define PGM_OPT_PATH_NLA 0x0c /* path nla */ + +#define PGM_OPT_INVALID 0x7f /* option invalidated */ + +/* byte alignment for packet memory maps */ +#if defined( __GNUC__ ) && !defined( sun ) +# pragma pack(push) +#endif +#pragma pack(1) + +/* 8. PGM header */ +struct pgm_header { + uint16_t pgm_sport; /* source port: tsi::sport or UDP port depending on direction */ + uint16_t pgm_dport; /* destination port */ + uint8_t pgm_type; /* version / packet type */ + uint8_t pgm_options; /* options */ +#define PGM_OPT_PARITY 0x80 /* parity packet */ +#define PGM_OPT_VAR_PKTLEN 0x40 /* + variable sized packets */ +#define PGM_OPT_NETWORK 0x02 /* network-significant: must be interpreted by network elements */ +#define PGM_OPT_PRESENT 0x01 /* option extension are present */ + uint16_t pgm_checksum; /* checksum */ + uint8_t pgm_gsi[6]; /* global source id */ + uint16_t pgm_tsdu_length; /* tsdu length */ + /* tpdu length = th length (header + options) + tsdu length */ +}; + +/* 8.1. Source Path Messages (SPM) */ +struct pgm_spm { + uint32_t spm_sqn; /* spm sequence number */ + uint32_t spm_trail; /* trailing edge sequence number */ + uint32_t spm_lead; /* leading edge sequence number */ + uint16_t spm_nla_afi; /* nla afi */ + uint16_t spm_reserved; /* reserved */ + struct in_addr spm_nla; /* path nla */ + /* ... option extensions */ +}; + +struct pgm_spm6 { + uint32_t spm6_sqn; /* spm sequence number */ + uint32_t spm6_trail; /* trailing edge sequence number */ + uint32_t spm6_lead; /* leading edge sequence number */ + uint16_t spm6_nla_afi; /* nla afi */ + uint16_t spm6_reserved; /* reserved */ + struct in6_addr spm6_nla; /* path nla */ + /* ... option extensions */ +}; + +/* 8.2. Data Packet */ +struct pgm_data { + uint32_t data_sqn; /* data packet sequence number */ + uint32_t data_trail; /* trailing edge sequence number */ + /* ... option extensions */ + /* ... data */ +}; + +/* 8.3. Negative Acknowledgments and Confirmations (NAK, N-NAK, & NCF) */ +struct pgm_nak { + uint32_t nak_sqn; /* requested sequence number */ + uint16_t nak_src_nla_afi; /* nla afi */ + uint16_t nak_reserved; /* reserved */ + struct in_addr nak_src_nla; /* source nla */ + uint16_t nak_grp_nla_afi; /* nla afi */ + uint16_t nak_reserved2; /* reserved */ + struct in_addr nak_grp_nla; /* multicast group nla */ + /* ... option extension */ +}; + +struct pgm_nak6 { + uint32_t nak6_sqn; /* requested sequence number */ + uint16_t nak6_src_nla_afi; /* nla afi */ + uint16_t nak6_reserved; /* reserved */ + struct in6_addr nak6_src_nla; /* source nla */ + uint16_t nak6_grp_nla_afi; /* nla afi */ + uint16_t nak6_reserved2; /* reserved */ + struct in6_addr nak6_grp_nla; /* multicast group nla */ + /* ... option extension */ +}; + +/* 9. Option header (max 16 per packet) */ +struct pgm_opt_header { + uint8_t opt_type; /* option type */ +#define PGM_OPT_MASK 0x7f +#define PGM_OPT_END 0x80 /* end of options flag */ + uint8_t opt_length; /* option length */ + uint8_t opt_reserved; +#define PGM_OP_ENCODED 0x8 /* F-bit */ +#define PGM_OPX_MASK 0x3 +#define PGM_OPX_IGNORE 0x0 /* extensibility bits */ +#define PGM_OPX_INVALIDATE 0x1 +#define PGM_OPX_DISCARD 0x2 +#define PGM_OP_ENCODED_NULL 0x80 /* U-bit */ +}; + +/* 9.1. Option extension length - OPT_LENGTH */ +struct pgm_opt_length { + uint8_t opt_type; /* include header as total length overwrites reserved/OPX bits */ + uint8_t opt_length; + uint16_t opt_total_length; /* total length of all options */ +}; + +/* 9.2. Option fragment - OPT_FRAGMENT */ +struct pgm_opt_fragment { + uint8_t opt_reserved; /* reserved */ + uint32_t opt_sqn; /* first sequence number */ + uint32_t opt_frag_off; /* offset */ + uint32_t opt_frag_len; /* length */ +}; + +/* 9.3.5. Option NAK List - OPT_NAK_LIST + * + * GNU C allows opt_sqn[0], ISO C89 requireqs opt_sqn[1], ISO C99 permits opt_sqn[] + */ +struct pgm_opt_nak_list { + uint8_t opt_reserved; /* reserved */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +/* C99 flexible array, sizeof() invalid */ + uint32_t opt_sqn[]; /* requested sequence number [62] */ +#elif !defined(__STDC_VERSION__) || defined(__cplusplus) +/* C90 and older */ + uint32_t opt_sqn[1]; +#else +/* GNU C variable-length object */ + uint32_t opt_sqn[0]; +#endif +}; + +/* 9.4.2. Option Join - OPT_JOIN */ +struct pgm_opt_join { + uint8_t opt_reserved; /* reserved */ + uint32_t opt_join_min; /* minimum sequence number */ +}; + +/* 9.5.5. Option Redirect - OPT_REDIRECT */ +struct pgm_opt_redirect { + uint8_t opt_reserved; /* reserved */ + uint16_t opt_nla_afi; /* nla afi */ + uint16_t opt_reserved2; /* reserved */ + struct in_addr opt_nla; /* dlr nla */ +}; + +struct pgm_opt6_redirect { + uint8_t opt6_reserved; /* reserved */ + uint16_t opt6_nla_afi; /* nla afi */ + uint16_t opt6_reserved2; /* reserved */ + struct in6_addr opt6_nla; /* dlr nla */ +}; + +/* 9.6.2. Option Sources - OPT_SYN */ +struct pgm_opt_syn { + uint8_t opt_reserved; /* reserved */ +}; + +/* 9.7.4. Option End Session - OPT_FIN */ +struct pgm_opt_fin { + uint8_t opt_reserved; /* reserved */ +}; + +/* 9.8.4. Option Reset - OPT_RST */ +struct pgm_opt_rst { + uint8_t opt_reserved; /* reserved */ +}; + + +/* + * Forward Error Correction - FEC + */ + +/* 11.8.1. Option Parity - OPT_PARITY_PRM */ +struct pgm_opt_parity_prm { + uint8_t opt_reserved; /* reserved */ +#define PGM_PARITY_PRM_MASK 0x3 +#define PGM_PARITY_PRM_PRO 0x1 /* source provides pro-active parity packets */ +#define PGM_PARITY_PRM_OND 0x2 /* on-demand parity packets */ + uint32_t parity_prm_tgs; /* transmission group size */ +}; + +/* 11.8.2. Option Parity Group - OPT_PARITY_GRP */ +struct pgm_opt_parity_grp { + uint8_t opt_reserved; /* reserved */ + uint32_t prm_group; /* parity group number */ +}; + +/* 11.8.3. Option Current Transmission Group Size - OPT_CURR_TGSIZE */ +struct pgm_opt_curr_tgsize { + uint8_t opt_reserved; /* reserved */ + uint32_t prm_atgsize; /* actual transmission group size */ +}; + +/* + * Congestion Control + */ + +/* 12.7.1. Option Congestion Report - OPT_CR */ +struct pgm_opt_cr { + uint8_t opt_reserved; /* reserved */ +#define PGM_OPT_CR_NEL 0x0 /* OPT_CR_NE_WL report */ +#define PGM_OPT_CR_NEP 0x1 /* OPT_CR_NE_WP report */ +#define PGM_OPT_CR_RXP 0x2 /* OPT_CR_RX_WP report */ + uint32_t opt_cr_lead; /* congestion report reference sqn */ + uint16_t opt_cr_ne_wl; /* ne worst link */ + uint16_t opt_cr_ne_wp; /* ne worst path */ + uint16_t opt_cr_rx_wp; /* rcvr worst path */ + uint16_t opt_reserved2; /* reserved */ + uint16_t opt_nla_afi; /* nla afi */ + uint16_t opt_reserved3; /* reserved */ + uint32_t opt_cr_rcvr; /* worst receivers nla */ +}; + +/* 12.7.2. Option Congestion Report Request - OPT_CRQST */ +struct pgm_opt_crqst { + uint8_t opt_reserved; /* reserved */ +#define PGM_OPT_CRQST_NEL 0x0 /* request OPT_CR_NE_WL report */ +#define PGM_OPT_CRQST_NEP 0x1 /* request OPT_CR_NE_WP report */ +#define PGM_OPT_CRQST_RXP 0x2 /* request OPT_CR_RX_WP report */ +}; + +/* PGMCC. ACK Packet */ +struct pgm_ack { + uint32_t ack_rx_max; /* RX_MAX */ + uint32_t ack_bitmap; /* received packets */ + /* ... option extensions */ +}; + +/* PGMCC Options */ +struct pgm_opt_pgmcc_data { + uint8_t opt_reserved; /* reserved */ + uint32_t opt_tstamp; /* timestamp */ + uint16_t opt_nla_afi; /* nla afi */ + uint16_t opt_reserved2; /* reserved */ + struct in_addr opt_nla; /* ACKER nla */ +}; + +struct pgm_opt6_pgmcc_data { + uint8_t opt6_reserved; /* reserved */ + uint32_t opt6_tstamp; /* timestamp */ + uint16_t opt6_nla_afi; /* nla afi */ + uint16_t opt6_reserved2; /* reserved */ + struct in6_addr opt6_nla; /* ACKER nla */ +}; + +struct pgm_opt_pgmcc_feedback { + uint8_t opt_reserved; /* reserved */ + uint32_t opt_tstamp; /* timestamp */ + uint16_t opt_nla_afi; /* nla afi */ + uint16_t opt_loss_rate; /* loss rate */ + struct in_addr opt_nla; /* ACKER nla */ +}; + +struct pgm_opt6_pgmcc_feedback { + uint8_t opt6_reserved; /* reserved */ + uint32_t opt6_tstamp; /* timestamp */ + uint16_t opt6_nla_afi; /* nla afi */ + uint16_t opt6_loss_rate; /* loss rate */ + struct in6_addr opt6_nla; /* ACKER nla */ +}; + + +/* + * SPM Requests + */ + +/* 13.6. SPM Requests */ +#if 0 +struct pgm_spmr { + /* ... option extensions */ +}; +#endif + + +/* + * Poll Mechanism + */ + +/* 14.7.1. Poll Request */ +struct pgm_poll { + uint32_t poll_sqn; /* poll sequence number */ + uint16_t poll_round; /* poll round */ + uint16_t poll_s_type; /* poll sub-type */ +#define PGM_POLL_GENERAL 0x0 /* general poll */ +#define PGM_POLL_DLR 0x1 /* DLR poll */ + uint16_t poll_nla_afi; /* nla afi */ + uint16_t poll_reserved; /* reserved */ + struct in_addr poll_nla; /* path nla */ + uint32_t poll_bo_ivl; /* poll back-off interval */ + char poll_rand[4]; /* random string */ + uint32_t poll_mask; /* matching bit-mask */ + /* ... option extensions */ +}; + +struct pgm_poll6 { + uint32_t poll6_sqn; /* poll sequence number */ + uint16_t poll6_round; /* poll round */ + uint16_t poll6_s_type; /* poll sub-type */ + uint16_t poll6_nla_afi; /* nla afi */ + uint16_t poll6_reserved; /* reserved */ + struct in6_addr poll6_nla; /* path nla */ + uint32_t poll6_bo_ivl; /* poll back-off interval */ + char poll6_rand[4]; /* random string */ + uint32_t poll6_mask; /* matching bit-mask */ + /* ... option extensions */ +}; + +/* 14.7.2. Poll Response */ +struct pgm_polr { + uint32_t polr_sqn; /* polr sequence number */ + uint16_t polr_round; /* polr round */ + uint16_t polr_reserved; /* reserved */ + /* ... option extensions */ +}; + + +/* + * Implosion Prevention + */ + +/* 15.4.1. Option NAK Back-Off Interval - OPT_NAK_BO_IVL */ +struct pgm_opt_nak_bo_ivl { + uint8_t opt_reserved; /* reserved */ + uint32_t opt_nak_bo_ivl; /* nak back-off interval */ + uint32_t opt_nak_bo_ivl_sqn; /* nak back-off interval sqn */ +}; + +/* 15.4.2. Option NAK Back-Off Range - OPT_NAK_BO_RNG */ +struct pgm_opt_nak_bo_rng { + uint8_t opt_reserved; /* reserved */ + uint32_t opt_nak_max_bo_ivl; /* maximum nak back-off interval */ + uint32_t opt_nak_min_bo_ivl; /* minimum nak back-off interval */ +}; + +/* 15.4.3. Option Neighbour Unreachable - OPT_NBR_UNREACH */ +struct pgm_opt_nbr_unreach { + uint8_t opt_reserved; /* reserved */ +}; + +/* 15.4.4. Option Path - OPT_PATH_NLA */ +struct pgm_opt_path_nla { + uint8_t opt_reserved; /* reserved */ + struct in_addr opt_path_nla; /* path nla */ +}; + +struct pgm_opt6_path_nla { + uint8_t opt6_reserved; /* reserved */ + struct in6_addr opt6_path_nla; /* path nla */ +}; + + +#if defined( __GNUC__ ) && !defined( sun ) +# pragma pack(pop) +#else +# pragma pack() +#endif + +#define PGM_IS_UPSTREAM(t) \ + ((t) == PGM_NAK /* unicast */ \ + || (t) == PGM_NNAK /* unicast */ \ + || (t) == PGM_SPMR /* multicast + unicast */ \ + || (t) == PGM_POLR /* unicast */ \ + || (t) == PGM_ACK) /* unicast */ + +#define PGM_IS_PEER(t) \ + ((t) == PGM_SPMR) /* multicast */ + +#define PGM_IS_DOWNSTREAM(t) \ + ((t) == PGM_SPM /* all types are multicast */ \ + || (t) == PGM_ODATA \ + || (t) == PGM_RDATA \ + || (t) == PGM_POLL \ + || (t) == PGM_NCF) + +PGM_END_DECLS + +#endif /* __PGM_PACKET_H__ */ |