enhanced mio_equal_skads()
This commit is contained in:
parent
e73d822d0a
commit
f5f8b9e2b4
@ -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,12 +504,16 @@ 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);
|
||||
|
||||
if (data)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user