/*-
 * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved.
 * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved.
 * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * a) Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 * b) 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.
 *
 * c) Neither the name of Cisco Systems, Inc. nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
 */

#ifdef __FreeBSD__
#include <sys/cdefs.h>
__FBSDID("$FreeBSD: head/sys/netinet/sctp_output.h 246595 2013-02-09 17:26:14Z tuexen $");
#endif

#ifndef _NETINET_SCTP_OUTPUT_H_
#define _NETINET_SCTP_OUTPUT_H_

#include <netinet/sctp_header.h>

#if defined(_KERNEL) || defined(__Userspace__)


struct mbuf *
sctp_add_addresses_to_i_ia(struct sctp_inpcb *inp,
                           struct sctp_tcb *stcb,
			   struct sctp_scoping *scope,
			   struct mbuf *m_at,
			   int cnt_inits_to,
			   uint16_t *padding_len, uint16_t *chunk_len);


int sctp_is_addr_restricted(struct sctp_tcb *, struct sctp_ifa *);


int
sctp_is_address_in_scope(struct sctp_ifa *ifa,
                         struct sctp_scoping *scope,
			 int do_update);

int
sctp_is_addr_in_ep(struct sctp_inpcb *inp, struct sctp_ifa *ifa);

struct sctp_ifa *
sctp_source_address_selection(struct sctp_inpcb *inp,
			      struct sctp_tcb *stcb,
			      sctp_route_t *ro, struct sctp_nets *net,
			      int non_asoc_addr_ok, uint32_t vrf_id);

#if defined(__FreeBSD__) || defined(__APPLE__) || defined(__Userspace__)
int
sctp_v6src_match_nexthop(struct sockaddr_in6 *src6, sctp_route_t *ro);
int
sctp_v4src_match_nexthop(struct sctp_ifa *sifa, sctp_route_t *ro);
#endif

void sctp_send_initiate(struct sctp_inpcb *, struct sctp_tcb *, int
#if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING)
    SCTP_UNUSED
#endif
    );

void
sctp_send_initiate_ack(struct sctp_inpcb *, struct sctp_tcb *, struct mbuf *,
                       int, int,
                       struct sockaddr *, struct sockaddr *,
                       struct sctphdr *, struct sctp_init_chunk *,
#if defined(__FreeBSD__)
                       uint8_t, uint32_t,
#endif
                       uint32_t, uint16_t, int);

struct mbuf *
sctp_arethere_unrecognized_parameters(struct mbuf *, int, int *,
				      struct sctp_chunkhdr *, int *);
void sctp_queue_op_err(struct sctp_tcb *, struct mbuf *);

int
sctp_send_cookie_echo(struct mbuf *, int, struct sctp_tcb *,
    struct sctp_nets *);

void sctp_send_cookie_ack(struct sctp_tcb *);

void
sctp_send_heartbeat_ack(struct sctp_tcb *, struct mbuf *, int, int,
    struct sctp_nets *);

void
sctp_remove_from_wheel(struct sctp_tcb *stcb,
					   struct sctp_association *asoc,
					   struct sctp_stream_out *strq, int holds_lock);


void sctp_send_shutdown(struct sctp_tcb *, struct sctp_nets *);

void sctp_send_shutdown_ack(struct sctp_tcb *, struct sctp_nets *);

void sctp_send_shutdown_complete(struct sctp_tcb *, struct sctp_nets *, int);

void sctp_send_shutdown_complete2(struct sockaddr *, struct sockaddr *,
                                  struct sctphdr *,
#if defined(__FreeBSD__)
                                  uint8_t, uint32_t,
#endif
                                  uint32_t, uint16_t);

void sctp_send_asconf(struct sctp_tcb *, struct sctp_nets *, int addr_locked);

void sctp_send_asconf_ack(struct sctp_tcb *);

int sctp_get_frag_point(struct sctp_tcb *, struct sctp_association *);

void sctp_toss_old_cookies(struct sctp_tcb *, struct sctp_association *);

