// Get the self IP address UINT DCGetMyIp(DDNS_CLIENT *c, bool ipv6, char *dst, UINT dst_size, char *replace_v6) { UINT ret = ERR_INTERNAL_ERROR; ret = DCGetMyIpMain(c, ipv6, dst, dst_size, false, replace_v6); if (ret == ERR_NO_ERROR) { IP ip; if (StrToIP(&ip, dst)) { if (ipv6 == false && IsIP4(&ip)) { SetCurrentGlobalIP(&ip, false); } else if (ipv6 && IsIP6(&ip)) { SetCurrentGlobalIP(&ip, true); } } } return ret; }
// Update the IP address list of the host void IPsecWin7UpdateHostIPAddressList(IPSEC_WIN7 *w) { LIST *o; UINT i; BUF *buf; UINT retsize; // Validate arguments if (w == NULL) { return; } o = GetHostIPAddressList(); if (o == NULL) { return; } buf = NewBuf(); for (i = 0;i < LIST_NUM(o);i++) { IP *ip = LIST_DATA(o, i); WFP_LOCAL_IP a; Zero(&a, sizeof(a)); // Exclude any IPs or localhost IP if (IsZeroIP(ip) == false && IsLocalHostIP(ip) == false) { if (IsIP4(ip)) { a.IpVersion = 4; Copy(a.IpAddress.IPv4Address, ip->addr, 4); } else { a.IpVersion = 6; Copy(a.IpAddress.IPv6Address, ip->ipv6_addr, 16); } WriteBuf(buf, &a, sizeof(WFP_LOCAL_IP)); } } if (WriteFile(w->hDriverFile, buf->Buf, buf->Size, &retsize, NULL) == false) { Debug("WriteFile to the driver failed. %u\n", GetLastError()); } FreeHostIPAddressList(o); FreeBuf(buf); }
// Calculate the proper TCP MSS in EtherIP communication UINT CalcEtherIPTcpMss(ETHERIP_SERVER *s) { UINT ret = MTU_FOR_PPPOE; // Validate arguments if (s == NULL) { return 0; } // IPv4 / IPv6 if (IsIP4(&s->ClientIP)) { ret -= 20; } else { ret -= 40; } // IPsec UDP ret -= 8; // IPsec ESP ret -= 20; ret -= s->CryptBlockSize * 2; // IPsec Tunnel Mode IPv4 / IPv6 Header if (s->IsTunnelMode) { if (IsIP4(&s->ClientIP)) { ret -= 20; } else { ret -= 40; } } if (s->L2TPv3 == false) { // EtherIP ret -= 2; } else { // L2TPv3 ret -= 2; } // Ethernet ret -= 14; // IPv4 ret -= 20; // TCP ret -= 20; return ret; }