lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lwip-users] Dead PCB-problem when PPP interface is removed


From: Romeo
Subject: [lwip-users] Dead PCB-problem when PPP interface is removed
Date: Fri, 22 Nov 2013 01:44:27 +0400

in addition to

http://lists.gnu.org/archive/html/lwip-users/2003-03/msg00118.html

I've extended pcb remove code code to use it in netif_remove too. My edition solves problem when PPP connection is suddenly lost, netif is removed and there's some PCBs left in stack.

patch to 1.4.1 is attached

#if LWIP_TCP

static void netif_remove_pcbs(struct netif *netif){

  struct tcp_pcb *pcb;

  pcb = tcp_active_pcbs;

  while (pcb != NULL) {

    /* PCB bound to current local interface address? */

    if (ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))

#if LWIP_AUTOIP

      /* connections to link-local addresses must persist (RFC3927 ch. 1.9) */

      && !ip_addr_islinklocal(&(pcb->local_ip))

#endif /* LWIP_AUTOIP */

      ) {

      /* this connection must be aborted */

      struct tcp_pcb *next = pcb->next;

      LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_remove_pcbs: aborting TCP pcb %p\n", (void *)pcb));

      tcp_abort(pcb);

      pcb = next;

    } else {

      pcb = pcb->next;

    }

  }

}

#endif


/**

 * Remove a network interface from the list of lwIP netifs.

 *

 * @param netif the network interface to remove

 */

void

netif_remove(struct netif *netif)

{

  if (netif == NULL) {

    return;

  }


#if LWIP_TCP

  netif_remove_pcbs(netif);

#endif


#if LWIP_IGMP

  /* stop IGMP processing */

  if (netif->flags & NETIF_FLAG_IGMP) {

    igmp_stop(netif);

  }

#endif /* LWIP_IGMP */

  if (netif_is_up(netif)) {

    /* set netif down before removing (call callback function) */

    netif_set_down(netif);

  }


  snmp_delete_ipaddridx_tree(netif);


  /*  is it the first netif? */

  if (netif_list == netif) {

    netif_list = netif->next;

  } else {

    /*  look for netif further down the list */

    struct netif * tmpNetif;

    for (tmpNetif = netif_list; tmpNetif != NULL; tmpNetif = tmpNetif->next) {

      if (tmpNetif->next == netif) {

        tmpNetif->next = netif->next;

        break;

      }

    }

    if (tmpNetif == NULL)

      return; /*  we didn't find any netif today */

  }

  snmp_dec_iflist();

  /* this netif is default? */

  if (netif_default == netif) {

    /* reset default netif */

    netif_set_default(NULL);

  }

#if LWIP_NETIF_REMOVE_CALLBACK

  if (netif->remove_callback) {

    netif->remove_callback(netif);

  }

#endif /* LWIP_NETIF_REMOVE_CALLBACK */

  LWIP_DEBUGF( NETIF_DEBUG, ("netif_remove: removed netif\n") );

}

void

netif_set_ipaddr(struct netif *netif, ip_addr_t *ipaddr)

{

  /* TODO: Handling of obsolete pcbs */

  /* See:  http://mail.gnu.org/archive/html/lwip-users/2003-03/msg00118.html */

#if LWIP_TCP

  struct tcp_pcb_listen *lpcb;


  /* address is actually being changed? */

  if (ipaddr && (ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) {

    /* extern struct tcp_pcb *tcp_active_pcbs; defined by tcp.h */

    LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n"));

    netif_remove_pcbs(netif);

    for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {

      /* PCB bound to current local interface address? */

      if ((!(ip_addr_isany(&(lpcb->local_ip)))) &&

          (ip_addr_cmp(&(lpcb->local_ip), &(netif->ip_addr)))) {

        /* The PCB is listening to the old ipaddr and

         * is set to listen to the new one instead */

        ip_addr_set(&(lpcb->local_ip), ipaddr);

      }

    }

  }

#endif

  snmp_delete_ipaddridx_tree(netif);

  snmp_delete_iprteidx_tree(0,netif);

  /* set new IP address to netif */

  ip_addr_set(&(netif->ip_addr), ipaddr);

  snmp_insert_ipaddridx_tree(netif);

  snmp_insert_iprteidx_tree(0,netif);


  LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: IP address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",

    netif->name[0], netif->name[1],

    ip4_addr1_16(&netif->ip_addr),

    ip4_addr2_16(&netif->ip_addr),

    ip4_addr3_16(&netif->ip_addr),

    ip4_addr4_16(&netif->ip_addr)));

}


--
Best Regards,

Roman Savrulin

Phone: +7 (921) 562 40 07




--
Best Regards,

Roman Savrulin

Phone: +7 (921) 562 40 07 address@hidden

Attachment: netif.c.patch
Description: Binary data


reply via email to

[Prev in Thread] Current Thread [Next in Thread]