enhanced mio_equal_skads()
This commit is contained in:
		@ -616,26 +616,32 @@ static void on_dnc_resolve(mio_svc_dnc_t* dnc, mio_dns_msg_t* reqmsg, mio_errnum
 | 
			
		||||
			{
 | 
			
		||||
				case MIO_DNS_RRT_A:
 | 
			
		||||
				{
 | 
			
		||||
					struct in6_addr ia;
 | 
			
		||||
					char buf[128];
 | 
			
		||||
					memcpy (&ia.s6_addr, brr->dptr, brr->dlen);
 | 
			
		||||
					printf ("^^^  GOT REPLY........................   %d ", brr->dlen);
 | 
			
		||||
					printf ("[%s]", inet_ntop(AF_INET6, &ia, buf, MIO_COUNTOF(buf)));
 | 
			
		||||
					struct in_addr ia;
 | 
			
		||||
					memcpy (&ia.s_addr, brr->dptr, brr->dlen);
 | 
			
		||||
					printf ("^^^  GOT REPLY A........................   %d ", brr->dlen);
 | 
			
		||||
					printf ("[%s]", inet_ntoa(ia));
 | 
			
		||||
					printf ("\n");
 | 
			
		||||
					goto done;
 | 
			
		||||
				}
 | 
			
		||||
				case MIO_DNS_RRT_AAAA:
 | 
			
		||||
				{
 | 
			
		||||
					struct in_addr ia;
 | 
			
		||||
					memcpy (&ia.s_addr, brr->dptr, brr->dlen);
 | 
			
		||||
					printf ("^^^  GOT REPLY........................   %d ", brr->dlen);
 | 
			
		||||
					printf ("[%s]", inet_ntoa(ia));
 | 
			
		||||
					struct in6_addr ia;
 | 
			
		||||
					char buf[128];
 | 
			
		||||
					memcpy (&ia.s6_addr, brr->dptr, brr->dlen);
 | 
			
		||||
					printf ("^^^  GOT REPLY AAAA........................   %d ", brr->dlen);
 | 
			
		||||
					printf ("[%s]", inet_ntop(AF_INET6, &ia, buf, MIO_COUNTOF(buf)));
 | 
			
		||||
					printf ("\n");
 | 
			
		||||
					goto done;
 | 
			
		||||
				}
 | 
			
		||||
				case MIO_DNS_RRT_CNAME:
 | 
			
		||||
					printf ("^^^  GOT REPLY.... CNAME [%s] %d\n", brr->dptr, (int)brr->dlen);
 | 
			
		||||
					goto done;
 | 
			
		||||
				case MIO_DNS_RRT_NS:
 | 
			
		||||
					printf ("^^^  GOT REPLY.... NS [%s] %d\n", brr->dptr, (int)brr->dlen);
 | 
			
		||||
					goto done;
 | 
			
		||||
				case MIO_DNS_RRT_PTR:
 | 
			
		||||
					printf ("^^^  GOT REPLY.... PTR [%s] %d\n", brr->dptr, (int)brr->dlen);
 | 
			
		||||
					goto done;
 | 
			
		||||
				default:
 | 
			
		||||
					goto no_valid_reply;
 | 
			
		||||
			}
 | 
			
		||||
@ -925,8 +931,11 @@ for (i = 0; i < 5; i++)
 | 
			
		||||
	reply_tmout.nsec = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	mio_bcstrtoskad (mio, "8.8.8.8:53", &servaddr);
 | 
			
		||||
	//mio_bcstrtoskad (mio, "8.8.8.8:53", &servaddr);
 | 
			
		||||
	mio_bcstrtoskad (mio, "[fe80::c7e2:bd6e:1209:ac1b]:1153", &servaddr);
 | 
			
		||||
	dnc = mio_svc_dnc_start (mio, &servaddr, MIO_NULL, &send_tmout, &reply_tmout, 2); /* option - send to all, send one by one */
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
	{
 | 
			
		||||
		mio_dns_bqr_t qrs[] = 
 | 
			
		||||
		{
 | 
			
		||||
@ -993,7 +1002,14 @@ for (i = 0; i < 5; i++)
 | 
			
		||||
		mio_svc_dnc_sendreq (dnc, &qhdr, &qrs[0], &qedns, MIO_NULL, 0);
 | 
			
		||||
		mio_svc_dnc_sendmsg (dnc, &rhdr, qrs, MIO_COUNTOF(qrs), rrs, MIO_COUNTOF(rrs), &qedns, MIO_NULL, 0);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
if (!mio_svc_dnc_resolve(dnc, "a.wild.com", MIO_DNS_RRT_A, 0, on_dnc_resolve, 0))
 | 
			
		||||
{
 | 
			
		||||
	printf ("resolve attempt failure ---> a.wild.com\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
if (!mio_svc_dnc_resolve(dnc, "www.microsoft.com", MIO_DNS_RRT_CNAME, 0, on_dnc_resolve, 0))
 | 
			
		||||
{
 | 
			
		||||
	printf ("resolve attempt failure ---> code.miflux.com\n");
 | 
			
		||||
@ -1015,6 +1031,7 @@ if (!mio_svc_dnc_resolve(dnc, "google.com", MIO_DNS_RRT_SOA, MIO_SVC_DNC_RESOLVE
 | 
			
		||||
{
 | 
			
		||||
	printf ("resolve attempt failure ---> code.miflux.com\n");
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	mio_loop (mio);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -244,7 +244,8 @@ static int dnc_on_read (mio_dev_sck_t* dev, const void* data, mio_iolen_t dlen,
 | 
			
		||||
	{
 | 
			
		||||
		mio_dns_pkt_t* reqpkt = mio_dns_msg_to_pkt(reqmsg);
 | 
			
		||||
		dnc_dns_msg_xtn_t* msgxtn = dnc_dns_msg_getxtn(reqmsg);
 | 
			
		||||
		if (dev == (mio_dev_sck_t*)msgxtn->dev && pkt->id == reqpkt->id && mio_equal_skads(&msgxtn->servaddr, srcaddr))
 | 
			
		||||
 | 
			
		||||
		if (dev == (mio_dev_sck_t*)msgxtn->dev && pkt->id == reqpkt->id && mio_equal_skads(&msgxtn->servaddr, srcaddr, 0))
 | 
			
		||||
		{
 | 
			
		||||
MIO_DEBUG1 (mio, "received dns response...id %d\n", id);
 | 
			
		||||
			if (MIO_LIKELY(msgxtn->on_reply))
 | 
			
		||||
@ -270,7 +271,7 @@ static void dnc_on_reply_timeout (mio_t* mio, const mio_ntime_t* now, mio_tmrjob
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (mio, msgxtn->rtmridx == MIO_TMRIDX_INVALID);
 | 
			
		||||
 | 
			
		||||
MIO_DEBUG0 (mio, "unable to receive dns response in time...\n");
 | 
			
		||||
MIO_DEBUG0 (mio, "*** TIMEOUT ==> unable to receive dns response in time...\n");
 | 
			
		||||
	if (msgxtn->rtries < msgxtn->rmaxtries)
 | 
			
		||||
	{
 | 
			
		||||
		mio_ntime_t* tmout;
 | 
			
		||||
@ -384,7 +385,20 @@ mio_svc_dnc_t* mio_svc_dnc_start (mio_t* mio, const mio_skad_t* serv_addr, const
 | 
			
		||||
	dnc->reply_tmout_max_tries = reply_tmout_max_tries;
 | 
			
		||||
 | 
			
		||||
	MIO_MEMSET (&mkinfo, 0, MIO_SIZEOF(mkinfo));
 | 
			
		||||
	mkinfo.type = MIO_DEV_SCK_UDP4; /* or UDP6 depending on the binding address */
 | 
			
		||||
	switch (mio_skad_family(serv_addr))
 | 
			
		||||
	{
 | 
			
		||||
		case MIO_AF_INET:
 | 
			
		||||
			mkinfo.type = MIO_DEV_SCK_UDP4;
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case MIO_AF_INET6:
 | 
			
		||||
			mkinfo.type = MIO_DEV_SCK_UDP6;
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			mio_seterrnum (mio, MIO_EINVAL);
 | 
			
		||||
			goto oops;
 | 
			
		||||
	}
 | 
			
		||||
	mkinfo.on_write = dnc_on_write;
 | 
			
		||||
	mkinfo.on_read = dnc_on_read;
 | 
			
		||||
	mkinfo.on_connect = dnc_on_connect;
 | 
			
		||||
@ -490,11 +504,15 @@ static void on_dnc_resolve (mio_svc_dnc_t* dnc, mio_dns_msg_t* reqmsg, mio_errnu
 | 
			
		||||
	mio_dns_pkt_info_t* pi = MIO_NULL;
 | 
			
		||||
	dnc_dns_msg_resolve_xtn_t* reqmsgxtn = dnc_dns_msg_resolve_getxtn(reqmsg);
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (mio, dlen >= MIO_SIZEOF(*pkt)); /* this is guaranteed by the dnc_on_read() */
 | 
			
		||||
	pkt = (mio_dns_pkt_t*)data;
 | 
			
		||||
	if (pkt->tc && (reqmsgxtn->flags & MIO_SVC_DNC_RESOLVE_FLAG_TCP_IF_TC)) /* truncated */
 | 
			
		||||
	if (data)
 | 
			
		||||
	{
 | 
			
		||||
		/* TODO: */
 | 
			
		||||
		MIO_ASSERT (mio, dlen >= MIO_SIZEOF(*pkt)); /* this is guaranteed by the dnc_on_read() */
 | 
			
		||||
 | 
			
		||||
		pkt = (mio_dns_pkt_t*)data;
 | 
			
		||||
		if (pkt->tc && (reqmsgxtn->flags & MIO_SVC_DNC_RESOLVE_FLAG_TCP_IF_TC)) /* truncated */
 | 
			
		||||
		{
 | 
			
		||||
			/* TODO: */
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!(reqmsgxtn->flags & MIO_SVC_DNC_RESOLVE_FLAG_BRIEF))
 | 
			
		||||
 | 
			
		||||
@ -175,7 +175,8 @@ MIO_EXPORT void mio_clear_skad (
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT int mio_equal_skads (
 | 
			
		||||
	const mio_skad_t* addr1,
 | 
			
		||||
	const mio_skad_t* addr2
 | 
			
		||||
	const mio_skad_t* addr2,
 | 
			
		||||
	int               strict
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
#if defined(__cplusplus)
 | 
			
		||||
 | 
			
		||||
@ -1237,7 +1237,7 @@ accept_done:
 | 
			
		||||
	clidev->orgdstaddr = rdev->localaddr;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if (!mio_equal_skads(&clidev->orgdstaddr, &clidev->localaddr))
 | 
			
		||||
	if (!mio_equal_skads(&clidev->orgdstaddr, &clidev->localaddr, 0))
 | 
			
		||||
	{
 | 
			
		||||
		clidev->state |= MIO_DEV_SCK_INTERCEPTED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -1438,9 +1438,42 @@ void mio_clear_skad (mio_skad_t* _skad)
 | 
			
		||||
	skad->sa.sa_family = MIO_AF_UNSPEC;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mio_equal_skads (const mio_skad_t* addr1, const mio_skad_t* addr2)
 | 
			
		||||
int mio_equal_skads (const mio_skad_t* addr1, const mio_skad_t* addr2, int strict)
 | 
			
		||||
{
 | 
			
		||||
	return mio_skad_family(addr1) == mio_skad_family(addr2) && 
 | 
			
		||||
	       mio_skad_size(addr1) == mio_skad_size(addr2) &&
 | 
			
		||||
	       MIO_MEMCMP(addr1, addr2, mio_skad_size(addr1)) == 0;
 | 
			
		||||
	int f1;
 | 
			
		||||
 | 
			
		||||
	if ((f1 = mio_skad_family(addr1)) != mio_skad_family(addr2) ||
 | 
			
		||||
	    mio_skad_size(addr1) != mio_skad_size(addr2)) return 0;
 | 
			
		||||
 | 
			
		||||
	switch (f1)
 | 
			
		||||
	{
 | 
			
		||||
		case AF_INET:
 | 
			
		||||
			return ((struct sockaddr_in*)addr1)->sin_addr.s_addr == ((struct sockaddr_in*)addr2)->sin_addr.s_addr &&
 | 
			
		||||
			       ((struct sockaddr_in*)addr1)->sin_port == ((struct sockaddr_in*)addr2)->sin_port;
 | 
			
		||||
 | 
			
		||||
	#if defined(AF_INET6)
 | 
			
		||||
		case AF_INET6:
 | 
			
		||||
			
 | 
			
		||||
			if (strict)
 | 
			
		||||
			{
 | 
			
		||||
				/* don't care about scope id */
 | 
			
		||||
				return MIO_MEMCMP(&((struct sockaddr_in6*)addr1)->sin6_addr, &((struct sockaddr_in6*)addr2)->sin6_addr, MIO_SIZEOF(((struct sockaddr_in6*)addr2)->sin6_addr)) == 0 &&
 | 
			
		||||
				       ((struct sockaddr_in6*)addr1)->sin6_port == ((struct sockaddr_in6*)addr2)->sin6_port &&
 | 
			
		||||
				       ((struct sockaddr_in6*)addr1)->sin6_scope_id == ((struct sockaddr_in6*)addr2)->sin6_scope_id;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				return MIO_MEMCMP(&((struct sockaddr_in6*)addr1)->sin6_addr, &((struct sockaddr_in6*)addr2)->sin6_addr, MIO_SIZEOF(((struct sockaddr_in6*)addr2)->sin6_addr)) == 0 &&
 | 
			
		||||
				       ((struct sockaddr_in6*)addr1)->sin6_port == ((struct sockaddr_in6*)addr2)->sin6_port;
 | 
			
		||||
			}
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	#if defined(AF_UNIX)
 | 
			
		||||
		case AF_UNIX:
 | 
			
		||||
			return mio_comp_bcstr(((struct sockaddr_un*)addr1)->sun_path, ((struct sockaddr_un*)addr2)->sun_path) == 0;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			return MIO_MEMCMP(addr1, addr2, mio_skad_size(addr1)) == 0;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user