blob: 7dd9d48b79e3ffc01aa3878714a5aa63df4a82e8 [file] [log] [blame]
/**
* @file tcp_high.c High-level TCP functions
*
* Copyright (C) 2010 Creytiv.com
*/
#include <re_types.h>
#include <re_mem.h>
#include <re_mbuf.h>
#include <re_tcp.h>
/**
* Create and listen on a TCP Socket
*
* @param tsp Pointer to returned TCP Socket
* @param local Local listen address (NULL for any)
* @param ch Incoming connection handler
* @param arg Handler argument
*
* @return 0 if success, otherwise errorcode
*/
int tcp_listen(struct tcp_sock **tsp, const struct sa *local,
tcp_conn_h *ch, void *arg)
{
struct tcp_sock *ts = NULL;
int err;
if (!tsp)
return EINVAL;
err = tcp_sock_alloc(&ts, local, ch, arg);
if (err)
goto out;
err = tcp_sock_bind(ts, local);
if (err)
goto out;
err = tcp_sock_listen(ts, 5);
if (err)
goto out;
out:
if (err)
ts = mem_deref(ts);
else
*tsp = ts;
return err;
}
/**
* Make a TCP Connection to a remote peer
*
* @param tcp Returned TCP Connection object
* @param peer Network address of peer
* @param eh TCP Connection Established handler
* @param rh TCP Connection Receive data handler
* @param ch TCP Connection close handler
* @param arg Handler argument
*
* @return 0 if success, otherwise errorcode
*/
int tcp_connect(struct tcp_conn **tcp, const struct sa *peer,
tcp_estab_h *eh, tcp_recv_h *rh, tcp_close_h *ch, void *arg)
{
struct tcp_conn *tc = NULL;
int err;
if (!tcp || !peer)
return EINVAL;
err = tcp_conn_alloc(&tc, peer, eh,rh, ch, arg);
if (err)
goto out;
err = tcp_conn_connect(tc, peer);
if (err)
goto out;
out:
if (err)
tc = mem_deref(tc);
else
*tcp = tc;
return err;
}
/**
* Get local network address of TCP Socket
*
* @param ts TCP Socket
* @param local Returned local network address
*
* @return 0 if success, otherwise errorcode
*/
int tcp_local_get(const struct tcp_sock *ts, struct sa *local)
{
return tcp_sock_local_get(ts, local);
}