From 2f5c3ce9591d112638d8f1617e8e77c836cfc257 Mon Sep 17 00:00:00 2001 From: Markus Stenberg Date: Sat, 3 May 2014 07:28:40 +0300 Subject: [PATCH] miniupnpd/pcpserver.c: Some IPv6 related work on PCP. --- miniupnpd/pcpserver.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/miniupnpd/pcpserver.c b/miniupnpd/pcpserver.c index 4cc32e9..749c73b 100644 --- a/miniupnpd/pcpserver.c +++ b/miniupnpd/pcpserver.c @@ -120,8 +120,8 @@ typedef struct pcp_info { uint8_t is_peer_op; const struct in6_addr *thirdp_ip; int pfailure_present; - char senderaddrstr[INET_ADDRSTRLEN]; /* only if IPv4 sender */ - + char senderaddrstr[48]; /* can be either IPv4 or IPv6 */ + struct in6_addr sender_ip; } pcp_info_t; @@ -1429,7 +1429,25 @@ int ProcessIncomingPCPPacket(int s, unsigned char *buff, int len, sizeof(pcp_msg_info.senderaddrstr))) { syslog(LOG_ERR, "inet_ntop(pcpserver): %m"); } + pcp_msg_info.sender_ip.s6_addr[11] = 0xff; + pcp_msg_info.sender_ip.s6_addr[10] = 0xff; + memcpy(pcp_msg_info.sender_ip.s6_addr+12, + &senderaddr_v4->sin_addr, 4); + } else if(senderaddr->sa_family == AF_INET6) { + const struct sockaddr_in6 * senderaddr_v6; + senderaddr_v6 = (const struct sockaddr_in6 *)senderaddr; + if(!inet_ntop(AF_INET6, &senderaddr_v6->sin6_addr, + pcp_msg_info.senderaddrstr, + sizeof(pcp_msg_info.senderaddrstr))) { + syslog(LOG_ERR, "inet_ntop(pcpserver): %m"); + } + pcp_msg_info.sender_ip = senderaddr_v6->sin6_addr; + } else { + syslog(LOG_WARNING, "unknown PCP packet sender address family %d", + senderaddr->sa_family); + return 0; } + if(sockaddr_to_string(senderaddr, addr_str, sizeof(addr_str))) syslog(LOG_DEBUG, "PCP request received from %s %dbytes", addr_str, len);