/*
 * Copyright (C) 2011-2013 Michael Tuexen
 * Copyright (C) 2011-2015 Colin Caughie
 *
 * 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. Neither the name of the project 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 PROJECT 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 PROJECT 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.
 */

/*
 * Usage: st_client local_addr local_port remote_addr remote_port remote_sctp_port
 */

#ifdef _WIN32
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <sys/types.h>
#ifndef _WIN32
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>
#else
#include <winsock2.h>
#include <ws2tcpip.h>
#endif
#include <usrsctp.h>
#include "programs_helper.h"

#define MAX_PACKET_SIZE (1<<16)
#define BUFFER_SIZE 80
#define DISCARD_PPID 39

#define TIMER_INTERVAL_MSECS 10

static int connecting = 0;
static int finish = 0;

static unsigned get_tick_count(void)
{
#ifdef _WIN32
	return GetTickCount();
#else
	struct timeval te;
	gettimeofday(&te, NULL); // get current time
	unsigned milliseconds = te.tv_sec*1000LL + te.tv_usec/1000; // calculate milliseconds
	return milliseconds;
#endif
}

static void
handle_events(int sock, struct socket* s, void* sconn_addr)
{
	char *dump_buf;
	ssize_t length;
	char buf[MAX_PACKET_SIZE];

	fd_set rfds;
	struct timeval tv;

	unsigned next_fire_time = get_tick_count();
	unsigned last_fire_time = next_fire_time;

	while (!finish) {

		unsigned now = get_tick_count();
		int wait_time;

		if ((int) (now - next_fire_time) > 0) {
			usrsctp_handle_timers(now - last_fire_time);
			last_fire_time = now;
			next_fire_time = now + TIMER_INTERVAL_MSECS;
		}

		wait_time = next_fire_time - now;
		tv.tv_sec = wait_time / 1000;
		tv.tv_usec = (wait_time % 1000) * 1000;

		FD_ZERO(&rfds);
		FD_SET(sock, &rfds);

		select(sock + 1, &rfds, NULL, NULL, &tv);

		if (FD_ISSET(sock, &rfds)) {
			length = recv(sock, buf, MAX_PACKET_SIZE, 0);

			if (length > 0) {
				if ((dump_buf = usrsctp_dumppacket(buf, (size_t)length, SCTP_DUMP_INBOUND)) != NULL) {
					fprintf(stderr, "%s", dump_buf);
					usrsctp_freedumpbuffer(dump_buf);
				}
				usrsctp_conninput(sconn_addr, buf, (size_t)length, 0);
			}
		}
	}
}

static void on_connect(struct socket* s)
{
	struct sctp_sndinfo sndinfo;
	char buffer[BUFFER_SIZE];

	memset(buffer, 'A', BUFFER_SIZE);
	sndinfo.snd_sid = 0;
	sndinfo.snd_flags = 0;
	sndinfo.snd_ppid = htonl(DISCARD_PPID);
	sndinfo.snd_context = 0;
	sndinfo.snd_assoc_id = 0;
	if (usrsctp_sendv(s, buffer, BUFFER_SIZE, NULL, 0, (void *)&sndinfo,
	                  (socklen_t)sizeof(struct sctp_sndinfo), SCTP_SENDV_SNDINFO, 0) < 0) {
		perror("usrsctp_sendv");
	}
}

static void on_socket_readable(struct socket* s) {
	char buffer[BUFFER_SIZE];
	union sctp_sockstore addr;
	socklen_t fromlen = sizeof(addr);
	struct sctp_rcvinfo rcv_info;
	socklen_t infolen = sizeof(rcv_info);
	unsigned int infotype = 0;
	int flags = 0;
	ssize_t retval;

	/* Keep reading until there is no more data */
	for (;;) {
		retval = usrsctp_recvv(s, buffer, sizeof(buffer), (struct sockaddr*) &addr,
				&fromlen, &rcv_info, &infolen, &infotype, &flags);

		if (retval < 0) {
			if (errno != EWOULDBLOCK) {
				perror("usrsctp_recvv");
				finish = 1;
			}
			return;
		} else if (retval == 0) {
			printf("socket was disconnected\n");
			finish = 1;
			return;
		}

		if (flags & MSG_NOTIFICATION) {
			printf("Notification of length %d received.\n", (int)retval);
		} else {
			printf("Msg of length %d received via %p:%u on stream %d with SSN %u and TSN %u, PPID %d, context %u.\n",
			       (int)retval,
			       addr.sconn.sconn_addr,
			       ntohs(addr.sconn.sconn_port),
			       rcv_info.rcv_sid,
			       rcv_info.rcv_ssn,
			       rcv_info.rcv_tsn,
			       ntohl(rcv_info.rcv_ppid),
			       rcv_info.rcv_context);
		}
	}
}

static void handle_upcall(struct socket *s, void *arg, int flags)
{
    int events = usrsctp_get_events(s);

	if (connecting) {
		if (events & SCTP_EVENT_ERROR) {
			connecting = 0;
			finish = 1;
		} else if (events & SCTP_EVENT_WRITE) {
			connecting = 0;
			on_connect(s);
		}

		return;
	}

	if (events & SCTP_EVENT_READ) {
		on_socket_readable(s);
	}
}

