#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;
u_int8_t who;
struct callout connect_timer;
struct callout retrans_timer;
struct callout close_timer;
struct callout timewait_timer;
u_int32_t retrans;
dccp_seq seq_snd;
dccp_seq ack_snd;
dccp_seq gsn_rcv;
dccp_seq seq_rcv;
dccp_seq ack_rcv;
u_int8_t type_rcv;
u_int32_t len_rcv;
u_int8_t ndp_rcv;
u_int8_t cslen;
u_int8_t pref_cc;
u_int8_t ndp;
u_int32_t loss_window;
u_int16_t ack_ratio;
int8_t cc_in_use[2];
void *cc_state[2];
struct inpcb *d_inpcb;
u_int32_t d_maxseg;
char options[DCCP_MAX_OPTIONS];
u_int8_t optlen;
char features[DCCP_MAX_OPTIONS];
u_int8_t featlen;
u_int8_t ccval;
u_int32_t avgpsize;
u_char *ackvector;
u_char *av_hp;
u_int16_t av_size;
dccp_seq av_hs, av_ts;
u_int8_t remote_ackvector;
u_char shortseq;
u_int32_t scode;
struct ref_seq ref_seq;
struct ref_seq ref_pseq;
#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 dptosocket(dp) ((dp)->d_inpcb->inp_socket)
struct dccpstat {
u_long dccps_connattempt;
u_long dccps_connects;
u_long dccps_ipackets;
u_long dccps_ibytes;
u_long dccps_drops;
u_long dccps_badsum;
u_long dccps_badlen;
u_long dccps_badseq;
u_long dccps_noport;
u_long tcplikes_send_conn;
u_long tcplikes_send_reploss;
u_long tcplikes_send_assloss;
u_long tcplikes_send_ackrecv;
u_long tcplikes_send_missack;
u_long tcplikes_send_badseq;
u_long tcplikes_send_memerr;
u_long tcplikes_recv_conn;
u_long tcplikes_recv_datarecv;
u_long tcplikes_recv_ackack;
u_long tcplikes_recv_acksent;
u_long tcplikes_recv_memerr;
u_long dccps_opackets;
u_long dccps_obytes;
u_long tfrcs_send_conn;
u_long tfrcs_send_nomem;
u_long tfrcs_send_erropt;
u_long tfrcs_send_noopt;
u_long tfrcs_send_fbacks;
u_long tfrcs_recv_conn;
u_long tfrcs_recv_erropt;
u_long tfrcs_recv_losts;
u_long tfrcs_recv_nomem;
u_long tfrcs_recv_noopt;
u_long tfrcs_recv_fbacks;
};
#define DCCPCTL_LOGINVAIN 1
#define DCCPCTL_DOFEATURENEGO 2
#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)
#define DCCPCTL_DEFCCID 1
#define DCCPCTL_STATS 2
#define DCCPCTL_PCBLIST 3
#define DCCPCTL_SENDSPACE 4
#define DCCPCTL_RECVSPACE 5
#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;
extern int dccp_log_in_vain;
extern int dccp_do_feature_nego;
extern struct inpcbtable dccpbtable;
void dccp_init(void);
void dccp_log(int, const char *, ...);
void dccp_input(struct mbuf *, int, int);
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 *);
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