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:
|
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);
|
||||||
|
|
||||||
|
@ -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,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;
|
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);
|
||||||
|
|
||||||
MIO_ASSERT (mio, dlen >= MIO_SIZEOF(*pkt)); /* this is guaranteed by the dnc_on_read() */
|
if (data)
|
||||||
pkt = (mio_dns_pkt_t*)data;
|
|
||||||
if (pkt->tc && (reqmsgxtn->flags & MIO_SVC_DNC_RESOLVE_FLAG_TCP_IF_TC)) /* truncated */
|
|
||||||
{
|
{
|
||||||
/* 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))
|
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 (
|
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)
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user