Skip to content

heiher/lwip

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

43 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LwIP

status

This is a branch of liblwip with a simple build system.

Features

  • UDP: Allow receiving packets are not destined to localhost.
  • TCP: Allow accepting connections are not destined to localhost.

Examples

TCP

static void
gateway_init(void)
{
    // Init netif
    netif_set_up (&netif);
    netif_set_link_up (&netif);
    netif_set_default (&netif);

    // Allow to pretend TCP on this netif
    netif_set_flags (&netif, NETIF_FLAG_PRETEND_TCP);

    tcp = tcp_new_ip_type (IPADDR_TYPE_ANY);

    // Bind TCP to netif first
    tcp_bind_netif (tcp, &netif);

    // Bind to accept incoming connections to other hosts
    tcp_bind (tcp, NULL, 0);

    tcp_listen (tcp);
    tcp_accept (tcp, tcp_accept_handler);
}

static err_t
tcp_accept_handler (void *arg, struct tcp_pcb *pcb, err_t err)
{
    // Accept new TCP connection
    // @pcb->local_ip: The real destination address
    // @pcb->local_port: The real destination port
    // @pcb->remote_ip: The real source address
    // @pcb->remote_port: The real source port
}

UDP

static void
gateway_init(void)
{
    // Init netif
    netif_set_up (&netif);
    netif_set_link_up (&netif);
    netif_set_default (&netif);

    // Allow to pretend UDP on this netif
    netif_set_flags (&netif, NETIF_FLAG_PRETEND_UDP);

    udp = udp_new_ip_type (IPADDR_TYPE_ANY);

    // Bind TCP to netif first
    udp_bind_netif (udp, &netif);

    // Bind to receive packets to other hosts
    udp_bind (udp, NULL, 0);

    udp_recv (udp, udp_accept_handler, NULL);
}

static void
udp_accept_handler (void *arg, struct udp_pcb *pcb, struct pbuf *p,
                  const ip_addr_t *addr, u16_t port)
{
    // Similar to TCP accept, receive packets on new UDP PCB.
    // @pcb: An new UDP PCB for sending and receiving.
    // @p: Unused
    // @addr: Unused
    // @port: Unused
    udp_recv (pcb, udp_recv_handler, NULL);
}

static void
udp_recv_handler (void *arg, struct udp_pcb *pcb, struct pbuf *p,
                  const ip_addr_t *addr, u16_t port)
{
    // Receive UDP packets

    // @pcb->local_ip: The real destination address
    // @pcb->local_port: The real destination port
    // @pcb->remote_ip: The real source address
    // @pcb->remote_port: The real source port
    // @addr: Unused
    // @port: Unused

    // Send with source address
    udp_sendfrom (pcb, p, real_src_ip, real_src_port);
    pbuf_free (p);
}

How to Build

Unix:

git clone https://gitlab.com/hev/lwip
cd lwip
make

Android:

mkdir lwip
cd lwip
git clone https://gitlab.com/hev/lwip jni
ndk-build

Windows:

git clone https://gitlab.com/hev/lwip
cd lwip
make CROSS_PREFIX=x86_64-w64-mingw32-

Upstream

https://savannah.nongnu.org/projects/lwip