void sctp_toss_old_asconf(struct sctp_tcb *);

void sctp_fix_ecn_echo(struct sctp_association *);

void sctp_move_chunks_from_net(struct sctp_tcb *stcb, struct sctp_nets *net);

#if defined(__FreeBSD__) && __FreeBSD_version >= 500000
int
sctp_output(struct sctp_inpcb *, struct mbuf *, struct sockaddr *,
    struct mbuf *, struct thread *, int);
#elif defined(__Windows__)
sctp_output(struct sctp_inpcb *, struct mbuf *, struct sockaddr *,
    struct mbuf *, PKTHREAD, int);
#else
#if defined(__Userspace__)
/* sctp_output is called bu sctp_sendm. Not using sctp_sendm for __Userspace__ */
#endif
int
sctp_output(struct sctp_inpcb *,
#if defined(__Panda__)
    pakhandle_type,
#else
    struct mbuf *,
#endif
    struct sockaddr *,
#if defined(__Panda__)
    pakhandle_type,
#else
    struct mbuf *,
#endif
    struct proc *, int);
#endif

void sctp_chunk_output(struct sctp_inpcb *, struct sctp_tcb *, int, int
#if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING)
    SCTP_UNUSED
#endif
    );
void sctp_send_abort_tcb(struct sctp_tcb *, struct mbuf *, int
#if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING)
    SCTP_UNUSED
#endif
    );

void send_forward_tsn(struct sctp_tcb *, struct sctp_association *);

void sctp_send_sack(struct sctp_tcb *, int);

void sctp_send_hb(struct sctp_tcb *, struct sctp_nets *, int);

void sctp_send_ecn_echo(struct sctp_tcb *, struct sctp_nets *, uint32_t);


void
sctp_send_packet_dropped(struct sctp_tcb *, struct sctp_nets *, struct mbuf *,
    int, int, int);



void sctp_send_cwr(struct sctp_tcb *, struct sctp_nets *, uint32_t, uint8_t);


void
sctp_add_stream_reset_out(struct sctp_tmit_chunk *,
                          int, uint16_t *, uint32_t, uint32_t, uint32_t);

void
sctp_add_stream_reset_result(struct sctp_tmit_chunk *, uint32_t, uint32_t);

void
sctp_add_stream_reset_result_tsn(struct sctp_tmit_chunk *,
                                 uint32_t, uint32_t, uint32_t, uint32_t);

int
sctp_send_str_reset_req(struct sctp_tcb *, int , uint16_t *, uint8_t, uint8_t,
			uint8_t, uint8_t, uint16_t, uint16_t, uint8_t);

void
sctp_send_abort(struct mbuf *, int, struct sockaddr *, struct sockaddr *,
                struct sctphdr *, uint32_t, struct mbuf *,
#if defined(__FreeBSD__)
                uint8_t, uint32_t,
#endif
                uint32_t, uint16_t);

void sctp_send_operr_to(struct sockaddr *, struct sockaddr *,
                        struct sctphdr *, uint32_t, struct mbuf *,
#if defined(__FreeBSD__)
                        uint8_t, uint32_t,
#endif
                        uint32_t, uint16_t);

#endif /* _KERNEL || __Userspace__ */

#if defined(_KERNEL) || defined(__Userspace__)
int
sctp_sosend(struct socket *so,
    struct sockaddr *addr,
    struct uio *uio,
#ifdef __Panda__
    pakhandle_type top,
    pakhandle_type control,
#else
    struct mbuf *top,
    struct mbuf *control,
#endif
#if defined(__APPLE__) || defined(__Panda__)
    int flags
#else
    int flags,
#if defined(__FreeBSD__) && __FreeBSD_version >= 500000
    struct thread *p
#elif defined(__Windows__)
    PKTHREAD p
#else
#if defined(__Userspace__)
    /* proc is a dummy in __Userspace__ and will not be passed to sctp_lower_sosend */
#endif
    struct proc *p
#endif
#endif
);

#endif
#endif

