Skip to content

Commit ac21ee9

Browse files
authored
Merge pull request #12791 from cy-arsm/cy-arsm/pr/IPv6_Dual_stack_fix
Fix for IPv6 Dual Stack support
2 parents fcc20b1 + cfcfd11 commit ac21ee9

File tree

5 files changed

+82
-0
lines changed

5 files changed

+82
-0
lines changed

features/lwipstack/LWIPInterface.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,10 @@ LWIP::Interface::Interface() :
388388
attr.cb_mem = &has_any_addr_sem;
389389
attr.cb_size = sizeof has_any_addr_sem;
390390
has_any_addr = osSemaphoreNew(UINT16_MAX, 0, &attr);
391+
392+
attr.cb_mem = &remove_interface_sem;
393+
attr.cb_size = sizeof remove_interface_sem;
394+
remove_interface = osSemaphoreNew(UINT16_MAX, 0, &attr);
391395
#if PREF_ADDR_TIMEOUT
392396
attr.cb_mem = &has_pref_addr_sem;
393397
attr.cb_size = sizeof has_pref_addr_sem;
@@ -459,6 +463,50 @@ nsapi_error_t LWIP::add_ethernet_interface(EMAC &emac, bool default_if, OnboardN
459463
#endif //LWIP_ETHERNET
460464
}
461465

466+
void LWIP::Interface::delete_interface(OnboardNetworkStack::Interface **interface_out)
467+
{
468+
#if LWIP_ETHERNET
469+
if ((interface_out != NULL) && (*interface_out != NULL)) {
470+
LWIP::Interface *lwip = static_cast<Interface *>(*interface_out);
471+
LWIP::Interface *node = lwip->list;
472+
473+
if (lwip->list != NULL) {
474+
if (lwip->list == lwip) {
475+
476+
lwip->list = lwip->list->next;
477+
netif_remove(&node->netif);
478+
*interface_out = NULL;
479+
delete node;
480+
} else {
481+
while (node->next != NULL && node->next != lwip) {
482+
node = node->next;
483+
}
484+
if (node->next != NULL && node->next == lwip) {
485+
Interface *remove = node->next;
486+
node->next = node->next->next;
487+
netif_remove(&remove->netif);
488+
*interface_out = NULL;
489+
delete remove;
490+
}
491+
}
492+
}
493+
osSemaphoreRelease(lwip->remove_interface);
494+
}
495+
#endif
496+
}
497+
498+
nsapi_error_t LWIP::remove_ethernet_interface(OnboardNetworkStack::Interface **interface_out)
499+
{
500+
#if LWIP_ETHERNET
501+
LWIP::Interface *lwip = static_cast<Interface *>(*interface_out);
502+
tcpip_callback_with_block((tcpip_callback_fn)&LWIP::Interface::delete_interface, interface_out, 1);
503+
osSemaphoreAcquire(lwip->remove_interface, osWaitForever);
504+
return NSAPI_ERROR_OK;
505+
#else
506+
return NSAPI_ERROR_UNSUPPORTED;
507+
#endif //LWIP_ETHERNET
508+
}
509+
462510
nsapi_error_t LWIP::add_l3ip_interface(L3IP &l3ip, bool default_if, OnboardNetworkStack::Interface **interface_out)
463511
{
464512
#if LWIP_L3IP

features/lwipstack/LWIPStack.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ class LWIP : public OnboardNetworkStack, private mbed::NonCopyable<LWIP> {
161161
static void netif_link_irq(struct netif *netif);
162162
static void netif_status_irq(struct netif *netif);
163163
static Interface *our_if_from_netif(struct netif *netif);
164+
static void delete_interface(OnboardNetworkStack::Interface **interface_out);
164165

165166
#if LWIP_ETHERNET
166167
static err_t emac_low_level_output(struct netif *netif, struct pbuf *p);
@@ -220,6 +221,8 @@ class LWIP : public OnboardNetworkStack, private mbed::NonCopyable<LWIP> {
220221
void *hw; /**< alternative implementation pointer - used for PPP */
221222
};
222223

224+
mbed_rtos_storage_semaphore_t remove_interface_sem;
225+
osSemaphoreId_t remove_interface;
223226
mbed_rtos_storage_semaphore_t linked_sem;
224227
osSemaphoreId_t linked;
225228
mbed_rtos_storage_semaphore_t unlinked_sem;
@@ -294,6 +297,14 @@ class LWIP : public OnboardNetworkStack, private mbed::NonCopyable<LWIP> {
294297
*/
295298
nsapi_error_t add_ppp_interface(PPP &ppp, bool default_if, OnboardNetworkStack::Interface **interface_out) override;
296299

300+
/** Remove a network interface from IP stack
301+
*
302+
* Removes layer 3 IP objects,network interface from stack list .
303+
* @param[out] interface_out pointer to stack interface object controlling the EMAC
304+
* @return NSAPI_ERROR_OK on success, or error code
305+
*/
306+
nsapi_error_t remove_ethernet_interface(OnboardNetworkStack::Interface **interface_out) override;
307+
297308
/** Remove a network interface from IP stack
298309
*
299310
* Removes PPP objects,network interface from stack list, and shutdown device driver.

features/netsocket/OnboardNetworkStack.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,11 @@ class OnboardNetworkStack : public NetworkStack {
171171
return NSAPI_ERROR_UNSUPPORTED;
172172
};
173173

174+
virtual nsapi_error_t remove_ethernet_interface(Interface **interface_out)
175+
{
176+
return NSAPI_ERROR_OK;
177+
};
178+
174179
virtual nsapi_error_t remove_l3ip_interface(Interface **interface_out)
175180
{
176181
return NSAPI_ERROR_OK;

features/netsocket/emac-drivers/TARGET_Cypress/COMPONENT_WHD/interface/WhdSTAInterface.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,15 @@ nsapi_error_t WhdSTAInterface::disconnect()
381381
}
382382
whd_emac_wifi_link_state_changed(_whd_emac.ifp, WHD_FALSE);
383383

384+
// remove the interface added in connect
385+
if (_interface) {
386+
nsapi_error_t err = _stack.remove_ethernet_interface(&_interface);
387+
if (err != NSAPI_ERROR_OK) {
388+
return err;
389+
}
390+
_iface_shared.iface_sta = NULL;
391+
}
392+
384393
res = whd_wifi_deregister_event_handler(_whd_emac.ifp, sta_link_update_entry);
385394
if (res != WHD_SUCCESS) {
386395
return whd_toerror(res);

features/netsocket/emac-drivers/TARGET_Cypress/COMPONENT_WHD/interface/WhdSoftAPInterface.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,15 @@ int WhdSoftAPInterface::stop(void)
201201
if (res != WHD_SUCCESS) {
202202
return whd_toerror(res);
203203
}
204+
205+
// remove the interface added in start
206+
if (_interface) {
207+
nsapi_error_t err = _stack.remove_ethernet_interface(&_interface);
208+
if (err != NSAPI_ERROR_OK) {
209+
return err;
210+
}
211+
_iface_shared.iface_softap = NULL;
212+
}
204213
return NSAPI_ERROR_OK;
205214
}
206215

0 commit comments

Comments
 (0)