extern int sock_add(char * ifacename,int ifaceid, char * addr, int port, int thisifaceonly, int reuse) { SOCKET s; struct sockaddr_in6 bindme; struct ipv6_mreq ipmreq; int hops=1; char packedAddr[16]; char multiAddr[16] = { 0xff,2, 0,0, 0,0, 0,0, 0,0, 0,0, 0,1, 0,2}; inet_pton6(addr,packedAddr); if ((s=socket(AF_INET6,SOCK_DGRAM, 0)) == INVALID_SOCKET) return -2; memset(&bindme, 0, sizeof(bindme)); bindme.sin6_family = AF_INET6; bindme.sin6_port = htons(port); if (IN6_IS_ADDR_LINKLOCAL((IN6_ADDR*)packedAddr)) bindme.sin6_scope_id = ifaceid; if (!IN6_IS_ADDR_MULTICAST((IN6_ADDR*)packedAddr)) { inet_pton6(addr, (char*)&bindme.sin6_addr); } // REUSEADDR must be before bind() in order to take effect if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char*)&hops, sizeof(hops))) { error_message_set(WSAGetLastError()); return LOWLEVEL_ERROR_REUSE_FAILED; } if (bind(s, (struct sockaddr*)&bindme, sizeof(bindme))) { error_message_set(WSAGetLastError()); return LOWLEVEL_ERROR_BIND_FAILED; } if (IN6_IS_ADDR_MULTICAST((IN6_ADDR*)packedAddr)) { /* multicast */ ipmreq.ipv6mr_interface=ifaceid; memcpy(&ipmreq.ipv6mr_multiaddr,packedAddr,16); if(setsockopt(s,IPPROTO_IPV6,IPV6_ADD_MEMBERSHIP,(char*)&ipmreq,sizeof(ipmreq))) { error_message_set(WSAGetLastError()); return LOWLEVEL_ERROR_MCAST_MEMBERSHIP; } if(setsockopt(s,IPPROTO_IPV6,IPV6_MULTICAST_HOPS,(char*)&hops,sizeof(hops))) { error_message_set(WSAGetLastError()); return LOWLEVEL_ERROR_MCAST_HOPS; } } return s; }
void setup_test(struct test_case *cse, struct ip6_hdr *hdr, struct ieee154_frame_addr *frame) { uint32_t val; val = htonl(0x6 << 28 | ((cse->tc & 0xff) << 20) | (cse->fl & 0x000fffff)); hdr->ip6_flow = val; hdr->ip6_nxt = cse->nxt; hdr->ip6_plen = 0; hdr->ip6_hlim = cse->hlim; inet_pton6(cse->ip6_src, &hdr->ip6_src); inet_pton6(cse->ip6_dst, &hdr->ip6_dst); memset(frame, 0, sizeof(frame)); ieee154_parse(cse->l2src, &frame->ieee_src); ieee154_parse(cse->l2dst, &frame->ieee_dst); frame->ieee_dstpan = htole16(cse->panid); }
int uv_inet_pton(int af, const char* src, void* dst) { if (src == NULL || dst == NULL) return UV_EINVAL; switch (af) { case AF_INET: return (inet_pton4(src, dst)); case AF_INET6: { int len; char tmp[UV__INET6_ADDRSTRLEN], *s, *p; s = (char*) src; p = strchr(src, '%'); if (p != NULL) { s = tmp; len = p - src; if (len > UV__INET6_ADDRSTRLEN-1) return UV_EINVAL; memcpy(s, src, len); s[len] = '\0'; } return inet_pton6(s, dst); } default: return UV_EAFNOSUPPORT; } /* NOTREACHED */ }
void DNSUpdate::deletePTRRecordFromRRSet(){ DnsRR rr; const int bufSize = 128; char destination[16]; char result[bufSize]; memset(result, 0, bufSize); inet_pton6(hostip, destination); doRevDnsAddress(destination,result); rr.NAME = result; rr.TYPE = qtype_getcode("PTR", false); rr.CLASS = QCLASS_NONE; rr.TTL = 0; string tmp = string(_hostname); string data = rr_fromstring(rr.TYPE, tmp.c_str()); rr.RDLENGTH = data.size(); rr.RDATA = (unsigned char*)memdup(data.c_str(), rr.RDLENGTH); message->authority.push_back(rr); Log(Debug) << "DDNR: PTR record created: " << result << " -> " << tmp << LogEnd; Log(Debug) << "DDNS: PTR record created: " << result << " -> " << tmp << LogEnd; }
/* * returns: -1 - address not found, 0 - addr is ok, 1 - addr is tentative */ int is_addr_tentative(char * ifacename, int iface, char * addr) { char buf[256]; char packed1[16]; char packed2[16]; struct rtattr * rta_tb[IFA_MAX+1]; struct nlmsg_list *ainfo = NULL; struct nlmsg_list *head = NULL; struct rtnl_handle rth; int tentative = LOWLEVEL_TENTATIVE_DONT_KNOW; inet_pton6(addr,packed1); rtnl_open(&rth, 0); /* 2nd attribute: AF_UNSPEC, AF_INET, AF_INET6 */ /* rtnl_wilddump_request(&rth, AF_PACKET, RTM_GETLINK); */ rtnl_wilddump_request(&rth, AF_INET6, RTM_GETADDR); rtnl_dump_filter(&rth, store_nlmsg, &ainfo, NULL, NULL); head = ainfo; while (ainfo) { struct nlmsghdr *n = &ainfo->h; struct ifaddrmsg *ifa = NLMSG_DATA(n); memset(rta_tb, 0, sizeof(*rta_tb)); if (ifa->ifa_index == iface && ifa->ifa_family==AF_INET6) { parse_rtattr(rta_tb, IFA_MAX, IFA_RTA(ifa), n->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa))); if (!rta_tb[IFA_LOCAL]) rta_tb[IFA_LOCAL] = rta_tb[IFA_ADDRESS]; if (!rta_tb[IFA_ADDRESS]) rta_tb[IFA_ADDRESS] = rta_tb[IFA_LOCAL]; inet_ntop6(RTA_DATA(rta_tb[IFA_LOCAL]), buf /*, sizeof(buf)*/); memcpy(packed2,RTA_DATA(rta_tb[IFA_LOCAL]),16); /* print_packed(packed1); printf(" "); print_packed(packed2); printf("\n"); */ /* is this addr which are we looking for? */ if (!memcmp(packed1,packed2,16) ) { if (ifa->ifa_flags & IFA_F_TENTATIVE) tentative = LOWLEVEL_TENTATIVE_YES; else tentative = LOWLEVEL_TENTATIVE_NO; } } ainfo = ainfo->next; } /* now delete list */ while (head) { ainfo = head; head = head->next; free(ainfo); } rtnl_close(&rth); return tentative; }
int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(test_cases) / sizeof(test_cases[0])); i++) { struct in6_addr addr, correct; uint8_t buf[512]; uint8_t *rv; total++; inet_pton6(test_cases[i].address, &correct); printf("in6_addr: %s\n", test_cases[i].address); rv = unpack_multicast(&addr, test_cases[i].dispatch, test_cases[i].context, test_cases[i].buf); inet_ntop6(&addr, buf, 512); printf("result: %s length: %li\n", buf, rv - test_cases[i].buf); if (test_cases[i].len != rv - test_cases[i].buf) continue; if (memcmp(&addr, &correct, 16) != 0) continue; success++; } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; }
result_t net_base::isIPv6(exlib::string ip, bool& retVal) { result_t hr; retVal = true; const char* src = ip.c_str(); int len; char tmp[INET6_ADDRSTRLEN], *s, *p; unsigned char dst[sizeof(struct in6_addr)]; s = (char*)src; p = strchr(s, '%'); if (p != NULL) { s = tmp; len = (int32_t)(p - src); if (len > INET6_ADDRSTRLEN - 1) { retVal = false; return 0; } memcpy(s, src, len); s[len] = '\0'; } hr = inet_pton6(s, dst); if (hr != 0) retVal = false; return 0; }
int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(test_cases) / sizeof(test_cases[0])); i++) { uint8_t buf[512], *rb; struct in6_addr addr; uint8_t dispatch = 0; total ++; scribble(buf, 512); inet_pton6(test_cases[i].addr, &addr); printf("addr: %s\n", test_cases[i].addr); rb = pack_multicast(buf, &addr, &dispatch); print_buffer(buf, rb - buf); if (test_cases[i].result_len != (rb - buf)) continue; if (memcmp(test_cases[i].result, buf, rb - buf) != 0) continue; if (test_cases[i].result_dispatch != dispatch) continue; printf("SUCCESS!\n"); success++; } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; }
TIPv6Addr::TIPv6Addr(const char* addr, bool plain) { if (plain) { strncpy(Plain,addr, sizeof(Plain)); inet_pton6(Plain,Addr); } else { memcpy(Addr,addr,16); inet_ntop6(Addr,Plain); } }
int lowpan_extern_read_context(struct in6_addr *addr, int context) { struct in6_addr ctx; printf("read context: %i (%i)\n", context, prefix_options[context].pfx_len); inet_pton6(prefix_options[context].prefix, &ctx); print_buffer(ctx.s6_addr, 16); memcpy(addr->s6_addr, ctx.s6_addr, prefix_options[context].pfx_len / 8); return prefix_options[context].pfx_len; }
bool TClntIfaceMgr::sendMulticast(int iface, char * msg, int msgsize) { // prepare address char addr[16]; inet_pton6(ALL_DHCP_RELAY_AGENTS_AND_SERVERS,addr); SPtr<TIPv6Addr> multicastAddr = new TIPv6Addr(ALL_DHCP_RELAY_AGENTS_AND_SERVERS,true); return this->sendUnicast(iface, msg, msgsize, multicastAddr); }
int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(test_cases) / sizeof(test_cases[0])); i++) { struct in6_addr addr, correct; uint8_t buf[512]; char *rv; uint8_t *btr = test_cases[i].buf; size_t len = 32; int ret; uint8_t stateful; ieee154_addr_t l2addr; total++; inet_pton6(test_cases[i].address, &correct); ieee154_parse(test_cases[i].l2addr, &l2addr); ieee154_print(&l2addr, buf, 512); printf("%s\n", buf); printf("in6_addr: %s\n", test_cases[i].address); ret = unpack_address(&addr, test_cases[i].dispatch, test_cases[i].context, &btr, &len, &l2addr, test_cases[i].panid, &stateful); inet_ntop6(&addr, buf, 512); printf("result: %s length: %li\n", buf, 32 - len); if (test_cases[i].len != 32 - len) { printf("case %u: result len: %li expected: %i\n", i, 32 - len, test_cases[i].len); continue; } if (memcmp(&addr, &correct, 16) != 0) { printf("case %u: unexpected result\n", i); print_buffer(correct.s6_addr, 16); print_buffer(addr.s6_addr, 16); continue; } if (test_cases[i].stateful != stateful) { printf("case %u: stateful compression was used!\n", test_cases[i].stateful); continue; } success++; } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; }
int config_parse(const char *file, struct config *c) { char *buf, real_buf[BUF_LEN], arg[BUF_LEN]; FILE *fp = fopen(file, "r"); int gotargs = 0; if (fp == NULL) return 1; // defaults c->retries = BLIP_L2_RETRIES; while (fgets(real_buf, BUF_LEN, fp) != NULL) { buf = real_buf; rm_comment(buf); upd_start(&buf); if (sscanf(buf, "addr %s\n", arg) > 0) { inet_pton6(arg, &c->router_addr); gotargs ++; } else if (sscanf(buf, "proxy %s\n", c->proxy_dev) > 0) { gotargs ++; } else if (sscanf(buf, "channel %i\n", &c->channel) > 0) { if (c->channel < 11 || c->channel > 26) { fatal("Invalid channel specified in '%s'\n", file); exit(1); } gotargs ++; } else if (sscanf(buf, "log %s\n", arg) > 0) { int i; for (i = 0; i < 5; i++) { if (strncmp(log_names[i], arg, strlen(log_names[i])) == 0) { info("Read log level: %s\n", arg); log_setlevel(i); break; } } } else if (sscanf(buf, "retry %i\n", &c->retries) > 0) { if (c->retries <= 0 || c->retries > 25) { warn("retry value set to %i: outside of the recommended range (0,25]\n", c->retries); } } else if (*buf != '\0') { // anything else indicates that there's invalid input. return 1; } } fclose(fp); if (gotargs != 3) return 1; info("Read config from '%s'\r\n", file); if (strncmp(c->proxy_dev, "lo", 3) != 0) { info("Proxying neighbor advertisements to %s\r\n", c->proxy_dev); } info("Using channel %i\r\n", c->channel); info("Retries: %i\r\n", c->retries); lastconfig = c; return 0; }
int portable_pton(int af, char* src, void* dst) { switch (af) { case AF_INET: return (inet_pton4(src, dst)); case AF_INET6: return (inet_pton6(src, dst)); default: return EAFNOSUPPORT; } /* NOTREACHED */ }
/*% * convert from presentation format (which usually means ASCII printable) * to network format (which is usually some kind of binary format). * \return * 1 if the address was valid for the specified address family * 0 if the address wasn't valid (`dst' is untouched in this case) * -1 if some other error occurred (`dst' is untouched in this case, too) * \author * Paul Vixie, 1996. */ int isc_net_pton(int af, const char *src, void *dst) { switch (af) { case AF_INET: return (inet_pton4(src, dst)); case AF_INET6: return (inet_pton6(src, dst)); default: errno = EAFNOSUPPORT; return (-1); } /* NOTREACHED */ }
int sock_send(int fd, char * addr, char * buf, int buflen, int port,int iface) { struct addrinfo inforemote,*remote; char addrStr[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")+5]; char portStr[10]; int i; char packaddr[16]; char ifaceStr[10]; strcpy(addrStr,addr); itoa(port,portStr,10); itoa(iface,ifaceStr,10); inet_pton6(addrStr,packaddr); if(IN6_IS_ADDR_LINKLOCAL((struct in6_addr*)packaddr) ||IN6_IS_ADDR_SITELOCAL((struct in6_addr*)packaddr)) strcat(strcat(addrStr,"%"),ifaceStr); #if 0 /* if (IN6_IS_ADDR_MULTICAST((IN6_ADDR*)addr)) { ipmreq.ipv6mr_interface=4; memcpy(&ipmreq.ipv6mr_multiaddr,addr,16); if(setsockopt(fd,IPPROTO_IPV6,IPV6_ADD_MEMBERSHIP,(char*)&ipmreq,sizeof(ipmreq))) return -1; //WSAGetLastError(); //int hops=8; //if(setsockopt(fd,IPPROTO_IPV6,IPV6_MULTICAST_HOPS,(char*)&hops,sizeof(hops))) // return -1; //WSAGetLastError(); }*/ #endif memset(&inforemote, 0, sizeof(inforemote)); inforemote.ai_flags=AI_NUMERICHOST; inforemote.ai_family=PF_INET6; inforemote.ai_socktype=SOCK_DGRAM; inforemote.ai_protocol=IPPROTO_IPV6; //inet_ntop6(addr,addrStr); if(getaddrinfo(addrStr,portStr,&inforemote,&remote)) return 0; if (i=sendto(fd,buf,buflen,0,remote->ai_addr,remote->ai_addrlen)) { freeaddrinfo(remote); if (i<0) displayError(WSAGetLastError()); return 0; } /* if((setsockopt(fd,IPPROTO_IPV6,IPV6_DROP_MEMBERSHIP,(char*)&ipmreq,sizeof(ipmreq)))) return WSAGetLastError();*/ freeaddrinfo(remote); return i; }
int inet_pton(int af, const char *src, void *dst) { switch (af) { case AF_INET: return (inet_pton4(src, (unsigned char *)dst)); #ifdef ENABLE_IPV6 case AF_INET6: return (inet_pton6(src, (unsigned char *)dst)); #endif default: SET_ERRNO(EAFNOSUPPORT); return (-1); } /* NOTREACHED */ }
int os_inet_pton(int af, const char *src, void *dst) { switch (af) { case AF_INET: return (inet_pton4(src, (unsigned char *)dst)); case AF_INET6: return (inet_pton6(src, (unsigned char *)dst)); default: errno = WSAEAFNOSUPPORT; return (-1); } /* NOTREACHED */ }
/** inet_pton() replacement. * * Convert from presentation format in @a src (which usually means ASCII printable) * to network format in @a dst (which is usually some kind of binary format). * * @param af[in] address family * @param src[in] string containing address to convert * @param dst[out] return-value network address * (struct in_addr or struct in_addr6) * * @retval 1 if the address was valid for the specified address family * @retval 0 if the address wasn't valid (`dst' is untouched in this case) * @retval -1 if some other error occurred (`dst' is untouched in this case, too) * * @author Paul Vixie, 1996. * * @NEW_1_12_9 */ int su_inet_pton(int af, const char * src, void * dst) { switch (af) { case AF_INET: return (inet_pton4(src, dst)); #if HAVE_SIN6 case AF_INET6: return (inet_pton6(src, dst)); #endif default: su_seterrno(EAFNOSUPPORT); return (-1); } /* NOTREACHED */ }
/* int * isc_net_pton(af, src, dst) * convert from presentation format (which usually means ASCII printable) * to network format (which is usually some kind of binary format). * return: * 1 if the address was valid for the specified address family * 0 if the address wasn't valid (`dst' is untouched in this case) * author: * Paul Vixie, 1996. */ int inet_pton(int af, const char *src, void *dst) { switch ( af ) { case AF_INET: return(inet_pton4(src, (unsigned char *) dst)); #ifdef HAVE_IPV6 case AF_INET6: return(inet_pton6(src, (unsigned char *) dst)); #endif default: return 0; } /* NOTREACHED */ }
/* int * inet_pton(af, src, dst) * convert from presentation format (which usually means ASCII printable) * to network format (which is usually some kind of binary format). * return: * 1 if the address was valid for the specified address family * 0 if the address wasn't valid (`dst' is untouched in this case) * -1 if some other error occurred (`dst' is untouched in this case, too) * author: * Paul Vixie, 1996. */ int inet_pton(int af, const char *src, void *dst) { switch (af) { case AF_INET: return (inet_pton4(src, dst, 1)); #ifdef INET6 case AF_INET6: return (inet_pton6(src, dst)); #endif /* INET6 */ default: errno = EAFNOSUPPORT; return (-1); } /* NOTREACHED */ }
/* int * inet_pton(af, src, dst) * convert from presentation format (which usually means ASCII printable) * to network format (which is usually some kind of binary format). * return: * 1 if the address was valid for the specified address family * 0 if the address wasn't valid (`dst' is untouched in this case) * -1 if some other error occurred (`dst' is untouched in this case, too) * author: * Paul Vixie, 1996. */ SWITCH_DECLARE(int) switch_inet_pton(int af, const char *src, void *dst) { switch (af) { case AF_INET: return (inet_pton4(src, (unsigned char *) dst)); #ifdef ENABLE_IPV6 #ifndef AF_INET6 #define AF_INET6 (AF_MAX+1) /* just to let this compile */ #endif case AF_INET6: return (inet_pton6(src, (unsigned char *) dst)); #endif default: errno = EAFNOSUPPORT; return (-1); } /* NOTREACHED */ }
/* int * inet_pton(af, src, dst) * convert from presentation format (which usually means ASCII printable) * to network format (which is usually some kind of binary format). * return: * 1 if the address was valid for the specified address family * 0 if the address wasn't valid (`dst' is untouched in this case) * -1 if some other error occurred (`dst' is untouched in this case, too) * author: * Paul Vixie, 1996. */ int Curl_inet_pton(int af, const char *src, void *dst) { switch (af) { case AF_INET: return (inet_pton4(src, dst)); #ifdef ENABLE_IPV6 #ifndef AF_INET6 #define AF_INET6 AF_MAX+1 /* just to let this compile */ #endif case AF_INET6: return (inet_pton6(src, dst)); #endif default: errno = EAFNOSUPPORT; return (-1); } /* NOTREACHED */ }
int sock_send(int sock, char *addr, char *buf, int message_len, int port, int iface) { int result; struct sockaddr_in6 dst; memset(&dst, 0, sizeof (struct sockaddr_in6)); // dst.sin6_len = sizeof(struct sockaddr_in6); // field missing on Solaris 11 dst.sin6_family = PF_INET6; dst.sin6_port = htons(port); // htons? inet_pton6(addr,(char*)&dst.sin6_addr); dst.sin6_scope_id = iface; result = sendto(sock, buf, message_len, 0, (struct sockaddr*)&dst, sizeof(struct sockaddr_in6)); if (result < 0) { sprintf(Message, "Unable to send data (dst addr: %s), error=%d", addr, result); return LOWLEVEL_ERROR_SOCKET; } return LOWLEVEL_NO_ERROR; }
int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(test_cases) / sizeof(test_cases[0])); i++) { uint8_t flags; struct in6_addr addr; uint8_t buf[512], *rv; ieee154_addr_t l2addr; total++; inet_pton6(test_cases[i].in6_addr, &addr); ieee154_parse(test_cases[i].l2addr, &l2addr); ieee154_print(&l2addr, buf, 512); printf("%s\n", buf); printf("in6_addr: %s\n", test_cases[i].in6_addr); rv = pack_address(buf, &addr, test_cases[i].context_match_len, &l2addr, test_cases[i].panid, &flags); printf("flags: 0x%x(0x%x) len: %li\n", flags, test_cases[i].result_rv, rv - buf ); print_buffer(buf, rv - buf); if (test_cases[i].result_len != (rv - buf)) { printf("case %u: result len failed expected: %i got: %li\n", i, test_cases[i].result_len, (rv - buf)); continue; } if (test_cases[i].result_rv != flags) { printf("case %u: desired rv: 0x%x flags: %x\n", i, test_cases[i].result_rv, flags); continue; } if (memcmp(test_cases[i].result, buf, test_cases[i].result_len) != 0) { printf("case %u: buffers did not match\n", i); print_buffer(test_cases[i].result, test_cases[i].result_len); print_buffer(buf, test_cases[i].result_len); continue; } success++; } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; }
int ce_inet_pton(int af, const char *src, void *dst) { switch (af) { case AF_INET: return (inet_pton4(src, (unsigned char*)dst)); #if APR_HAVE_IPV6 case AF_INET6: return (inet_pton6(src, dst)); #endif default: errno = EAFNOSUPPORT; return (-1); } /* NOTREACHED */ }
extern int is_addr_tentative(char* ifacename, int iface, char* plainAddr) { char* buffer=NULL; struct sockaddr_in6 *addrpck; PIP_ADAPTER_ADDRESSES adaptaddr; PIP_ADAPTER_UNICAST_ADDRESS linkaddr; char netAddr[16]; unsigned long buflen=0; int retVal=-1; PIP_ADAPTER_UNICAST_ADDRESS found=NULL; inet_pton6(plainAddr,netAddr); GetAdaptersAddresses(AF_INET6,GAA_FLAG_SKIP_ANYCAST|GAA_FLAG_SKIP_MULTICAST |GAA_FLAG_SKIP_DNS_SERVER,NULL,(PIP_ADAPTER_ADDRESSES) buffer,&buflen); buffer=(char*)malloc(buflen); GetAdaptersAddresses(AF_INET6,GAA_FLAG_SKIP_ANYCAST|GAA_FLAG_SKIP_MULTICAST |GAA_FLAG_SKIP_DNS_SERVER,NULL,(PIP_ADAPTER_ADDRESSES) buffer,&buflen); adaptaddr=(PIP_ADAPTER_ADDRESSES) buffer; while(adaptaddr&&(!found)) { linkaddr=adaptaddr->FirstUnicastAddress; //for evert unicast address on iface while(linkaddr&&(!found)) { addrpck=(struct sockaddr_in6*)linkaddr->Address.lpSockaddr; if (!memcmp((struct in6_addr*)(&addrpck->sin6_addr),netAddr,16)) found=linkaddr; linkaddr=linkaddr->Next; } adaptaddr=adaptaddr->Next; } free(buffer); if (!found) return TENTATIVE_UNKNOWN; /* not found */ if (found->DadState==IpDadStateDuplicate) return TENTATIVE_YES; /* tentative */ else return TENTATIVE_NO; /* not tentative */ }
int sock_send(int fd, char * addr, char * buf, int buflen, int port,int iface) { ADDRINFO inforemote,*remote; char addrStr[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")+5]; char portStr[10]; int i; char packaddr[16]; char ifaceStr[10]; memset(addrStr, 0, sizeof(addrStr)); memset(portStr, 0, sizeof(portStr)); memset(packaddr, 0, sizeof(packaddr)); memset(ifaceStr, 0, sizeof(ifaceStr)); strcpy(addrStr,addr); itoa(port,portStr,10); itoa(iface,ifaceStr,10); inet_pton6(addrStr,packaddr); if(IN6_IS_ADDR_LINKLOCAL((struct in6_addr*)packaddr) ||IN6_IS_ADDR_SITELOCAL((struct in6_addr*)packaddr)) strcat(strcat(addrStr,"%"),ifaceStr); memset(&inforemote, 0, sizeof(inforemote)); inforemote.ai_flags=AI_NUMERICHOST; inforemote.ai_family=PF_INET6; inforemote.ai_socktype=SOCK_DGRAM; inforemote.ai_protocol=IPPROTO_IPV6; //inet_ntop6(addr,addrStr); if(getaddrinfo(addrStr,portStr,&inforemote,&remote)) return 0; i=sendto(fd,buf,buflen,0,remote->ai_addr,remote->ai_addrlen); freeaddrinfo(remote); if (i==SOCKET_ERROR) { error_message_set(WSAGetLastError()); return LOWLEVEL_ERROR_UNSPEC; } return LOWLEVEL_NO_ERROR; }
int do_ping (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { if (argc < 2) return -1; #ifdef UIP_CONF_IPV6 if (strcmp(argv[1], "-6") == 0) { uip_ipaddr_t DestIpv6; if (argc < 3) return -1; if (!inet_pton6(argv[2], (unsigned char*)&DestIpv6)) { printf("Invalid host address \n"); return -1; } if (!ping6(&DestIpv6)) { printf("ping failed; host %s is not alive\n", argv[2]); return 1; } printf("host %s is alive\n", argv[2]); return 0; } else { #endif NetPingIP = string_to_ip(argv[1]); if (NetPingIP == 0) { printf ("Usage:\n%s\n", cmdtp->usage); return -1; } if (NetLoop(PING) < 0) { printf("ping failed; host %s is not alive\n", argv[1]); return 1; } printf("host %s is alive\n", argv[1]); return 0; #ifdef UIP_CONF_IPV6 } #endif }
extern struct iface* if_list_get() { struct iface * head = NULL; struct iface * tmp; int pos; char * bufPtr; char buf[512]; char * name; char * tmpbuf; FILE *f; int result = spawnl(_P_WAIT,cmdPath,cmdPath,"/C",ipv6Path,"if",">",tmpFile,NULL); if (result<0) { printf("ERROR: unable to run ipv6.exe\n"); return NULL; } if ( ! (f=fopen(tmpFile,"r")) ) { printf("ERROR: unable to open %s file\n",tmpFile); return NULL; } while ( !feof(f)) { fgets(buf,511,f); // Interface 1 (site 1): my network interface if (strstr(buf,"Interface ")) { tmp = (struct iface*)malloc(sizeof(struct iface)); memset(tmp, 0, sizeof(struct iface)); tmp->next = head; memset(tmp->mac,0,255); tmp->maclen = 0; tmp->linkaddrcount = 0; tmp->hardwareType = 1; // other (ipifcons.h) tmp->flags = 0; head = tmp; printf(">>>%s",(buf+10)); tmp->id = atoi(buf+10); name = (strstr(buf+10,":")+2); name[ strlen(name)-1] = 0; sprintf(tmp->name,name); } // link-level address: 00-11-22-33-44-55 if (strstr(buf,"link-level address:")) { printf("###(%d)%s",strlen(buf+22),buf+22); if (strlen(buf+22)==18) { // ethernet tmp->hardwareType = 6; tmp->flags = IF_UP | IF_RUNNING | IF_MULTICAST; sscanf( (buf+22) ,"%2x-%2x-%2x-%2x-%2x-%2x", tmp->mac, tmp->mac+1, tmp->mac+2, tmp->mac+3, tmp->mac+4, tmp->mac+5); tmp->maclen=6; } else if (strlen(buf+22) > 7) { // tunnel 0.0.0.0 tmp->hardwareType = 131; // tunnel sscanf( (buf+22), "%3d.%3d.%3d.%3d", tmp->mac, tmp->mac+1, tmp->mac+2, tmp->mac+3); tmp->maclen = 4; } else if (strlen(buf+22) < 2) { // loopback "" tmp->hardwareType = 24; // loopback tmp->flags = IF_UP | IF_RUNNING | IF_LOOPBACK | IF_MULTICAST; tmp->maclen = 0; } else { tmp->hardwareType = 1; // unknown tmp->flags = IF_UP | IF_RUNNING | IF_MULTICAST; // uncomment this if you like cute defaults // tmp->hardwareType = 132; // coffee pot } } // link-local address if (strstr(buf,"fe80::")) { bufPtr = strstr(buf,","); if (bufPtr) *bufPtr = 0; //printf("ADDR=[%s]",strstr(buf,"fe80::")); fflush(stdout); pos = (tmp->linkaddrcount + 1)*16; //printf("Alokuje %d pamieci.\n",pos); tmpbuf = (char*) malloc( pos ); memcpy(tmpbuf,tmp->linkaddr, pos - 16); inet_pton6( strstr(buf,"fe80::"), tmpbuf + tmp->linkaddrcount*16); free(tmp->linkaddr); tmp->linkaddr = tmpbuf; tmp->linkaddrcount++; } } fclose(f); return tmp; }