mirror of
https://git.savannah.nongnu.org/git/lwip.git
synced 2026-08-10 09:33:44 +08:00
implemented API functions to access so_options of IP pcbs (UDP, TCP, RAW) (fixes bug #35061)
This commit is contained in:
@@ -680,7 +680,7 @@ dhcp_start(struct netif *netif)
|
||||
LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not obtain pcb\n"));
|
||||
return ERR_MEM;
|
||||
}
|
||||
dhcp->pcb->so_options |= SOF_BROADCAST;
|
||||
ip_set_option(dhcp->pcb, SOF_BROADCAST);
|
||||
/* set up local and remote port for the pcb */
|
||||
udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
|
||||
udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
|
||||
@@ -730,7 +730,7 @@ dhcp_inform(struct netif *netif)
|
||||
return;
|
||||
}
|
||||
dhcp.pcb = pcb;
|
||||
dhcp.pcb->so_options |= SOF_BROADCAST;
|
||||
ip_set_option(dhcp.pcb, SOF_BROADCAST);
|
||||
udp_bind(dhcp.pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
|
||||
LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_inform(): created new udp pcb\n"));
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ raw_input(struct pbuf *p, struct netif *inp)
|
||||
ipX_addr_cmp(PCB_ISIPV6(pcb), &(pcb->local_ip), ipX_current_dest_addr()))) {
|
||||
#if IP_SOF_BROADCAST_RECV
|
||||
/* broadcast filter? */
|
||||
if (((pcb->so_options & SOF_BROADCAST) || !ip_addr_isbroadcast(ip_current_dest_addr(), inp))
|
||||
if ((ip_get_option(pcb, SOF_BROADCAST) || !ip_addr_isbroadcast(ip_current_dest_addr(), inp))
|
||||
#if LWIP_IPV6
|
||||
&& !PCB_ISIPV6(pcb)
|
||||
#endif /* LWIP_IPV6 */
|
||||
@@ -279,7 +279,7 @@ raw_sendto(struct raw_pcb *pcb, struct pbuf *p, ip_addr_t *ipaddr)
|
||||
#endif /* LWIP_IPV6 */
|
||||
{
|
||||
/* broadcast filter? */
|
||||
if (((pcb->so_options & SOF_BROADCAST) == 0) && ip_addr_isbroadcast(ipaddr, netif)) {
|
||||
if (!ip_get_option(pcb, SOF_BROADCAST) && ip_addr_isbroadcast(ipaddr, netif)) {
|
||||
LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb));
|
||||
/* free any temporary header pbuf allocated by pbuf_header() */
|
||||
if (q != p) {
|
||||
|
||||
@@ -440,7 +440,7 @@ tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
|
||||
We do not dump TIME_WAIT pcb's; they can still be matched by incoming
|
||||
packets using both local and remote IP addresses and ports to distinguish.
|
||||
*/
|
||||
if ((pcb->so_options & SOF_REUSEADDR) != 0) {
|
||||
if (ip_get_option(pcb, SOF_REUSEADDR)) {
|
||||
max_pcb_list = NUM_TCP_PCB_LISTS_NO_TIME_WAIT;
|
||||
}
|
||||
#endif /* SO_REUSE */
|
||||
@@ -460,8 +460,8 @@ tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
|
||||
/* Omit checking for the same port if both pcbs have REUSEADDR set.
|
||||
For SO_REUSEADDR, the duplicate-check for a 5-tuple is done in
|
||||
tcp_connect. */
|
||||
if (((pcb->so_options & SOF_REUSEADDR) == 0) ||
|
||||
((cpcb->so_options & SOF_REUSEADDR) == 0))
|
||||
if (!ip_get_option(pcb, SOF_REUSEADDR) ||
|
||||
!ip_get_option(cpcb, SOF_REUSEADDR))
|
||||
#endif /* SO_REUSE */
|
||||
{
|
||||
/* @todo: check accept_any_ip_version */
|
||||
@@ -526,7 +526,7 @@ tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
|
||||
return pcb;
|
||||
}
|
||||
#if SO_REUSE
|
||||
if ((pcb->so_options & SOF_REUSEADDR) != 0) {
|
||||
if (ip_get_option(pcb, SOF_REUSEADDR)) {
|
||||
/* Since SOF_REUSEADDR allows reusing a local address before the pcb's usage
|
||||
is declared (listen-/connection-pcb), we have to make sure now that
|
||||
this port is only used once for every local IP. */
|
||||
@@ -550,7 +550,7 @@ tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
|
||||
lpcb->state = LISTEN;
|
||||
lpcb->prio = pcb->prio;
|
||||
lpcb->so_options = pcb->so_options;
|
||||
lpcb->so_options |= SOF_ACCEPTCONN;
|
||||
ip_set_option(lpcb, SOF_ACCEPTCONN);
|
||||
lpcb->ttl = pcb->ttl;
|
||||
lpcb->tos = pcb->tos;
|
||||
#if LWIP_IPV6
|
||||
@@ -745,7 +745,7 @@ tcp_connect(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port,
|
||||
}
|
||||
}
|
||||
#if SO_REUSE
|
||||
if ((pcb->so_options & SOF_REUSEADDR) != 0) {
|
||||
if (ip_get_option(pcb, SOF_REUSEADDR)) {
|
||||
/* Since SOF_REUSEADDR allows reusing a local address, we have to make sure
|
||||
now that the 5-tuple is unique. */
|
||||
struct tcp_pcb *cpcb;
|
||||
@@ -914,7 +914,7 @@ tcp_slowtmr_start:
|
||||
}
|
||||
|
||||
/* Check if KEEPALIVE should be sent */
|
||||
if((pcb->so_options & SOF_KEEPALIVE) &&
|
||||
if(ip_get_option(pcb, SOF_KEEPALIVE) &&
|
||||
((pcb->state == ESTABLISHED) ||
|
||||
(pcb->state == CLOSE_WAIT))) {
|
||||
if((u32_t)(tcp_ticks - pcb->tmr) >
|
||||
|
||||
@@ -260,7 +260,7 @@ udp_input(struct pbuf *p, struct netif *inp)
|
||||
ip_addr_ismulticast(ip_current_dest_addr()) ||
|
||||
#endif /* LWIP_IGMP */
|
||||
#if IP_SOF_BROADCAST_RECV
|
||||
(broadcast && (pcb->so_options & SOF_BROADCAST) &&
|
||||
(broadcast && ip_get_option(pcb, SOF_BROADCAST) &&
|
||||
(ipX_addr_isany(0, &pcb->local_ip) ||
|
||||
ip_addr_netcmp(ipX_2_ip(&pcb->local_ip), ip_current_dest_addr(), &inp->netmask))))))) {
|
||||
#else /* IP_SOF_BROADCAST_RECV */
|
||||
@@ -365,7 +365,7 @@ udp_input(struct pbuf *p, struct netif *inp)
|
||||
ip6_addr_ismulticast(ip6_current_dest_addr()) ||
|
||||
#endif /* LWIP_IPV6 */
|
||||
ip_addr_ismulticast(ip_current_dest_addr())) &&
|
||||
((pcb->so_options & SOF_REUSEADDR) != 0)) {
|
||||
ip_get_option(pcb, SOF_REUSEADDR)) {
|
||||
/* pass broadcast- or multicast packets to all multicast pcbs
|
||||
if SOF_REUSEADDR is set on the first match */
|
||||
struct udp_pcb *mpcb;
|
||||
@@ -389,7 +389,7 @@ udp_input(struct pbuf *p, struct netif *inp)
|
||||
ip_addr_ismulticast(ip_current_dest_addr()) ||
|
||||
#endif /* LWIP_IGMP */
|
||||
#if IP_SOF_BROADCAST_RECV
|
||||
(broadcast && (mpcb->so_options & SOF_BROADCAST)))))) {
|
||||
(broadcast && ip_get_option(mpcb, SOF_BROADCAST)))))) {
|
||||
#else /* IP_SOF_BROADCAST_RECV */
|
||||
(broadcast))))) {
|
||||
#endif /* IP_SOF_BROADCAST_RECV */
|
||||
@@ -632,7 +632,7 @@ udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *dst_ip,
|
||||
|
||||
#if IP_SOF_BROADCAST
|
||||
/* broadcast filter? */
|
||||
if ( ((pcb->so_options & SOF_BROADCAST) == 0) &&
|
||||
if (!ip_get_option(pcb, SOF_BROADCAST) &&
|
||||
#if LWIP_IPV6
|
||||
!PCB_ISIPV6(pcb) &&
|
||||
#endif /* LWIP_IPV6 */
|
||||
@@ -900,8 +900,8 @@ udp_bind(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
|
||||
PCB is alread bound to, unless *all* PCBs with that port have tha
|
||||
REUSEADDR flag set. */
|
||||
#if SO_REUSE
|
||||
else if (((pcb->so_options & SOF_REUSEADDR) == 0) &&
|
||||
((ipcb->so_options & SOF_REUSEADDR) == 0)) {
|
||||
else if (!ip_get_option(pcb, SOF_REUSEADDR) &&
|
||||
!ip_get_option(ipcb, SOF_REUSEADDR)) {
|
||||
#else /* SO_REUSE */
|
||||
/* port matches that of PCB in list and REUSEADDR not set -> reject */
|
||||
else {
|
||||
|
||||
Reference in New Issue
Block a user