/* Run M2UA over SCTP here */
/* (C) 2011 by Holger Hans Peter Freyther <zecke@selfish.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef sctp_m2ua_h
#define sctp_m2ua_h

#include "mtp_data.h"

#include <osmocom/m2ua/m2ua_msg.h>
#include <osmocore/write_queue.h>

#include <netinet/in.h>
#include <netinet/sctp.h>

struct sctp_m2ua_conn;
struct mtp_link;

/**
 * Drive M2UA over a SCTP link. Right now we have no
 * real concept for failover and such for the link.
 */
struct sctp_m2ua_transport {
	int started;
	struct llist_head conns;
	struct bsc_fd bsc;

	struct llist_head links;
};

struct mtp_m2ua_link {
	struct mtp_link *base;

	/*
	 * The state of the link, who is using it and
	 * what will happen to it. For load-sharing we
	 * will need to turn this into a list.
	 */
	int active;
	int asp_active;
	int established;
	struct sctp_m2ua_conn *conn;

	int link_index;
	struct llist_head entry;
	struct sctp_m2ua_transport *transport;

	char *as;
};

/*
 * One ASP that can be active or such.
 */
struct sctp_m2ua_conn {
	struct llist_head entry;
	uint8_t asp_ident[4];
	int asp_up;

	struct write_queue queue;
	struct sctp_m2ua_transport *trans;
};

struct sctp_m2ua_transport *sctp_m2ua_transp_create(struct bsc_data *bsc);
int sctp_m2ua_transport_bind(struct sctp_m2ua_transport *, const char *ip, int port);
struct mtp_m2ua_link *mtp_m2ua_link_create(struct sctp_m2ua_transport *transport,
					   struct mtp_link_set *);

struct mtp_m2ua_link *mtp_m2ua_link_init(struct mtp_link *link);

#endif
