If a udp_pcb has a local_ip set, check if it is the same as the one of the netif used for sending to prevent sending from old addresses after a netif address gets changed (partly fixes bug #3168).

This commit is contained in:
goldsimon 2007-05-16 18:55:25 +00:00
parent a27dc1e908
commit 2740a81103
3 changed files with 19 additions and 4 deletions

View File

@ -158,6 +158,11 @@ HISTORY
++ Bug fixes:
2007-05-16 Simon Goldschmidt
* api_msg.c, udp.c: If a udp_pcb has a local_ip set, check if it is the same
as the one of the netif used for sending to prevent sending from old
addresses after a netif address gets changed (partly fixes bug #3168).
2007-05-16 Frédéric Bernon
* tcpip.c, igmp.h, igmp.c: Fixed bug "#19800 : IGMP: igmp_tick() will not work
with NO_SYS=1". Note that igmp_init is always in tcpip_thread (and not in

View File

@ -582,9 +582,9 @@ do_send(struct api_msg_msg *msg)
#if LWIP_RAW
case NETCONN_RAW:
if (msg->msg.b->addr==NULL) {
raw_send(msg->conn->pcb.raw, msg->msg.b->p);
msg->conn->err = raw_send(msg->conn->pcb.raw, msg->msg.b->p);
} else {
raw_sendto(msg->conn->pcb.raw, msg->msg.b->p, msg->msg.b->addr);
msg->conn->err = raw_sendto(msg->conn->pcb.raw, msg->msg.b->p, msg->msg.b->addr);
}
break;
#endif
@ -595,9 +595,9 @@ do_send(struct api_msg_msg *msg)
/* FALLTHROUGH */
case NETCONN_UDP:
if (msg->msg.b->addr==NULL) {
udp_send(msg->conn->pcb.udp, msg->msg.b->p);
msg->conn->err = udp_send(msg->conn->pcb.udp, msg->msg.b->p);
} else {
udp_sendto(msg->conn->pcb.udp, msg->msg.b->p, msg->msg.b->addr, msg->msg.b->port);
msg->conn->err = udp_sendto(msg->conn->pcb.udp, msg->msg.b->p, msg->msg.b->addr, msg->msg.b->port);
}
break;
#endif /* LWIP_UDP */

View File

@ -355,6 +355,16 @@ udp_send(struct udp_pcb *pcb, struct pbuf *p)
/* use outgoing network interface IP address as source address */
src_ip = &(netif->ip_addr);
} else {
/* check if UDP PCB local IP address is correct */
if (!ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))) {
if (q != p) {
/* free the header pbuf */
pbuf_free(q);
q = NULL;
/* p is still referenced by the caller, and will live on */
}
return ERR_VAL;
}
/* use UDP PCB local IP address as source address */
src_ip = &(pcb->local_ip);
}