enhanced mio_equal_skads()

This commit is contained in:
hyung-hwan 2020-02-20 10:07:12 +00:00
parent e73d822d0a
commit f5f8b9e2b4
5 changed files with 92 additions and 23 deletions

View File

@ -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: case MIO_DNS_RRT_A:
{ {
struct in6_addr ia; struct in_addr ia;
char buf[128]; memcpy (&ia.s_addr, brr->dptr, brr->dlen);
memcpy (&ia.s6_addr, brr->dptr, brr->dlen); printf ("^^^ GOT REPLY A........................ %d ", brr->dlen);
printf ("^^^ GOT REPLY........................ %d ", brr->dlen); printf ("[%s]", inet_ntoa(ia));
printf ("[%s]", inet_ntop(AF_INET6, &ia, buf, MIO_COUNTOF(buf)));
printf ("\n"); printf ("\n");
goto done; goto done;
} }
case MIO_DNS_RRT_AAAA: case MIO_DNS_RRT_AAAA:
{ {
struct in_addr ia; struct in6_addr ia;
memcpy (&ia.s_addr, brr->dptr, brr->dlen); char buf[128];
printf ("^^^ GOT REPLY........................ %d ", brr->dlen); memcpy (&ia.s6_addr, brr->dptr, brr->dlen);
printf ("[%s]", inet_ntoa(ia)); printf ("^^^ GOT REPLY AAAA........................ %d ", brr->dlen);
printf ("[%s]", inet_ntop(AF_INET6, &ia, buf, MIO_COUNTOF(buf)));
printf ("\n"); printf ("\n");
goto done; goto done;
} }
case MIO_DNS_RRT_CNAME: case MIO_DNS_RRT_CNAME:
printf ("^^^ GOT REPLY.... CNAME [%s] %d\n", brr->dptr, (int)brr->dlen); printf ("^^^ GOT REPLY.... CNAME [%s] %d\n", brr->dptr, (int)brr->dlen);
goto done; 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: default:
goto no_valid_reply; goto no_valid_reply;
} }
@ -925,8 +931,11 @@ for (i = 0; i < 5; i++)
reply_tmout.nsec = 0; 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 */ 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[] = 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_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); 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)) 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"); 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"); printf ("resolve attempt failure ---> code.miflux.com\n");
} }
#endif
mio_loop (mio); mio_loop (mio);

View File

@ -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); mio_dns_pkt_t* reqpkt = mio_dns_msg_to_pkt(reqmsg);
dnc_dns_msg_xtn_t* msgxtn = dnc_dns_msg_getxtn(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); MIO_DEBUG1 (mio, "received dns response...id %d\n", id);
if (MIO_LIKELY(msgxtn->on_reply)) 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_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) if (msgxtn->rtries < msgxtn->rmaxtries)
{ {
mio_ntime_t* tmout; 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; dnc->reply_tmout_max_tries = reply_tmout_max_tries;
MIO_MEMSET (&mkinfo, 0, MIO_SIZEOF(mkinfo)); 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_write = dnc_on_write;
mkinfo.on_read = dnc_on_read; mkinfo.on_read = dnc_on_read;
mkinfo.on_connect = dnc_on_connect; 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; mio_dns_pkt_info_t* pi = MIO_NULL;
dnc_dns_msg_resolve_xtn_t* reqmsgxtn = dnc_dns_msg_resolve_getxtn(reqmsg); 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() */ MIO_ASSERT (mio, dlen >= MIO_SIZEOF(*pkt)); /* this is guaranteed by the dnc_on_read() */
pkt = (mio_dns_pkt_t*)data; pkt = (mio_dns_pkt_t*)data;
if (pkt->tc && (reqmsgxtn->flags & MIO_SVC_DNC_RESOLVE_FLAG_TCP_IF_TC)) /* truncated */ if (pkt->tc && (reqmsgxtn->flags & MIO_SVC_DNC_RESOLVE_FLAG_TCP_IF_TC)) /* truncated */
{ {
/* TODO: */ /* TODO: */
} }
}
if (!(reqmsgxtn->flags & MIO_SVC_DNC_RESOLVE_FLAG_BRIEF)) if (!(reqmsgxtn->flags & MIO_SVC_DNC_RESOLVE_FLAG_BRIEF))
{ {

View File

@ -175,7 +175,8 @@ MIO_EXPORT void mio_clear_skad (
MIO_EXPORT int mio_equal_skads ( MIO_EXPORT int mio_equal_skads (
const mio_skad_t* addr1, const mio_skad_t* addr1,
const mio_skad_t* addr2 const mio_skad_t* addr2,
int strict
); );
#if defined(__cplusplus) #if defined(__cplusplus)

View File

@ -1237,7 +1237,7 @@ accept_done:
clidev->orgdstaddr = rdev->localaddr; clidev->orgdstaddr = rdev->localaddr;
#endif #endif
if (!mio_equal_skads(&clidev->orgdstaddr, &clidev->localaddr)) if (!mio_equal_skads(&clidev->orgdstaddr, &clidev->localaddr, 0))
{ {
clidev->state |= MIO_DEV_SCK_INTERCEPTED; clidev->state |= MIO_DEV_SCK_INTERCEPTED;
} }

View File

@ -1438,9 +1438,42 @@ void mio_clear_skad (mio_skad_t* _skad)
skad->sa.sa_family = MIO_AF_UNSPEC; 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) && int f1;
mio_skad_size(addr1) == mio_skad_size(addr2) &&
MIO_MEMCMP(addr1, addr2, mio_skad_size(addr1)) == 0; 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;
}
} }