153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* @(#) $Header: /tcpdump/master/tcpdump/dccp.h,v 1.5 2006-11-02 09:05:23 hannes Exp $ (LBL) */
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) Arnaldo Carvalho de Melo 2004
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) Ian McDonald 2005 <iam4@cs.waikato.ac.nz>
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) Yoshifumi Nishida 2005
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This software may be distributed either under the terms of the
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * BSD-style license that accompanies tcpdump or the GNU GPL version 2
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef __DCCP_HDR__
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define __DCCP_HDR__
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/**
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * struct dccp_hdr - generic part of DCCP packet header
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_sport - Relevant port on the endpoint that sent this packet
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_dport - Relevant port on the other endpoint
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_doff - Data Offset from the start of the DCCP header, in 32-bit words
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_ccval - Used by the HC-Sender CCID
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_cscov - Parts of the packet that are covered by the Checksum field
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_checksum - Internet checksum, depends on dccph_cscov
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_x - 0 = 24 bit sequence number, 1 = 48
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_type - packet type, see DCCP_PKT_ prefixed macros
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_seq - sequence number high or low order 24 bits, depends on dccph_x
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct dccp_hdr {
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t	dccph_sport,
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			dccph_dport;
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t	dccph_doff;
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t	dccph_ccval_cscov;
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t	dccph_checksum;
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	union {
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t	dccph_xtr;
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	dccph_seq;
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}		dccph_xtrs;
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define DCCPH_CCVAL(dh)	(((dh)->dccph_ccval_cscov >> 4) & 0xF)
4053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define DCCPH_CSCOV(dh)	(((dh)->dccph_ccval_cscov) & 0xF)
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DCCPH_X(dh)	((dh)->dccph_xtrs.dccph_xtr & 1)
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DCCPH_TYPE(dh)	(((dh)->dccph_xtrs.dccph_xtr >> 1) & 0xF)
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DCCPH_SEQ(dh)   (((dh)->dccph_xtrs.dccph_seq) >> 8)
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/**
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * struct dccp_hdr_ext - the low bits of a 48 bit seq packet
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_seq_low - low 24 bits of a 48 bit seq packet
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct dccp_hdr_ext {
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	dccph_seq_low;
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/**
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * struct dccp_hdr_request - Conection initiation request header
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_req_service - Service to which the client app wants to connect
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct dccp_hdr_request {
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	dccph_req_service;
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/**
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * struct dccp_hdr_ack_bits - acknowledgment bits common to most packets
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_resp_ack_nr_high - 48 bit ack number high order bits, contains GSR
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct dccp_hdr_ack_bits {
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	dccph_ra;
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	dccph_ack_nr_low;
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DCCPH_ACK(dh_ack)   ((dh_ack)->dccph_ra >> 8)
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/**
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * struct dccp_hdr_response - Conection initiation response header
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_resp_ack_nr_high - 48 bit ack number high order bits, contains GSR
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_resp_service - Echoes the Service Code on a received DCCP-Request
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct dccp_hdr_response {
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct dccp_hdr_ack_bits	dccph_resp_ack;
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t			dccph_resp_service;
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline struct dccp_hdr_data *dccp_hdr_data(struct dccp_hdr *hdrg)
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const int ext = DCCPH_X(hdrg) ? sizeof(struct dccp_hdr_ext) : 0;
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (struct dccp_hdr_data *)(((u_char *)hdrg) + sizeof(hdrg) + ext);
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/**
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * struct dccp_hdr_reset - Unconditionally shut down a connection
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @dccph_reset_service - Echoes the Service Code on a received DCCP-Request
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct dccp_hdr_reset {
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct dccp_hdr_ack_bits	dccph_reset_ack;
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t			dccph_reset_code,
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					dccph_reset_data[3];
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectenum dccp_pkt_type {
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_PKT_REQUEST = 0,
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_PKT_RESPONSE,
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_PKT_DATA,
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_PKT_ACK,
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_PKT_DATAACK,
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_PKT_CLOSEREQ,
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_PKT_CLOSE,
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_PKT_RESET,
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_PKT_SYNC,
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_PKT_SYNCACK,
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_PKT_INVALID
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectenum dccp_reset_codes {
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_RESET_CODE_UNSPECIFIED = 0,
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_RESET_CODE_CLOSED,
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_RESET_CODE_ABORTED,
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_RESET_CODE_NO_CONNECTION,
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_RESET_CODE_PACKET_ERROR,
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_RESET_CODE_OPTION_ERROR,
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_RESET_CODE_MANDATORY_ERROR,
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_RESET_CODE_CONNECTION_REFUSED,
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_RESET_CODE_BAD_SERVICE_CODE,
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_RESET_CODE_TOO_BUSY,
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_RESET_CODE_BAD_INIT_COOKIE,
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	DCCP_RESET_CODE_AGGRESSION_PENALTY,
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	__DCCP_RESET_CODE_LAST
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* __DCCP_HDR__ */
140