#include "uip.h"
#include "iperf-server.h"
#include <string.h>

static struct iperf_server_state s;

#define STATE_WAITING 0
#define STATE_RECEIVED 1

void iperf_server_init(void)
{
    uip_listen(HTONS(5001));
}


static void aborted(void) {}
static void timedout(void) {}
static void closed(void) {}

static void connected(void)
{
    struct iperf_server_state *s = &(uip_conn->appstate);

    s->state = STATE_WAITING;
    s->textlen = 0;
}

static void newdata(void)
{
    struct iperf_server_state *s = &(uip_conn->appstate);

    if (s->state == STATE_WAITING)
    {
        s->state = STATE_RECEIVED;
        s->textptr = "";
        s->textlen = 0;
    }
}

static void acked(void)
{
    struct iperf_server_state *s = &(uip_conn->appstate);

    s->state = STATE_WAITING;
}

static void senddata(void)
{
    struct iperf_server_state *s = &(uip_conn->appstate);

    uip_send(s->textptr, s->textlen);
}

void iperf_server_appcall(void)
{
    if (uip_aborted())
    {
        aborted();
    }
    if (uip_timedout())
    {
        timedout();
    }
    if (uip_closed())
    {
        closed();
    }
    if (uip_connected())
    {
        connected();
    }
    if (uip_acked())
    {
        acked();
    }
    if (uip_newdata())
    {
        newdata();
    }
    if (uip_rexmit() ||
        uip_newdata() ||
        uip_acked() ||
        uip_connected() ||
        uip_poll())
    {
        senddata();
    }
}