[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [lwip-users] help request; need to get a grip of lwIP
From: |
mcondarelli |
Subject: |
Re: [lwip-users] help request; need to get a grip of lwIP |
Date: |
Wed, 16 Nov 2011 22:35:09 +0100 (CET) |
Real sorry.
I sent the message before it was finished.
Continuation follows below.
Regards
Mauro
----- Messaggio originale -----
> Hi,
> I'm struggling with my first lwIP port.
> I need to implement a few services, mostly based on TCP.
>
> One of the first things I need to do is to create a socket to allow
> remote to connect, when this happens I should start sending some
> logging messages over the socket.
> If none is connected messages are silently discarded.
>
> My real problem is to get to the first stage of the connection.
>
> For some tests I used apps/tcpecho_raw as template.
>
> My main program calls (no prior lwIP code) the function IP_start(0).
>
> ---------------------------------------------------------------
> struct netif netif;
>
> /* static port number; workaround for lwIP slipif deficencies */
> int slipif_port = -1;
>
> static void ip_init(void *param)
> {
> IP4_ADDR(&gw, 192, 168, 0, 1);
> IP4_ADDR(&ipaddr, 192, 168, 0, 2);
> IP4_ADDR(&netmask, 255, 255, 255, 0);
>
> netif_add(&netif, &ipaddr, &netmask, &gw, NULL, slipif_init,
> tcpip_input);
> nmea_init();
> }
>
> error_t IP_start(u8_t port)
> {
> if (slipif_port != -1)
> {
> main_debug_printf("IP_start: already initialized!\r\n");
> return FAILURE;
> }
> slipif_port = port;
>
> tcpip_init(ip_init, NULL);
> return SUCCESS;
> }
> ---------------------------------------------------------------
> nmea_init() is the function that initializes my application
> ---------------------------------------------------------------
---------------------------------------------------------------
void nmea_init(void)
{
LWIP_DEBUGF(N_DEBUG, ("nmea_init: start\r\n"));
nmea_pcb = tcp_new();
if (nmea_pcb != NULL)
{
err_t err;
err = tcp_bind(nmea_pcb, IP_ADDR_ANY, 1000);
if (err == ERR_OK)
{
LWIP_DEBUGF(N_DEBUG, ("nmea_init: bound\r\n"));
nmea_pcb = tcp_listen(nmea_pcb);
tcp_accept(nmea_pcb, nmea_accept);
LWIP_DEBUGF(N_DEBUG, ("nmea_init: waiting for connection\r\n"));
}
else
{
LWIP_DEBUGF(N_DEBUG, ("nmea_init: unable to bind\r\n"));
}
}
else
{
LWIP_DEBUGF(N_DEBUG, ("nmea_init: unable to allocate pcb\r\n"));
}
}
---------------------------------------------------------------
The function nmea_accept() is never called.
I traced the error down to lwip/core/ipv4/ip.c where the test:
---------------------------------------------------------------
/* interface is up and configured? */
if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
/* unicast to this interface address? */
if (ip_addr_cmp(¤t_iphdr_dest, &(netif->ip_addr)) ||
/* or broadcast on this interface network address? */
ip_addr_isbroadcast(¤t_iphdr_dest, netif)) {
LWIP_DEBUGF(IP_DEBUG, ("ip_input: packet accepted on interface
%c%c\n",
netif->name[0], netif->name[1]));
/* break out of for loop */
break;
}
---------------------------------------------------------------
fails because netif_is_up(netif) returns FALSE.
Struct netif appears to contain the right values, but I'm obviously missing
some needed initialization.
Can someone point me to some complete initialization fitting my cases?
I will try debugging through the code and I believe I can find out which
function does the required initialization, but it's far from being an efficient
process.
I really need to get a grip on the various programming interfaces lwIP has,
possibly mixing them in a sensible way.
I will need to implement several semi-unrelated services all insisting on the
same SLIP connection; some of them are best suited for the RAW interface while
some other would prefer a connection; is it possible to mix (on different
applications, of course)?
TiA
Mauro