示例#1
0
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);
}
示例#3
0
文件: inet.c 项目: Muraad/harmony
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 */
}
示例#4
0
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;

}
示例#5
0
/*
 * 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;
}
示例#7
0
文件: net.cpp 项目: asionius/fibjs
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;
}
示例#9
0
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;
}
示例#13
0
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;
}
示例#14
0
文件: inet.c 项目: Miyurz/SuperNET
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 */
}
示例#15
0
/*%
 *	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 */
}
示例#16
0
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;
}
示例#17
0
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 */
}
示例#18
0
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 */
}
示例#19
0
/** 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 */
}
示例#20
0
/* 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 */
}
示例#21
0
/* 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 */
}
示例#22
0
/* 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 */
}
示例#23
0
/* 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 */
}
示例#24
0
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;
}
示例#26
0
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 */
}
示例#27
0
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 */
}
示例#28
0
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;
}
示例#29
0
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    
}
示例#30
0
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;
}