331 lines
10 KiB
C
331 lines
10 KiB
C
/* $KAME: dccp_var.h,v 1.29 2005/11/03 14:59:28 nishida Exp $ */
|
|
/* $NetBSD: dccp_var.h,v 1.2 2015/05/02 17:18:03 rtr Exp $ */
|
|
|
|
/*
|
|
* Copyright (c) 2003 Joacim Häggmark, Magnus Erixzon, Nils-Erik Mattsson
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. The name of the author may not be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
* Id: dccp_var.h,v 1.25 2003/07/31 11:17:15 joahag-9 Exp
|
|
*/
|
|
|
|
#ifndef _NETINET_DCCP_VAR_H_
|
|
#define _NETINET_DCCP_VAR_H_
|
|
|
|
typedef u_int64_t dccp_seq;
|
|
|
|
#define DSEQ_TO_DHDR(x, y) { \
|
|
(x)->dh_seq = htons(y >> 32);\
|
|
(x)->dh_seq2 = htonl(y & 4294967295U);\
|
|
}
|
|
|
|
#define DHDR_TO_DSEQ(x, y) { \
|
|
x = ((u_int64_t)ntohs(y->dh_seq) << 32) | ntohl(y->dh_seq2);\
|
|
}
|
|
|
|
#define DSEQ_TO_DAHDR(x, y) { \
|
|
(x).dah_ack = htons(y >> 32);\
|
|
(x).dah_ack2 = htonl(y & 4294967295U);\
|
|
}
|
|
|
|
#define DAHDR_TO_DSEQ(x, y) { \
|
|
x = ((u_int64_t)ntohs(y.dah_ack) << 32) | ntohl(y.dah_ack2);\
|
|
}
|
|
|
|
#define CONVERT_TO_LONGSEQ(S, ref) \
|
|
((((~(S- ref.lo) +1) <= 0x7fffff) && (S < ref.lo))? \
|
|
(((u_int64_t)(ref.hi + 1) << 24) | S) % 281474976710656ll: \
|
|
(((u_int64_t)ref.hi << 24) | S) % 281474976710656ll)
|
|
|
|
struct ref_seq {
|
|
u_int32_t hi;
|
|
u_int32_t lo;
|
|
};
|
|
|
|
struct dccpcb {
|
|
u_int8_t state; /* initial, listening, connecting, established,
|
|
closing, closed etc */
|
|
u_int8_t who; /* undef, server, client, listener */
|
|
|
|
struct callout connect_timer; /* Connection timer */
|
|
struct callout retrans_timer; /* Retransmit timer */
|
|
struct callout close_timer; /* Closing timer */
|
|
struct callout timewait_timer; /* Time wait timer */
|
|
|
|
u_int32_t retrans;
|
|
|
|
dccp_seq seq_snd;
|
|
dccp_seq ack_snd; /* ack num to send in Ack or DataAck packet */
|
|
dccp_seq gsn_rcv; /* Greatest received sequence number */
|
|
|
|
/* values representing last incoming packet. are set in dccp_input */
|
|
dccp_seq seq_rcv; /* Seq num of received packet */
|
|
dccp_seq ack_rcv; /* Ack num received in Ack or DataAck packet */
|
|
u_int8_t type_rcv; /* Type of packet received */
|
|
u_int32_t len_rcv; /* Length of data received */
|
|
u_int8_t ndp_rcv; /* ndp value of received packet */
|
|
|
|
u_int8_t cslen; /* How much of outgoing packets are covered by the checksum */
|
|
u_int8_t pref_cc; /* Client prefered CC */
|
|
u_int8_t ndp; /* Number of non data packets */
|
|
u_int32_t loss_window; /* Loss window (defaults to 1000) */
|
|
u_int16_t ack_ratio; /* Ack Ratio Feature */
|
|
int8_t cc_in_use[2]; /* Current CC in use
|
|
(in each direction) */
|
|
void *cc_state[2];
|
|
struct inpcb *d_inpcb; /* Pointer back to Internet PCB */
|
|
struct in6pcb *d_in6pcb;
|
|
u_int32_t d_maxseg; /* Maximum segment size */
|
|
char options[DCCP_MAX_OPTIONS];
|
|
u_int8_t optlen;
|
|
char features[DCCP_MAX_OPTIONS];
|
|
u_int8_t featlen;
|
|
u_int8_t ccval; /* ccval */
|
|
|
|
u_int32_t avgpsize; /* Average packet size */
|
|
|
|
/* variables for the local (receiver-side) ack vector */
|
|
u_char *ackvector; /* For acks, 2 bits per packet */
|
|
u_char *av_hp; /* head ptr for ackvector */
|
|
u_int16_t av_size;
|
|
dccp_seq av_hs, av_ts; /* highest/lowest seq no in ackvector */
|
|
|
|
u_int8_t remote_ackvector; /* Is recv side using AckVector? */
|
|
u_char shortseq; /* use short seq number */
|
|
u_int32_t scode; /* service core */
|
|
struct ref_seq ref_seq; /* reference sequence number */
|
|
struct ref_seq ref_pseq; /* reference peer sequence number */
|
|
|
|
#ifndef __FreeBSD__
|
|
#ifndef INP_IPV6
|
|
#define INP_IPV6 0x1
|
|
#endif
|
|
#ifndef INP_IPV4
|
|
#define INP_IPV4 0x2
|
|
#endif
|
|
u_int8_t inp_vflag;
|
|
u_int8_t inp_ip_ttl;
|
|
u_int8_t inp_ip_tos;
|
|
#endif
|
|
u_int8_t pktlen[DCCP_MAX_PKTS];
|
|
u_int16_t pktlenidx;
|
|
u_int16_t pktcnt;
|
|
};
|
|
|
|
#ifdef _KERNEL
|
|
struct inp_dp {
|
|
struct inpcb inp;
|
|
struct dccpcb dp;
|
|
};
|
|
#endif
|
|
|
|
#if defined(_NETINET_IN_PCB_H_) && defined(_SYS_SOCKETVAR_H_)
|
|
struct xdccpcb {
|
|
size_t xd_len;
|
|
struct inpcb xd_inp;
|
|
struct dccpcb xd_dp;
|
|
#ifdef __FreeBSD__
|
|
struct xsocket xd_socket;
|
|
#endif
|
|
};
|
|
#endif
|
|
|
|
#define intodccpcb(ip) ((struct dccpcb *)((ip)->inp_ppcb))
|
|
#define in6todccpcb(ip) ((struct dccpcb *)((ip)->in6p_ppcb))
|
|
|
|
#ifdef __NetBSD__
|
|
#define dptosocket(dp) (((dp)->d_inpcb) ? (dp)->d_inpcb->inp_socket : \
|
|
(((dp)->d_in6pcb) ? (dp)->d_in6pcb->in6p_socket : NULL))
|
|
#else
|
|
#define dptosocket(dp) ((dp)->d_inpcb->inp_socket)
|
|
#endif
|
|
|
|
struct dccpstat {
|
|
u_long dccps_connattempt; /* Initiated connections */
|
|
u_long dccps_connects; /* Established connections */
|
|
u_long dccps_ipackets; /* Total input packets */
|
|
u_long dccps_ibytes; /* Total input bytes */
|
|
u_long dccps_drops; /* Dropped packets */
|
|
u_long dccps_badsum; /* Checksum error */
|
|
u_long dccps_badlen; /* Bad length */
|
|
u_long dccps_badseq; /* Sequence number not inside loss_window */
|
|
u_long dccps_noport; /* No socket on port */
|
|
|
|
/* TCPlike Sender */
|
|
u_long tcplikes_send_conn; /* Connections established */
|
|
u_long tcplikes_send_reploss; /* Data packets reported lost */
|
|
u_long tcplikes_send_assloss; /* Data packets assumed lost */
|
|
u_long tcplikes_send_ackrecv; /* Acknowledgement (w/ Ack Vector) packets received */
|
|
u_long tcplikes_send_missack; /* Ack packets assumed lost */
|
|
u_long tcplikes_send_badseq; /* Bad sequence number on outgoing packet */
|
|
u_long tcplikes_send_memerr; /* Memory allocation errors */
|
|
|
|
/* TCPlike Receiver */
|
|
u_long tcplikes_recv_conn; /* Connections established */
|
|
u_long tcplikes_recv_datarecv; /* Number of data packets received */
|
|
u_long tcplikes_recv_ackack; /* Ack-on-acks received */
|
|
u_long tcplikes_recv_acksent; /* Acknowledgement (w/ Ack Vector) packets sent */
|
|
u_long tcplikes_recv_memerr; /* Memory allocation errors */
|
|
|
|
/* Some CCID statistic should also be here */
|
|
|
|
u_long dccps_opackets; /* Total output packets */
|
|
u_long dccps_obytes; /* Total output bytes */
|
|
|
|
/* TFRC Sender */
|
|
u_long tfrcs_send_conn; /* Connections established */
|
|
u_long tfrcs_send_nomem; /* Not enough memory */
|
|
u_long tfrcs_send_erropt; /* option error */
|
|
u_long tfrcs_send_noopt; /* no option */
|
|
u_long tfrcs_send_fbacks; /* sent feedbacks */
|
|
|
|
/* TFRC Receiver */
|
|
u_long tfrcs_recv_conn; /* established connection */
|
|
u_long tfrcs_recv_erropt; /* option error */
|
|
u_long tfrcs_recv_losts; /* lost packets */
|
|
u_long tfrcs_recv_nomem; /* no memory */
|
|
u_long tfrcs_recv_noopt; /* no option */
|
|
u_long tfrcs_recv_fbacks; /* receipt feedbacks */
|
|
|
|
};
|
|
|
|
/*
|
|
* Names for DCCP sysctl objects
|
|
*/
|
|
#define DCCPCTL_LOGINVAIN 1
|
|
#define DCCPCTL_DOFEATURENEGO 2
|
|
|
|
/*
|
|
* DCCP States
|
|
*/
|
|
|
|
#define DCCPS_CLOSED 0
|
|
#define DCCPS_LISTEN 1
|
|
#define DCCPS_REQUEST 2
|
|
#define DCCPS_RESPOND 3
|
|
#define DCCPS_ESTAB 4
|
|
#define DCCPS_SERVER_CLOSE 5
|
|
#define DCCPS_CLIENT_CLOSE 6
|
|
#define DCCPS_TIME_WAIT 7
|
|
|
|
#define DCCP_NSTATES 8
|
|
|
|
#ifdef DCCPSTATES
|
|
const char *dccpstates[] = {
|
|
"CLOSED", "LISTEN", "REQEST", "RESPOND",
|
|
"ESTABLISHED", "SERVER-CLOSE", "CLIENT-CLOSE", "TIME_WAIT",
|
|
};
|
|
#else
|
|
extern const char *dccpstates[];
|
|
#endif
|
|
|
|
#define DCCP_UNDEF 0
|
|
#define DCCP_LISTENER 1
|
|
#define DCCP_SERVER 2
|
|
#define DCCP_CLIENT 3
|
|
|
|
#define DCCP_SEQ_LT(a, b) ((int)(((a) << 16) - ((b) << 16)) < 0)
|
|
#define DCCP_SEQ_GT(a, b) ((int)(((a) << 16) - ((b) << 16)) > 0)
|
|
|
|
/*
|
|
* Names for DCCP sysctl objects
|
|
*/
|
|
#define DCCPCTL_DEFCCID 1 /* Default CCID */
|
|
#define DCCPCTL_STATS 2 /* statistics (read-only) */
|
|
#define DCCPCTL_PCBLIST 3
|
|
#define DCCPCTL_SENDSPACE 4
|
|
#define DCCPCTL_RECVSPACE 5
|
|
|
|
#define DCCPCTL_NAMES { \
|
|
{ 0, 0 }, \
|
|
{ "defccid", CTLTYPE_INT }, \
|
|
{ "stats", CTLTYPE_STRUCT }, \
|
|
{ "sendspace", CTLTYPE_INT }, \
|
|
{ "recvspace", CTLTYPE_INT }, \
|
|
}
|
|
|
|
#ifdef _KERNEL
|
|
|
|
#ifdef DCCP_DEBUG_ON
|
|
#define DCCP_DEBUG(args) dccp_log args
|
|
#else
|
|
#define DCCP_DEBUG(args)
|
|
#endif
|
|
|
|
#ifdef ACKDEBUG
|
|
#define ACK_DEBUG(args) dccp_log args
|
|
#else
|
|
#define ACK_DEBUG(args)
|
|
#endif
|
|
|
|
extern const struct pr_usrreqs dccp_usrreqs;
|
|
extern struct inpcbhead dccpb;
|
|
extern struct inpcbinfo dccpbinfo;
|
|
extern u_long dccp_sendspace;
|
|
extern u_long dccp_recvspace;
|
|
extern struct dccpstat dccpstat; /* dccp statistics */
|
|
extern int dccp_log_in_vain; /* if we should log connections to
|
|
ports w/o listeners */
|
|
extern int dccp_do_feature_nego;
|
|
|
|
extern struct inpcbtable dccpbtable;
|
|
|
|
/* These four functions are called from inetsw (in_proto.c) */
|
|
void dccp_init(void);
|
|
void dccp_log(int, const char *, ...);
|
|
void dccp_input(struct mbuf *, ...);
|
|
void* dccp_ctlinput(int, const struct sockaddr *, void *);
|
|
int dccp_ctloutput(int , struct socket *, struct sockopt *);
|
|
int dccp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
|
|
int dccp_usrreq(struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *);
|
|
|
|
void dccp_notify(struct inpcb *, int);
|
|
struct dccpcb *
|
|
dccp_newdccpcb(int, void *);
|
|
int dccp_shutdown(struct socket *);
|
|
int dccp_output(struct dccpcb *, u_int8_t);
|
|
int dccp_doconnect(struct socket *, struct sockaddr *, struct lwp *, int);
|
|
int dccp_add_option(struct dccpcb *, u_int8_t, char *, u_int8_t);
|
|
int dccp_add_feature(struct dccpcb *, u_int8_t, u_int8_t, char *, u_int8_t);
|
|
int dccp_detach(struct socket *);
|
|
int dccp_attach(struct socket *, int);
|
|
int dccp_abort(struct socket *);
|
|
int dccp_disconnect(struct socket *);
|
|
int dccp_send(struct socket *, struct mbuf *, struct sockaddr *,
|
|
struct mbuf *, struct lwp *);
|
|
void dccp_retrans_t(void *);
|
|
void dccp_connect_t(void *);
|
|
|
|
/* No cc functions */
|
|
void* dccp_nocc_init(struct dccpcb *);
|
|
void dccp_nocc_free(void *);
|
|
int dccp_nocc_send_packet(void*, long);
|
|
void dccp_nocc_send_packet_sent(void *, int, long);
|
|
void dccp_nocc_packet_recv(void*, char *, int);
|
|
|
|
#endif
|
|
|
|
#endif
|