From 880f1008d6a59aacc4829864d723107f10d52705 Mon Sep 17 00:00:00 2001 From: Dirk Ziegelmeier Date: Mon, 22 Feb 2016 13:03:51 +0100 Subject: [PATCH] Together with Simon: Eliminate last instances of isipv6 member in pcbs; Don't allow NULL pointers (IPv4 ANY) in connect() and sendto() functions as destinations since this does not make sense. --- src/api/api_msg.c | 5 +++-- src/core/tcp.c | 15 +++++++++++---- src/core/tcp_in.c | 7 ++----- src/core/udp.c | 29 ++++++++++++++++++----------- src/include/lwip/ip.h | 14 -------------- src/include/lwip/ip_addr.h | 2 +- 6 files changed, 35 insertions(+), 37 deletions(-) diff --git a/src/api/api_msg.c b/src/api/api_msg.c index 1d4c099b..198085f6 100644 --- a/src/api/api_msg.c +++ b/src/api/api_msg.c @@ -556,7 +556,8 @@ pcb_new(struct api_msg_msg *msg) #if LWIP_IPV4 && LWIP_IPV6 else { if (NETCONNTYPE_ISIPV6(msg->conn->type)) { - ip_set_v6(msg->conn->pcb.ip, 1); + IP_SET_TYPE_VAL(msg->conn->pcb.ip->local_ip, IPADDR_TYPE_V6); + IP_SET_TYPE_VAL(msg->conn->pcb.ip->remote_ip, IPADDR_TYPE_V6); } } #endif /* LWIP_IPV4 && LWIP_IPV6 */ @@ -1764,7 +1765,7 @@ lwip_netconn_do_join_leave_group(struct api_msg_msg *msg) if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) { #if LWIP_UDP #if LWIP_IPV6 && LWIP_IPV6_MLD - if (PCB_ISIPV6(msg->conn->pcb.udp)) { + if (NETCONNTYPE_ISIPV6(msg->conn->type)) { if (msg->msg.jl.join_or_leave == NETCONN_JOIN) { msg->err = mld6_joingroup(ip_2_ip6(API_EXPR_REF(msg->msg.jl.netif_addr)), ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr))); diff --git a/src/core/tcp.c b/src/core/tcp.c index dc172414..861e20aa 100644 --- a/src/core/tcp.c +++ b/src/core/tcp.c @@ -442,7 +442,15 @@ tcp_bind(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) int max_pcb_list = NUM_TCP_PCB_LISTS; struct tcp_pcb *cpcb; - if ((pcb == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr)) { +#if LWIP_IPV4 + /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */ + if (ipaddr == NULL) { + ipaddr = IP_ADDR_ANY; + } +#endif /* LWIP_IPV4 */ + + /* still need to check for ipaddr == NULL in IPv6 only case */ + if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr)) { return ERR_VAL; } @@ -566,8 +574,8 @@ tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog) lpcb->ttl = pcb->ttl; lpcb->tos = pcb->tos; #if LWIP_IPV4 && LWIP_IPV6 - PCB_ISIPV6(lpcb) = PCB_ISIPV6(pcb); lpcb->accept_any_ip_version = 0; + IP_SET_TYPE_VAL(lpcb->remote_ip, pcb->local_ip.type); #endif /* LWIP_IPV4 && LWIP_IPV6 */ ip_addr_copy(lpcb->local_ip, pcb->local_ip); if (pcb->local_port != 0) { @@ -748,7 +756,7 @@ tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port, u32_t iss; u16_t old_local_port; - if ((pcb == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr)) { + if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr)) { return ERR_VAL; } @@ -1545,7 +1553,6 @@ tcp_new_ip6(void) struct tcp_pcb * pcb; pcb = tcp_alloc(TCP_PRIO_NORMAL); #if LWIP_IPV4 - ip_set_v6(pcb, 1); IP_SET_TYPE_VAL(pcb->local_ip, IPADDR_TYPE_V6); IP_SET_TYPE_VAL(pcb->remote_ip, IPADDR_TYPE_V6); #endif /* LWIP_IPV4 */ diff --git a/src/core/tcp_in.c b/src/core/tcp_in.c index ae43fd2b..b719435b 100644 --- a/src/core/tcp_in.c +++ b/src/core/tcp_in.c @@ -569,9 +569,6 @@ tcp_listen_input(struct tcp_pcb_listen *pcb) pcb->accepts_pending++; #endif /* TCP_LISTEN_BACKLOG */ /* Set up the new PCB. */ -#if LWIP_IPV4 && LWIP_IPV6 - PCB_ISIPV6(npcb) = ip_current_is_v6(); -#endif /* LWIP_IPV4 && LWIP_IPV6 */ ip_addr_copy(npcb->local_ip, *ip_current_dest_addr()); ip_addr_copy(npcb->remote_ip, *ip_current_src_addr()); npcb->local_port = pcb->local_port; @@ -1151,7 +1148,7 @@ tcp_receive(struct tcp_pcb *pcb) pcb->polltmr = 0; #if LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS - if (PCB_ISIPV6(pcb)) { + if (ip_current_is_v6()) { /* Inform neighbor reachability of forward progress. */ nd6_reachability_hint(ip6_current_src_addr()); } @@ -1485,7 +1482,7 @@ tcp_receive(struct tcp_pcb *pcb) tcp_ack(pcb); #if LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS - if (PCB_ISIPV6(pcb)) { + if (ip_current_is_v6()) { /* Inform neighbor reachability of forward progress. */ nd6_reachability_hint(ip6_current_src_addr()); } diff --git a/src/core/udp.c b/src/core/udp.c index f1baccba..7327e6d9 100644 --- a/src/core/udp.c +++ b/src/core/udp.c @@ -244,7 +244,7 @@ udp_input(struct pbuf *p, struct netif *inp) if (pcb->local_port == dest) { if ( #if LWIP_IPV6 - (PCB_ISIPV6(pcb) && (ip_current_is_v6()) && + (IP_IS_V6_VAL(pcb->local_ip) && ip_current_is_v6() && (ip6_addr_isany(ip_2_ip6(&pcb->local_ip)) || #if LWIP_IPV6_MLD ip6_addr_ismulticast(ip6_current_dest_addr()) || @@ -252,7 +252,7 @@ udp_input(struct pbuf *p, struct netif *inp) ip6_addr_cmp(ip_2_ip6(&pcb->local_ip), ip6_current_dest_addr()))) #endif /* LWIP_IPV6 */ #if LWIP_IPV4 && LWIP_IPV6 - || (!PCB_ISIPV6(pcb) && + || (!IP_IS_V6_VAL(pcb->local_ip) && (ip4_current_header() != NULL) && #endif /* LWIP_IPV4 && LWIP_IPV6 */ #if LWIP_IPV4 @@ -393,10 +393,10 @@ udp_input(struct pbuf *p, struct netif *inp) /* compare PCB local addr+port to UDP destination addr+port */ if ((mpcb->local_port == dest) && #if LWIP_IPV6 - ((PCB_ISIPV6(mpcb) && + ((IP_IS_V6_VAL(mpcb->local_ip) && (ip6_addr_ismulticast(ip6_current_dest_addr()) || ip6_addr_cmp(ip_2_ip6(&mpcb->local_ip), ip6_current_dest_addr()))) || - (!PCB_ISIPV6(mpcb) && + (!IP_IS_V6_VAL(mpcb->local_ip) && #else /* LWIP_IPV6 */ (( #endif /* LWIP_IPV6 */ @@ -571,7 +571,7 @@ udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, struct netif *netif; const ip_addr_t *dst_ip_route = dst_ip; - if ((pcb == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) { + if ((pcb == NULL) || (dst_ip == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) { return ERR_VAL; } @@ -654,7 +654,7 @@ udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_i #endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */ const ip_addr_t *src_ip; - if ((pcb == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) { + if ((pcb == NULL) || (dst_ip == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) { return ERR_VAL; } @@ -724,7 +724,7 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d u8_t ip_proto; u8_t ttl; - if ((pcb == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, src_ip) || + if ((pcb == NULL) || (dst_ip == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, src_ip) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) { return ERR_VAL; } @@ -929,7 +929,15 @@ udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) struct udp_pcb *ipcb; u8_t rebind; - if ((pcb == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr)) { +#if LWIP_IPV4 + /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */ + if (ipaddr == NULL) { + ipaddr = IP_ADDR_ANY; + } +#endif /* LWIP_IPV4 */ + + /* still need to check for ipaddr == NULL in IPv6 only case */ + if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr)) { return ERR_VAL; } @@ -1020,7 +1028,7 @@ udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) { struct udp_pcb *ipcb; - if ((pcb == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr)) { + if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr)) { return ERR_VAL; } @@ -1062,7 +1070,7 @@ void udp_disconnect(struct udp_pcb *pcb) { /* reset remote address association */ - ip_addr_set_any(PCB_ISIPV6(pcb), &pcb->remote_ip); + ip_addr_set_any(IP_IS_V6_VAL(pcb->remote_ip), &pcb->remote_ip); pcb->remote_port = 0; /* mark PCB as unconnected */ pcb->flags &= ~UDP_FLAGS_CONNECTED; @@ -1160,7 +1168,6 @@ udp_new_ip6(void) struct udp_pcb *pcb; pcb = udp_new(); #if LWIP_IPV4 - ip_set_v6(pcb, 1); IP_SET_TYPE_VAL(pcb->local_ip, IPADDR_TYPE_V6); IP_SET_TYPE_VAL(pcb->remote_ip, IPADDR_TYPE_V6); #endif /* LWIP_IPV4 */ diff --git a/src/include/lwip/ip.h b/src/include/lwip/ip.h index 6167227c..82fd657c 100644 --- a/src/include/lwip/ip.h +++ b/src/include/lwip/ip.h @@ -75,20 +75,11 @@ extern "C" { #define IP_PCB_ADDRHINT #endif /* LWIP_NETIF_HWADDRHINT */ -#if LWIP_IPV6 && LWIP_IPV4 -#define IP_PCB_ISIPV6_MEMBER u8_t isipv6; -#define PCB_ISIPV6(pcb) ((pcb)->isipv6) -#else -#define IP_PCB_ISIPV6_MEMBER -#define PCB_ISIPV6(pcb) LWIP_IPV6 -#endif /* LWIP_IPV6 */ - /* This is the common part of all PCB types. It needs to be at the beginning of a PCB type definition. It is located here so that changes to this common part are made in one location instead of having to change all PCB structs. */ #define IP_PCB \ - IP_PCB_ISIPV6_MEMBER \ /* ip addresses in network byte order */ \ ip_addr_t local_ip; \ ip_addr_t remote_ip; \ @@ -180,11 +171,6 @@ extern struct ip_globals ip_data; #define ip_next_header_ptr() ((const void*)((ip_current_is_v6() ? \ (const u8_t*)ip6_current_header() : (const u8_t*)ip4_current_header()) + ip_current_header_tot_len())) -/** Set an IP_PCB to IPv6 (IPv4 is the default) */ -#define ip_set_v6(pcb, val) do{if(pcb != NULL) { pcb->isipv6 = val; \ - IP_SET_TYPE(&(pcb)->local_ip, (val)?IPADDR_TYPE_V6:IPADDR_TYPE_V4); \ - IP_SET_TYPE(&(pcb)->remote_ip, (val)?IPADDR_TYPE_V6:IPADDR_TYPE_V4); }}while(0) - /** Source IP4 address of current_header */ #define ip4_current_src_addr() (ip_2_ip4(&ip_data.current_iphdr_src)) /** Destination IP4 address of current_header */ diff --git a/src/include/lwip/ip_addr.h b/src/include/lwip/ip_addr.h index d1143bbd..99a7c170 100644 --- a/src/include/lwip/ip_addr.h +++ b/src/include/lwip/ip_addr.h @@ -66,7 +66,7 @@ typedef struct _ip_addr { #define IP_SET_TYPE_VAL(ipaddr, iptype) do { (ipaddr).type = (iptype); }while(0) #define IP_SET_TYPE(ipaddr, iptype) do { if((ipaddr) != NULL) { IP_SET_TYPE_VAL(*(ipaddr), iptype); }}while(0) -#define IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr) (PCB_ISIPV6(pcb) == IP_IS_V6(ipaddr)) +#define IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr) (IP_IS_V6_VAL(pcb->local_ip) == IP_IS_V6(ipaddr)) /* Convert generic ip address to specific protocol version */ #define ip_2_ip6(ipaddr) (&((ipaddr)->u_addr.ip6))