static int
conn_output(void *addr, void *buf, size_t length, uint8_t tos, uint8_t set_df)
{
	char *dump_buf;
#ifdef _WIN32
	SOCKET *fdp;
#else
	int *fdp;
#endif

#ifdef _WIN32
	fdp = (SOCKET *)addr;
#else
	fdp = (int *)addr;
#endif
	if ((dump_buf = usrsctp_dumppacket(buf, length, SCTP_DUMP_OUTBOUND)) != NULL) {
		fprintf(stderr, "%s", dump_buf);
		usrsctp_freedumpbuffer(dump_buf);
	}
#ifdef _WIN32
	if (send(*fdp, buf, (int)length, 0) == SOCKET_ERROR) {
		return (WSAGetLastError());
#else
	if (send(*fdp, buf, length, 0) < 0) {
		return (errno);
#endif
	} else {
		return (0);
	}
}

/* Usage: st_client local_addr local_port remote_addr remote_port remote_sctp_port */
int
main(int argc, char *argv[])
{
	struct sockaddr_in sin;
	struct sockaddr_conn sconn;
#ifdef _WIN32
	SOCKET fd;
#else
	int fd;
#endif
	struct socket *s;
	int retval;
#ifdef _WIN32
	WSADATA wsaData;
#endif

	if (argc < 6) {
		printf("Usage: st_client local_addr local_port remote_addr remote_port remote_sctp_port\n");
		return (-1);
	}

#ifdef _WIN32
	if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
		printf("WSAStartup failed\n");
		return (-1);
	}
#endif
	usrsctp_init_nothreads(0, conn_output, debug_printf);
	/* set up a connected UDP socket */
#ifdef _WIN32
	if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
		printf("socket() failed with error: %ld\n", WSAGetLastError());
		return (-1);
	}
#else
	if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
		perror("socket");
		return (-1);
	}
#endif
	memset(&sin, 0, sizeof(struct sockaddr_in));
	sin.sin_family = AF_INET;
#ifdef HAVE_SIN_LEN
	sin.sin_len = sizeof(struct sockaddr_in);
#endif
	sin.sin_port = htons(atoi(argv[2]));
	if (!inet_pton(AF_INET, argv[1], &sin.sin_addr.s_addr)){
		printf("error: invalid address\n");
		return (-1);
	}
#ifdef _WIN32
	if (bind(fd, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
		printf("bind() failed with error: %ld\n", WSAGetLastError());
		return (-1);
	}
#else
	if (bind(fd, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)) < 0) {
		perror("bind");
		return (-1);
	}
#endif
	memset(&sin, 0, sizeof(struct sockaddr_in));
	sin.sin_family = AF_INET;
#ifdef HAVE_SIN_LEN
	sin.sin_len = sizeof(struct sockaddr_in);
#endif
	sin.sin_port = htons(atoi(argv[4]));
	if (!inet_pton(AF_INET, argv[3], &sin.sin_addr.s_addr)){
		printf("error: invalid address\n");
		return (-1);
	}
#ifdef _WIN32
	if (connect(fd, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
		printf("connect() failed with error: %ld\n", WSAGetLastError());
		return (-1);
	}
#else
	if (connect(fd, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)) < 0) {
		perror("connect");
		return (-1);
	}
#endif
#ifdef SCTP_DEBUG
	usrsctp_sysctl_set_sctp_debug_on(SCTP_DEBUG_NONE);
#endif
	usrsctp_sysctl_set_sctp_ecn_enable(0);
	usrsctp_register_address((void *)&fd);

	if ((s = usrsctp_socket(AF_CONN, SOCK_STREAM, IPPROTO_SCTP, NULL, NULL, 0, NULL)) == NULL) {
		perror("usrsctp_socket");
		return (-1);
	}

	const int on = 1;

	usrsctp_setsockopt(s, IPPROTO_SCTP, SCTP_RECVRCVINFO, &on, sizeof(int));

	usrsctp_set_non_blocking(s, 1);
    usrsctp_set_upcall(s, handle_upcall, NULL);

	memset(&sconn, 0, sizeof(struct sockaddr_conn));
	sconn.sconn_family = AF_CONN;
#ifdef HAVE_SCONN_LEN
	sconn.sconn_len = sizeof(struct sockaddr_conn);
#endif
	sconn.sconn_port = htons(0);
	sconn.sconn_addr = NULL;
	if (usrsctp_bind(s, (struct sockaddr *)&sconn, sizeof(struct sockaddr_conn)) < 0) {
		perror("usrsctp_bind");
		return (-1);
	}

	memset(&sconn, 0, sizeof(struct sockaddr_conn));
	sconn.sconn_family = AF_CONN;
#ifdef HAVE_SCONN_LEN
	sconn.sconn_len = sizeof(struct sockaddr_conn);
#endif
	sconn.sconn_port = htons(atoi(argv[5]));
	sconn.sconn_addr = &fd;

	retval = usrsctp_connect(s, (struct sockaddr *)&sconn, sizeof(struct sockaddr_conn));

	if (retval < 0 && errno != EWOULDBLOCK && errno != EINPROGRESS) {
		perror("usrsctp_connect");
		return (-1);
	}

	connecting = 1;

	handle_events(fd, s, sconn.sconn_addr);

	return 0;
}
