mirror of
https://git.savannah.nongnu.org/git/lwip.git
synced 2025-08-07 15:04:39 +08:00
api_msg.c: Partly add support for IPv6 mapped IPv4 addresses
- lwip_netconn_do_getaddr(): Convert IPv4 addresses to IPv6 mapped IPv4 addresses - lwip_netconn_do_send(): Support IPv6 mapped IPv4 addresses - Not done: connect(), bind()
This commit is contained in:
parent
c1eb6d8aa4
commit
2f37dc0606
@ -43,6 +43,7 @@
|
|||||||
#include "lwip/priv/api_msg.h"
|
#include "lwip/priv/api_msg.h"
|
||||||
|
|
||||||
#include "lwip/ip.h"
|
#include "lwip/ip.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
#include "lwip/udp.h"
|
#include "lwip/udp.h"
|
||||||
#include "lwip/tcp.h"
|
#include "lwip/tcp.h"
|
||||||
#include "lwip/raw.h"
|
#include "lwip/raw.h"
|
||||||
@ -1397,10 +1398,18 @@ lwip_netconn_do_send(void *m)
|
|||||||
} else {
|
} else {
|
||||||
msg->err = ERR_CONN;
|
msg->err = ERR_CONN;
|
||||||
if (msg->conn->pcb.tcp != NULL) {
|
if (msg->conn->pcb.tcp != NULL) {
|
||||||
|
|
||||||
|
#if LWIP_IPV4 && LWIP_IPV6
|
||||||
|
/* Dual-stack: Unmap IPv6 mapped IPv4 addresses */
|
||||||
|
if(NETCONNTYPE_ISIPV6(netconn_type(msg->conn)) && IP_IS_V4_VAL(msg->msg.b->addr)) {
|
||||||
|
unmap_ipv6_mapped_ipv4(&msg->msg.b->addr, &msg->msg.b->addr);
|
||||||
|
}
|
||||||
|
#endif /* LWIP_IPV4 && LWIP_IPV6 */
|
||||||
|
|
||||||
switch (NETCONNTYPE_GROUP(msg->conn->type)) {
|
switch (NETCONNTYPE_GROUP(msg->conn->type)) {
|
||||||
#if LWIP_RAW
|
#if LWIP_RAW
|
||||||
case NETCONN_RAW:
|
case NETCONN_RAW:
|
||||||
if (ip_addr_isany(&msg->msg.b->addr)) {
|
if (ip_addr_isany(&msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) {
|
||||||
msg->err = raw_send(msg->conn->pcb.raw, msg->msg.b->p);
|
msg->err = raw_send(msg->conn->pcb.raw, msg->msg.b->p);
|
||||||
} else {
|
} else {
|
||||||
msg->err = raw_sendto(msg->conn->pcb.raw, msg->msg.b->p, &msg->msg.b->addr);
|
msg->err = raw_sendto(msg->conn->pcb.raw, msg->msg.b->p, &msg->msg.b->addr);
|
||||||
@ -1710,6 +1719,18 @@ lwip_netconn_do_getaddr(void *m)
|
|||||||
ip_addr_copy(API_EXPR_DEREF(msg->msg.ad.ipaddr),
|
ip_addr_copy(API_EXPR_DEREF(msg->msg.ad.ipaddr),
|
||||||
msg->conn->pcb.ip->remote_ip);
|
msg->conn->pcb.ip->remote_ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LWIP_IPV4 && LWIP_IPV6
|
||||||
|
/* Dual-stack: Map IPv4 addresses to IPv6 */
|
||||||
|
if(NETCONNTYPE_ISIPV6(netconn_type(msg->conn)) && IP_IS_V4_VAL(API_EXPR_DEREF(msg->msg.ad.ipaddr))) {
|
||||||
|
ip4_addr_t ip4;
|
||||||
|
|
||||||
|
ip4_addr_copy(ip4, *ip_2_ip4(&API_EXPR_DEREF(msg->msg.ad.ipaddr)));
|
||||||
|
ip4_2_ipv6_mapped_ipv4(ip_2_ip6(&API_EXPR_DEREF(msg->msg.ad.ipaddr)), &ip4);
|
||||||
|
IP_SET_TYPE_VAL(API_EXPR_DEREF(msg->msg.ad.ipaddr), IPADDR_TYPE_V6);
|
||||||
|
}
|
||||||
|
#endif /* LWIP_IPV4 && LWIP_IPV6 */
|
||||||
|
|
||||||
msg->err = ERR_OK;
|
msg->err = ERR_OK;
|
||||||
switch (NETCONNTYPE_GROUP(msg->conn->type)) {
|
switch (NETCONNTYPE_GROUP(msg->conn->type)) {
|
||||||
#if LWIP_RAW
|
#if LWIP_RAW
|
||||||
|
Loading…
x
Reference in New Issue
Block a user