35 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) 50 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
58 vec_free (ep->pending_requests);
81 return VNET_API_ERROR_NO_NAME_SERVERS;
102 if (n_vlib_mains > 1)
122 vl_api_dns_enable_disable_reply_t *rmp;
133 u8 * server_address_as_u8,
int is_add)
149 clib_memcpy (ap, server_address_as_u8,
sizeof (*ap));
162 return VNET_API_ERROR_NAME_SERVER_NOT_FOUND;
169 u8 * server_address_as_u8,
int is_add)
185 clib_memcpy (ap, server_address_as_u8,
sizeof (*ap));
198 return VNET_API_ERROR_NAME_SERVER_NOT_FOUND;
207 vl_api_dns_name_server_add_del_reply_t *rmp;
215 REPLY_MACRO (VL_API_DNS_NAME_SERVER_ADD_DEL_REPLY);
247 if (fib_index == (
u32) ~ 0)
264 if (sw_if_index == ~0)
267 (
"route to %U exists, fei %d, get_resolving_interface returned" 276 goto found_src_address;
294 VLIB_BUFFER_TOTAL_LENGTH_VALID | VNET_BUFFER_F_LOCALLY_ORIGINATED;
303 dns_request = (
u8 *) (udp + 1);
315 udp->
src_port = clib_host_to_net_u16 (UDP_DST_PORT_dns_reply);
316 udp->
dst_port = clib_host_to_net_u16 (UDP_DST_PORT_dns);
354 int junk __attribute__ ((unused));
364 if (fib_index == (
u32) ~ 0)
384 goto found_src_address;
402 VLIB_BUFFER_TOTAL_LENGTH_VALID | VNET_BUFFER_F_LOCALLY_ORIGINATED;
409 dns_request = (
u8 *) (udp + 1);
413 clib_host_to_net_u32 (0x6 << 28);
424 udp->
src_port = clib_host_to_net_u16 (UDP_DST_PORT_dns_reply);
425 udp->
dst_port = clib_host_to_net_u16 (UDP_DST_PORT_dns);
451 int last_label_index;
458 last_label_index = 0;
465 rv[last_label_index] = (i - last_label_index) - 1;
466 if ((i - last_label_index) > 63)
468 i - last_label_index);
469 last_label_index =
i;
475 rv[last_label_index] = (i - last_label_index) - 1;
498 *parse_from_here = 0;
501 if ((label[0] & 0xC0) == 0xC0)
503 *parse_from_here = label + 2;
504 offset = ((label[0] & 0x3f) << 8) + label[1];
505 label = full_text +
offset;
512 for (i = 0; i <
len; i++)
516 if ((label[0] & 0xC0) == 0xC0)
518 *parse_from_here = label + 2;
519 offset = ((label[0] & 0x3f) << 8) + label[1];
520 label = full_text +
offset;
527 if (*parse_from_here == 0)
528 *parse_from_here = label;
565 vec_validate (request, 2 * qp_offset + 2 *
sizeof (dns_query_t) - 1);
567 qp = (dns_query_t *) (request + qp_offset);
569 qp->type = clib_host_to_net_u16 (DNS_TYPE_A);
573 qp = (dns_query_t *) (((
u8 *) qp) +
vec_len (name_copy));
576 qp->type = clib_host_to_net_u16 (DNS_TYPE_AAAA);
580 vec_insert (request,
sizeof (dns_header_t), 0);
582 h = (dns_header_t *) request;
585 h->id = clib_host_to_net_u16 (ep - dm->
entries);
589 h->flags = clib_host_to_net_u16 (tmp);
590 h->qdcount = clib_host_to_net_u16 (2);
662 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
665 return VNET_API_ERROR_NO_SUCH_ENTRY;
676 clib_warning (
"pool elt %d supposedly pending, but not found...",
696 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
703 return VNET_API_ERROR_NO_SUCH_ENTRY;
716 u32 victim_index, start_index,
i;
721 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
729 return VNET_API_ERROR_UNSPECIFIED;
736 for (i = 0; i < limit; i++)
738 victim_index = (start_index +
i) % limit;
756 return VNET_API_ERROR_UNSPECIFIED;
767 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
774 return VNET_API_ERROR_ENTRY_ALREADY_EXISTS;
830 u32 *indices_to_delete = 0;
853 for (i = 0; i <
vec_len (indices_to_delete); i++)
859 indices_to_delete[i]);
864 (dm, indices_to_delete[i]);
888 memcpy (pr, t,
sizeof (*pr));
946 #define foreach_notification_to_move \ 973 h = (dns_header_t *) reply;
974 flags = clib_net_to_host_u16 (h->flags);
991 curpos = (
u8 *) (h + 1);
996 for (i = 0; i < clib_net_to_host_u16 (h->qdcount); i++)
1003 pos +=
sizeof (dns_query_t);
1007 if ((pos2[0] & 0xC0) == 0xC0)
1013 for (i = 0; i < clib_net_to_host_u16 (h->anscount); i++)
1015 rr = (dns_rr_t *) pos;
1016 switch (clib_net_to_host_u16 (rr->type))
1027 case DNS_TYPE_CNAME:
1035 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1037 if ((pos2[0] & 0xc0) == 0xc0)
1044 flags &= ~DNS_RCODE_MASK;
1046 h->flags = clib_host_to_net_u16 (flags);
1058 goto found_last_request;
1060 clib_warning (
"pool elt %d supposedly pending, but not found...", ep_index);
1068 _vec_len (cname) -= 1;
1087 _vec_len (next_ep->
name) -= 1;
1097 #define _(a) next_ep->a = ep->a; ep->a = 0; 1102 name_copy =
vec_dup (request);
1104 qp_offset =
vec_len (request);
1107 vec_validate (request, 2 * qp_offset + 2 *
sizeof (dns_query_t) - 1);
1109 qp = (dns_query_t *) (request + qp_offset);
1111 qp->type = clib_host_to_net_u16 (DNS_TYPE_A);
1114 qp = (dns_query_t *) (((
u8 *) qp) +
vec_len (name_copy));
1117 qp->type = clib_host_to_net_u16 (DNS_TYPE_AAAA);
1121 vec_insert (request,
sizeof (dns_header_t), 0);
1123 h = (dns_header_t *) request;
1126 h->id = clib_host_to_net_u16 (next_ep - dm->
entries);
1130 h->qdcount = clib_host_to_net_u16 (2);
1158 u8 *curpos, *pos, *pos2;
1164 h = (dns_header_t *) response;
1165 flags = clib_net_to_host_u16 (h->flags);
1177 return VNET_API_ERROR_NAME_SERVER_NO_SUCH_NAME;
1182 return VNET_API_ERROR_NAME_SERVER_NEXT_SERVER;
1186 if (clib_net_to_host_u16 (h->anscount) < 1)
1187 return VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES;
1189 curpos = (
u8 *) (h + 1);
1195 if ((len & 0xC0) == 0xC0)
1208 limit = clib_net_to_host_u16 (h->qdcount);
1209 qp = (dns_query_t *) curpos;
1214 limit = clib_net_to_host_u16 (h->anscount);
1216 for (i = 0; i < limit; i++)
1218 pos = pos2 = curpos;
1222 if ((pos2[0] & 0xC0) == 0xC0)
1225 pos2 = response + ((pos2[0] & 0x3f) << 8) + pos2[1];
1234 if ((pos2[0] & 0xc0) == 0xc0)
1240 if (pointer_chase == 0)
1242 pos2 = response + ((pos2[0] & 0x3f) << 8) + pos2[1];
1250 if (pointer_chase == 0)
1253 rr = (dns_rr_t *) pos;
1255 switch (clib_net_to_host_u16 (rr->type))
1261 ttl = clib_net_to_host_u32 (rr->ttl);
1262 if (min_ttlp && *min_ttlp > ttl)
1268 ttl = clib_net_to_host_u32 (rr->ttl);
1269 if (min_ttlp && *min_ttlp > ttl)
1280 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1285 return VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES;
1299 u8 *curpos, *pos, *pos2;
1304 u8 *junk __attribute__ ((unused));
1308 h = (dns_header_t *) response;
1309 flags = clib_net_to_host_u16 (h->flags);
1321 return VNET_API_ERROR_NAME_SERVER_NO_SUCH_NAME;
1326 return VNET_API_ERROR_NAME_SERVER_NEXT_SERVER;
1330 if (clib_net_to_host_u16 (h->anscount) < 1)
1331 return VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES;
1333 curpos = (
u8 *) (h + 1);
1339 if ((len & 0xC0) == 0xC0)
1352 limit = clib_net_to_host_u16 (h->qdcount);
1353 qp = (dns_query_t *) curpos;
1358 limit = clib_net_to_host_u16 (h->anscount);
1360 for (i = 0; i < limit; i++)
1362 pos = pos2 = curpos;
1366 if ((pos2[0] & 0xC0) == 0xC0)
1369 pos2 = response + ((pos2[0] & 0x3f) << 8) + pos2[1];
1378 if ((pos2[0] & 0xc0) == 0xc0)
1384 if (pointer_chase == 0)
1386 pos2 = response + ((pos2[0] & 0x3f) << 8) + pos2[1];
1394 if (pointer_chase == 0)
1397 rr = (dns_rr_t *) pos;
1399 switch (clib_net_to_host_u16 (rr->type))
1404 ttl = clib_net_to_host_u32 (rr->ttl);
1416 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1421 return VNET_API_ERROR_NAME_SERVER_NO_SUCH_NAME;
1458 rmp->
retval = clib_host_to_net_u32 (rv);
1477 u8 *lookup_name = 0;
1483 for (i = 15; i >= 0; i--)
1486 nybble = (digit & 0x0F);
1488 vec_add1 (lookup_name, (nybble - 10) +
'a');
1490 vec_add1 (lookup_name, nybble +
'0');
1492 nybble = (digit & 0xF0) >> 4;
1494 vec_add1 (lookup_name, (nybble - 10) +
'a');
1496 vec_add1 (lookup_name, nybble +
'0');
1501 memcpy (lookup_name + len,
"ip6.arpa", 8);
1505 for (i = 3; i >= 0; i--)
1508 lookup_name =
format (lookup_name,
"%d.", digit);
1510 lookup_name =
format (lookup_name,
"in-addr.arpa");
1538 rmp->
retval = clib_host_to_net_u32 (rv);
1549 #define vl_msg_name_crc_list 1551 #undef vl_msg_name_crc_list 1556 #define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id); 1557 foreach_vl_msg_name_crc_dns;
1561 #define foreach_dns_api_msg \ 1562 _(DNS_ENABLE_DISABLE, dns_enable_disable) \ 1563 _(DNS_NAME_SERVER_ADD_DEL, dns_name_server_add_del) \ 1564 _(DNS_RESOLVE_NAME, dns_resolve_name) \ 1565 _(DNS_RESOLVE_IP, dns_resolve_ip) 1571 vl_msg_api_set_handlers(VL_API_##N, #n, \ 1572 vl_api_##n##_t_handler, \ 1574 vl_api_##n##_t_endian, \ 1575 vl_api_##n##_t_print, \ 1576 sizeof(vl_api_##n##_t), 1); 1626 u8 **result = va_arg (*args,
u8 **);
1627 u8 **namep = va_arg (*args,
u8 **);
1663 if (!(a4_set + a6_set))
1671 vec_validate (ce, qp_offset +
sizeof (dns_query_t) - 1);
1672 qp = (dns_query_t *) (ce + qp_offset);
1674 qp->type = clib_host_to_net_u16 (DNS_TYPE_ALL);
1680 h = (dns_header_t *) ce;
1686 h->qdcount = clib_host_to_net_u16 (1);
1687 h->anscount = clib_host_to_net_u16 (a4_set + a6_set);
1697 vec_add2 (ce, rru8,
sizeof (*rr) + 4);
1699 rr->type = clib_host_to_net_u16 (DNS_TYPE_A);
1701 rr->ttl = clib_host_to_net_u32 (86400);
1702 rr->rdlength = clib_host_to_net_u16 (4);
1703 memcpy (rr->rdata, &a4, sizeof (a4));
1710 vec_add2 (ce, rru8,
sizeof (*rr) + 16);
1712 rr->type = clib_host_to_net_u16 (DNS_TYPE_AAAA);
1714 rr->ttl = clib_host_to_net_u32 (86400);
1715 rr->rdlength = clib_host_to_net_u16 (16);
1716 memcpy (rr->rdata, &a6, sizeof (a6));
1730 u8 **curpos = va_arg (*args,
u8 **);
1731 int verbose = va_arg (*args,
int);
1736 s =
format (s,
" Name: ");
1744 for (i = 0; i <
len; i++)
1757 qp = (dns_query_t *) pos;
1760 switch (clib_net_to_host_u16 (qp->type))
1763 s =
format (s,
"type A\n");
1766 s =
format (s,
"type AAAA\n");
1769 s =
format (s,
"type ALL\n");
1773 s =
format (s,
"type %d\n", clib_net_to_host_u16 (qp->type));
1778 pos +=
sizeof (*qp);
1794 u8 *reply = va_arg (*args,
u8 *);
1795 u8 **curpos = va_arg (*args,
u8 **);
1796 int verbose = va_arg (*args,
int);
1797 int *print_ip4 = va_arg (*args,
int *);
1798 int *print_ip6 = va_arg (*args,
int *);
1803 int pointer_chase = 0;
1805 u16 rrtype_host_byte_order;
1807 pos = pos2 = *curpos;
1813 if ((pos2[0] & 0xc0) == 0xc0)
1816 pos2 = reply + ((pos2[0] & 0x3f) << 8) + pos2[1];
1824 for (i = 0; i <
len; i++)
1830 if ((pos2[0] & 0xc0) == 0xc0)
1836 if (pointer_chase == 0)
1838 pos2 = reply + ((pos2[0] & 0x3f) << 8) + pos2[1];
1856 if (pointer_chase == 0)
1859 rr = (dns_rr_t *) pos;
1860 rrtype_host_byte_order = clib_net_to_host_u16 (rr->type);
1862 switch (rrtype_host_byte_order)
1867 s =
format (s,
"A: ttl %d %U\n", clib_net_to_host_u32 (rr->ttl),
1874 clib_net_to_host_u32 (rr->ttl));
1879 pos +=
sizeof (*rr) + 4;
1885 s =
format (s,
"AAAA: ttl %d %U\n", clib_net_to_host_u32 (rr->ttl),
1892 clib_net_to_host_u32 (rr->ttl));
1896 pos +=
sizeof (*rr) + 16;
1902 s =
format (s,
"TEXT: ");
1903 for (i = 0; i < clib_net_to_host_u16 (rr->rdlength); i++)
1907 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1910 case DNS_TYPE_HINFO:
1918 s =
format (s,
"HINFO: ");
1921 for (i = 0; i < *
len; i++)
1926 for (i = 0; i < *
len; i++)
1932 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1935 case DNS_TYPE_NAMESERVER:
1938 s =
format (s,
"Nameserver: ");
1942 if ((pos2[0] & 0xc0) == 0xc0)
1945 pos2 = reply + ((pos2[0] & 0x3f) << 8) + pos2[1];
1952 for (i = 0; i <
len; i++)
1956 if (pos2[0] == 0xC0)
1957 pos2 = reply + pos2[1];
1966 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1969 case DNS_TYPE_MAIL_EXCHANGE:
1972 tp = (
u16 *) rr->rdata;
1974 s =
format (s,
"Mail Exchange: Preference %d ", (
u32)
1975 clib_net_to_host_u16 (*tp));
1977 pos2 = rr->rdata + 2;
1980 if (pos2[0] == 0xc0)
1981 pos2 = reply + pos2[1];
1987 for (i = 0; i <
len; i++)
1991 if (pos2[0] == 0xC0)
1992 pos2 = reply + pos2[1];
2002 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
2006 case DNS_TYPE_CNAME:
2009 tp = (
u16 *) rr->rdata;
2011 if (rrtype_host_byte_order == DNS_TYPE_CNAME)
2012 s =
format (s,
"CNAME: ");
2019 if (pos2[0] == 0xc0)
2020 pos2 = reply + pos2[1];
2026 for (i = 0; i <
len; i++)
2030 if (pos2[0] == 0xC0)
2031 pos2 = reply + pos2[1];
2040 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
2045 s =
format (s,
"type %d: len %d\n",
2046 (
int) clib_net_to_host_u16 (rr->type),
2047 sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength));
2048 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
2060 u8 *reply_as_u8 = va_arg (*args,
u8 *);
2061 int verbose = va_arg (*args,
int);
2069 h = (dns_header_t *) reply_as_u8;
2070 id = clib_net_to_host_u16 (h->id);
2071 flags = clib_net_to_host_u16 (h->flags);
2075 s =
format (s,
"DNS %s: id %d\n", (flags &
DNS_QR) ?
"reply" :
"query",
2077 s =
format (s,
" %s %s %s %s\n",
2078 (flags &
DNS_RA) ?
"recur" :
"no-recur",
2079 (flags &
DNS_RD) ?
"recur-des" :
"no-recur-des",
2080 (flags &
DNS_TC) ?
"trunc" :
"no-trunc",
2081 (flags &
DNS_AA) ?
"auth" :
"non-auth");
2082 s =
format (s,
" %d queries, %d answers, %d name-servers," 2084 clib_net_to_host_u16 (h->qdcount),
2085 clib_net_to_host_u16 (h->anscount),
2086 clib_net_to_host_u16 (h->nscount),
2087 clib_net_to_host_u16 (h->arcount));
2090 curpos = (
u8 *) (h + 1);
2095 s =
format (s,
" Queries:\n");
2096 for (i = 0; i < clib_net_to_host_u16 (h->qdcount); i++)
2105 s =
format (s,
" Replies:\n");
2107 for (i = 0; i < clib_net_to_host_u16 (h->anscount); i++)
2111 verbose, &print_ip4, &print_ip6);
2121 f64 now = va_arg (*args,
f64);
2122 int verbose = va_arg (*args,
int);
2130 s =
format (s,
"The DNS cache is disabled...");
2136 s =
format (s,
"The DNS cache is empty...");
2147 s =
format (s,
"%s is not in the cache...", name);
2157 s =
format (s,
"static u8 dns_reply_data_initializer[] =\n");
2189 if (time_left > 0.0)
2190 s =
format (s,
" TTL left %.1f", time_left);
2192 s =
format (s,
" EXPIRED");
2209 if (ep->flags & DNS_CACHE_ENTRY_FLAG_VALID)
2211 ASSERT (ep->dns_response);
2212 if (ep->flags & DNS_CACHE_ENTRY_FLAG_STATIC)
2217 if (verbose < 2 && ep->flags & DNS_CACHE_ENTRY_FLAG_CNAME)
2218 s = format (s,
"%s%s -> %s", ss, ep->name, ep->cname);
2220 s = format (s,
"%s%s -> %U", ss, ep->name,
2224 if (!(ep->flags & DNS_CACHE_ENTRY_FLAG_STATIC))
2226 f64 time_left = ep->expiration_time - now;
2227 if (time_left > 0.0)
2228 s = format (s,
" TTL left %.1f", time_left);
2230 s = format (s,
" EXPIRED");
2233 s = format (s,
" %d client notifications pending\n",
2234 vec_len(ep->pending_requests));
2239 ASSERT (ep->dns_request);
2240 s = format (s,
"[P] %U", format_dns_reply, ep->dns_request,
2263 if (
unformat (input,
"verbose %d", &verbose))
2265 else if (
unformat (input,
"verbose"))
2267 else if (
unformat (input,
"name %s", &name))
2282 .path =
"show dns cache",
2283 .short_help =
"show dns cache [verbose [nn]]",
2308 if (is_add == -1 && is_clear == -1)
2319 case VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED:
2333 case VNET_API_ERROR_NO_SUCH_ENTRY:
2338 case VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED:
2364 case VNET_API_ERROR_ENTRY_ALREADY_EXISTS:
2383 .path =
"dns cache",
2384 .short_help =
"dns cache [add|del|clear] <name> [ip4][ip6]",
2389 #define DNS_FORMAT_TEST 1 2391 #if DNS_FORMAT_TEST > 0 2394 static u8 dns_reply_data_initializer[] =
2395 { 0x0, 0x0, 0x81, 0x80, 0x0, 0x1, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5,
2396 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x3, 0x63, 0x6f, 0x6d,
2401 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x24, 0x23,
2402 0x76, 0x3d, 0x73, 0x70, 0x66, 0x31, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72,
2403 0x65, 0x63, 0x74, 0x3d, 0x5f, 0x73, 0x70, 0x66, 0x2e, 0x6d, 0x61, 0x69,
2404 0x6c, 0x2e, 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0xc0,
2405 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0, 0x6, 0x3, 0x6e, 0x73,
2406 0x35, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0,
2407 0x6, 0x3, 0x6e, 0x73, 0x34, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0,
2408 0x1, 0x50, 0xd4, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x31, 0xc0, 0xc, 0xc0, 0xc,
2409 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x32,
2410 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0, 0x6,
2411 0x3, 0x6e, 0x73, 0x33, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0,
2412 0x6, 0x5c, 0x0, 0x19, 0x0, 0x1, 0x4, 0x6d, 0x74, 0x61, 0x36, 0x3, 0x61,
2413 0x6d, 0x30, 0x8, 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x64, 0x6e, 0x73, 0x3,
2415 0x65, 0x74, 0x0, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0,
2416 0x9, 0x0, 0x1, 0x4, 0x6d, 0x74, 0x61, 0x37, 0xc0, 0xb8, 0xc0, 0xc, 0x0,
2417 0xf, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x9, 0x0, 0x1, 0x4, 0x6d, 0x74,
2418 0x61, 0x35, 0xc0, 0xb8, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x6,
2419 0x5c, 0x0, 0x10, 0x20, 0x1, 0x49, 0x98, 0x0, 0x44, 0x2, 0x4, 0x0, 0x0,
2421 0x0, 0x0, 0x0, 0x0, 0xa7, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x6,
2422 0x5c, 0x0, 0x10, 0x20, 0x1, 0x49, 0x98, 0x0, 0xc, 0xa, 0x6, 0x0, 0x0, 0x0,
2423 0x0, 0x0, 0x2, 0x40, 0x8, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x6,
2424 0x5c, 0x0, 0x10, 0x20, 0x1, 0x49, 0x98, 0x0, 0x58, 0xc, 0x2, 0x0, 0x0,
2426 0x0, 0x0, 0x0, 0x0, 0xa9, 0xc0, 0xc, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x6,
2427 0x5c, 0x0, 0x4, 0x62, 0x8a, 0xfd, 0x6d, 0xc0, 0xc, 0x0, 0x1, 0x0, 0x1,
2429 0x0, 0x6, 0x5c, 0x0, 0x4, 0xce, 0xbe, 0x24, 0x2d, 0xc0, 0xc, 0x0, 0x1,
2431 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x4, 0x62, 0x8b, 0xb4, 0x95, 0xc0, 0xc,
2433 0x6, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x2d, 0xc0, 0x7b, 0xa, 0x68,
2435 0x73, 0x74, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x9, 0x79, 0x61, 0x68,
2436 0x6f, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0xc0, 0x12, 0x78, 0x3a, 0x85, 0x44,
2437 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x1, 0x2c, 0x0, 0x1b, 0xaf, 0x80, 0x0, 0x0,
2442 static u8 dns_reply_data_initializer[] = {
2443 0x00, 0x01, 0x81, 0x80, 0x00, 0x01, 0x00, 0x01,
2444 0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77, 0x05,
2445 0x63, 0x69, 0x73, 0x63, 0x6f, 0x03, 0x63, 0x6f, 0x6d,
2447 0x00, 0x00, 0xff, 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x05,
2448 0x00, 0x01, 0x00, 0x00, 0x0b, 0xd3, 0x00, 0x1a, 0x03,
2449 0x77, 0x77, 0x77, 0x05, 0x63, 0x69, 0x73, 0x63, 0x6f,
2450 0x03, 0x63, 0x6f, 0x6d, 0x06, 0x61, 0x6b, 0x61, 0x64,
2451 0x6e, 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00,
2455 static u8 dns_reply_data_initializer[] = {
2457 0x00, 0x01, 0x81, 0x80, 0x00, 0x01, 0x00, 0x08,
2459 0x00, 0x06, 0x00, 0x06, 0x0a, 0x6f, 0x72, 0x69,
2461 0x67, 0x69, 0x6e, 0x2d, 0x77, 0x77, 0x77, 0x05,
2463 0x63, 0x69, 0x73, 0x63, 0x6f, 0x03, 0x63, 0x6f,
2465 0x6d, 0x00, 0x00, 0xff, 0x00, 0x01, 0x0a, 0x6f,
2467 0x72, 0x69, 0x67, 0x69, 0x6e, 0x2d, 0x77, 0x77,
2469 0x77, 0x05, 0x43, 0x49, 0x53, 0x43, 0x4f, 0xc0,
2472 0x1d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05,
2475 0x9a, 0x00, 0x18, 0x15, 0x72, 0x63, 0x64,
2476 0x6e, 0x39, 0x2d, 0x31, 0x34, 0x70, 0x2d, 0x64, 0x63,
2477 0x7a, 0x30, 0x35, 0x6e, 0x2d, 0x67, 0x73, 0x73, 0x31,
2478 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02, 0x00, 0x01, 0x00,
2479 0x00, 0x05, 0x9a, 0x00, 0x1a, 0x17, 0x61, 0x6c, 0x6c,
2480 0x6e, 0x30, 0x31, 0x2d, 0x61, 0x67, 0x30, 0x39, 0x2d,
2481 0x64, 0x63, 0x7a, 0x30, 0x33, 0x6e, 0x2d, 0x67, 0x73,
2482 0x73, 0x31, 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02, 0x00,
2483 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x10, 0x0d, 0x72,
2484 0x74, 0x70, 0x35, 0x2d, 0x64, 0x6d, 0x7a, 0x2d, 0x67,
2485 0x73, 0x73, 0x31, 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02,
2486 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x18, 0x15,
2487 0x6d, 0x74, 0x76, 0x35, 0x2d, 0x61, 0x70, 0x31, 0x30,
2488 0x2d, 0x64, 0x63, 0x7a, 0x30, 0x36, 0x6e, 0x2d, 0x67,
2489 0x73, 0x73, 0x31, 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02,
2490 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x1b, 0x18,
2491 0x73, 0x6e, 0x67, 0x64, 0x63, 0x30, 0x31, 0x2d, 0x61,
2492 0x62, 0x30, 0x37, 0x2d, 0x64, 0x63, 0x7a, 0x30, 0x31,
2493 0x6e, 0x2d, 0x67, 0x73, 0x73, 0x31, 0xc0, 0x17, 0xc0,
2494 0x26, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a,
2495 0x00, 0x1a, 0x17, 0x61, 0x65, 0x72, 0x30, 0x31, 0x2d,
2496 0x72, 0x34, 0x63, 0x32, 0x35, 0x2d, 0x64, 0x63, 0x7a,
2497 0x30, 0x31, 0x6e, 0x2d, 0x67, 0x73, 0x73, 0x31, 0xc0,
2498 0x17, 0xc0, 0x26, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
2499 0x00, 0x81, 0x00, 0x04, 0x48, 0xa3, 0x04, 0xa1, 0xc0,
2500 0x26, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82,
2501 0x00, 0x10, 0x20, 0x01, 0x04, 0x20, 0x12, 0x01, 0x00,
2502 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
2503 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05,
2504 0x9a, 0x00, 0x02, 0xc0, 0xf4, 0xc0, 0x0c, 0x00, 0x02,
2505 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x02, 0xc0,
2506 0xcd, 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00,
2507 0x05, 0x9a, 0x00, 0x02, 0xc0, 0x8d, 0xc0, 0x0c, 0x00,
2508 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x02,
2509 0xc0, 0x43, 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00,
2510 0x00, 0x05, 0x9a, 0x00, 0x02, 0xc0, 0xa9, 0xc0, 0x0c,
2511 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00,
2512 0x02, 0xc0, 0x67, 0xc0, 0x8d, 0x00, 0x01, 0x00, 0x01,
2513 0x00, 0x00, 0x07, 0x08, 0x00, 0x04, 0x40, 0x66, 0xf6,
2514 0x05, 0xc0, 0xa9, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
2515 0x07, 0x08, 0x00, 0x04, 0xad, 0x24, 0xe0, 0x64, 0xc0,
2516 0x43, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x07, 0x08,
2517 0x00, 0x04, 0x48, 0xa3, 0x04, 0x1c, 0xc0, 0xf4, 0x00,
2518 0x01, 0x00, 0x01, 0x00, 0x00, 0x07, 0x08, 0x00, 0x04,
2519 0xad, 0x26, 0xd4, 0x6c, 0xc0, 0x67, 0x00, 0x01, 0x00,
2520 0x01, 0x00, 0x00, 0x07, 0x08, 0x00, 0x04, 0xad, 0x25,
2521 0x90, 0x64, 0xc0, 0xcd, 0x00, 0x01, 0x00, 0x01, 0x00,
2522 0x00, 0x07, 0x08, 0x00, 0x04, 0xad, 0x27, 0x70, 0x44,
2526 static u8 dns_reply_data_initializer[] =
2527 { 0x0, 0x0, 0x81, 0x80, 0x0, 0x1, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x6,
2528 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3, 0x63, 0x6f, 0x6d, 0x0, 0x0, 0xff,
2529 0x0, 0x1, 0xc0, 0xc, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x2b, 0x0, 0x4,
2530 0xac, 0xd9, 0x3, 0x2e, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x1,
2532 0x0, 0x10, 0x26, 0x7, 0xf8, 0xb0, 0x40, 0x4, 0x8, 0xf, 0x0, 0x0, 0x0, 0x0,
2533 0x0, 0x0, 0x20, 0xe, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x51, 0x7f,
2534 0x0, 0x6, 0x3, 0x6e, 0x73, 0x31, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x6, 0x0, 0x1,
2535 0x0, 0x0, 0x0, 0x3b, 0x0, 0x22, 0xc0, 0x54, 0x9, 0x64, 0x6e, 0x73, 0x2d,
2536 0x61, 0x64, 0x6d, 0x69, 0x6e, 0xc0, 0xc, 0xa, 0x3d, 0xc7, 0x30, 0x0, 0x0,
2537 0x3, 0x84, 0x0, 0x0, 0x3, 0x84, 0x0, 0x0, 0x7, 0x8, 0x0, 0x0, 0x0, 0x3c,
2538 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x11, 0x0, 0x1e,
2539 0x4, 0x61, 0x6c, 0x74, 0x32, 0x5, 0x61, 0x73, 0x70, 0x6d, 0x78, 0x1, 0x6c,
2540 0xc0, 0xc, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x4,
2541 0x0, 0xa, 0xc0, 0x9b, 0xc0, 0xc, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0xe, 0xf,
2542 0x0, 0x24, 0x23, 0x76, 0x3d, 0x73, 0x70, 0x66, 0x31, 0x20, 0x69, 0x6e,
2543 0x63, 0x6c, 0x75, 0x64, 0x65, 0x3a, 0x5f, 0x73, 0x70, 0x66, 0x2e, 0x67,
2544 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x7e, 0x61,
2545 0x6c, 0x6c, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x51, 0x7f, 0x0, 0x6,
2546 0x3, 0x6e, 0x73, 0x32, 0xc0, 0xc, 0xc0, 0xc, 0x1, 0x1, 0x0, 0x1, 0x0, 0x1,
2547 0x51, 0x7f, 0x0, 0xf, 0x0, 0x5, 0x69, 0x73, 0x73, 0x75, 0x65, 0x70, 0x6b,
2548 0x69, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0,
2549 0x1, 0x51, 0x7f, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x34, 0xc0, 0xc, 0xc0, 0xc,
2550 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x9, 0x0, 0x28, 0x4, 0x61,
2551 0x6c, 0x74, 0x33, 0xc0, 0x9b, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1,
2552 0x51, 0x7f, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x33, 0xc0, 0xc, 0xc0, 0xc, 0x0,
2553 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x9, 0x0, 0x32, 0x4, 0x61, 0x6c,
2554 0x74, 0x34, 0xc0, 0x9b, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2,
2556 0x0, 0x9, 0x0, 0x14, 0x4, 0x61, 0x6c, 0x74, 0x31, 0xc0, 0x9b
2561 static u8 dns_reply_data_initializer[] = {
2562 0x00, 0x00, 0x81, 0x80, 0x00, 0x01, 0x00, 0x01,
2563 0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77, 0x0b,
2564 0x77, 0x65, 0x61, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x69,
2565 0x6e, 0x6b, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0xff,
2566 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x05, 0x00, 0x01, 0x00,
2567 0x00, 0x0c, 0x9e, 0x00, 0x1f, 0x0e, 0x64, 0x33, 0x6b,
2568 0x72, 0x30, 0x67, 0x75, 0x62, 0x61, 0x31, 0x64, 0x76,
2569 0x77, 0x66, 0x0a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x66,
2570 0x72, 0x6f, 0x6e, 0x74, 0x03, 0x6e, 0x65, 0x74, 0x00,
2579 u8 *dns_reply_data = 0;
2586 if (
unformat (input,
"verbose %d", &verbose))
2588 else if (
unformat (input,
"verbose"))
2597 memcpy (dns_reply_data, dns_reply_data_initializer,
2598 ARRAY_LEN (dns_reply_data_initializer));
2608 case VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES:
2635 .path =
"test dns format",
2636 .short_help =
"test dns format",
2645 u8 *dns_reply_data = 0;
2651 if (
unformat (input,
"verbose %d", &verbose))
2653 else if (
unformat (input,
"verbose"))
2675 .path =
"test dns unformat",
2676 .short_help =
"test dns unformat <name> [ip4][ip6]",
2695 _vec_len (name) -= 1;
2721 .path =
"test dns expire",
2722 .short_help =
"test dns expire <name>",
2805 if (b0->
flags & VLIB_BUFFER_NEXT_PRESENT)
2815 b0->
flags |= (VNET_BUFFER_F_LOCALLY_ORIGINATED
2816 | VLIB_BUFFER_TOTAL_LENGTH_VALID);
2829 if (fib_index == (
u32) ~ 0)
2846 if (sw_if_index == ~0)
2849 (
"route to %U exists, fei %d, get_resolving_interface returned" 2858 goto found_src_address;
2869 dns_response = (
u8 *) (udp + 1);
2870 clib_memset (ip, 0,
sizeof (*ip) +
sizeof (*udp));
2883 vec_validate (reply, qp_offset +
sizeof (dns_query_t) - 1);
2885 qp = (dns_query_t *) (reply + qp_offset);
2888 qp->type = clib_host_to_net_u16 (DNS_TYPE_A);
2890 qp->type = clib_host_to_net_u16 (DNS_TYPE_PTR);
2895 vec_insert (reply,
sizeof (dns_header_t), 0);
2897 dh = (dns_header_t *) reply;
2906 dh->flags = clib_host_to_net_u16 (tmp);
2907 dh->qdcount = clib_host_to_net_u16 (1);
2908 dh->anscount = (is_fail == 0) ? clib_host_to_net_u16 (1) : 0;
2923 rr = (dns_rr_t *) rrptr;
2925 rr->type = clib_host_to_net_u16 (DNS_TYPE_A);
2926 rr->class = clib_host_to_net_u16 (1 );
2927 rr->ttl = clib_host_to_net_u32 (ttl);
2928 rr->rdlength = clib_host_to_net_u16 (
sizeof (
ip4_address_t));
2939 rr = (dns_rr_t *) rrptr;
2940 rr->type = clib_host_to_net_u16 (DNS_TYPE_PTR);
2941 rr->class = clib_host_to_net_u16 (1 );
2942 rr->ttl = clib_host_to_net_u32 (ttl);
2943 rr->rdlength = clib_host_to_net_u16 (
vec_len (label_vec));
2964 udp->
src_port = clib_host_to_net_u16 (UDP_DST_PORT_dns);
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
#define foreach_ip_interface_address(lm, a, sw_if_index, loop, body)
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index, VLIB_BUFFER_IS_TRACED: trace this buffer.
fib_protocol_t fp_proto
protocol type
#define foreach_notification_to_move
static void setup_message_id_table(api_main_t *am)
static clib_error_t * test_dns_fmt_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
ip6_address_t * ip6_name_servers
vnet_main_t * vnet_get_main(void)
#define DNS_CACHE_ENTRY_FLAG_VALID
we have Actual Data
VLIB_API_INIT_FUNCTION(dns_api_hookup)
#define DNS_RD
recursion desired
vlib_node_registration_t dns46_reply_node
(constructor) VLIB_REGISTER_NODE (dns46_reply_node)
i16 current_data
signed offset in data[], pre_data[] that we are currently processing.
static int delete_random_entry(dns_main_t *dm)
int vnet_dns_cname_indirection_nolock(dns_main_t *dm, u32 ep_index, u8 *reply)
Handle cname indirection.
#define REPLY_MACRO2(t, body)
static f64 vlib_time_now(vlib_main_t *vm)
vlib_node_registration_t dns4_request_node
(constructor) VLIB_REGISTER_NODE (dns4_request_node)
#define DNS_RCODE_REFUSED
#define DNS_RCODE_NO_ERROR
u8 * dns_response
Cached dns response.
u16 current_length
Nbytes between current data and the end of this buffer.
int vnet_dns_response_to_name(u8 *response, vl_api_dns_resolve_ip_reply_t *rmp, u32 *min_ttlp)
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
int vnet_dns_delete_entry_by_index_nolock(dns_main_t *dm, u32 index)
int retry_count
Retry parameters.
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
#define hash_set_mem(h, key, value)
clib_memset(h->entries, 0, sizeof(h->entries[0])*entries)
ip_lookup_main_t lookup_main
#define DNS_CACHE_ENTRY_FLAG_STATIC
static entry
#define DNS_CLASS_IN
The Internet.
static uword vlib_buffer_length_in_chain(vlib_main_t *vm, vlib_buffer_t *b)
Get length in bytes of the buffer chain.
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
DNS IP -> name resolution request.
int vnet_dns_response_to_reply(u8 *response, vl_api_dns_resolve_name_reply_t *rmp, u32 *min_ttlp)
#define DNS_RCODE_NOT_IMPLEMENTED
vlib_node_registration_t ip4_lookup_node
(constructor) VLIB_REGISTER_NODE (ip4_lookup_node)
#define clib_memcpy(d, s, n)
void vnet_send_dns_request(dns_main_t *dm, dns_cache_entry_t *ep)
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
#define VLIB_INIT_FUNCTION(x)
static void vl_api_dns_resolve_ip_t_handler(vl_api_dns_resolve_ip_t *mp)
u8 * dns_request
Cached dns request, for sending retries.
static void vl_api_dns_enable_disable_t_handler(vl_api_dns_enable_disable_t *mp)
Aggregrate type for a prefix.
vlib_frame_t * vlib_get_frame_to_node(vlib_main_t *vm, u32 to_node_index)
#define clib_error_return(e, args...)
u8 * format_dns_reply(u8 *s, va_list *args)
u32 * unresolved_entries
Pool indices of unresolved entries.
void vnet_send_dns4_reply(dns_main_t *dm, dns_pending_request_t *pr, dns_cache_entry_t *ep, vlib_buffer_t *b0)
u32 fib_table_find(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
u16 fp_len
The mask length.
#define foreach_dns_api_msg
fib_node_index_t fib_table_lookup(u32 fib_index, const fib_prefix_t *prefix)
Perfom a longest prefix match in the non-forwarding table.
dns_pending_request_t * pending_requests
Clients / peers awaiting responses.
u8 * name_to_labels(u8 *name)
Translate "foo.com" into "0x3 f o o 0x3 c o m 0x0" A historical / hysterical micro-TLV scheme...
#define hash_create_string(elts, value_bytes)
#define DNS_RETRIES_PER_SERVER
ip4_address_t * ip4_name_servers
upstream name servers, e.g.
#define DNS_RA
recursion available
u8 * cname
For CNAME records, the "next name" to resolve.
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
#define vec_insert(V, N, M)
Insert N vector elements starting at element M, initialize new elements to zero (no header...
#define hash_unset_mem(h, key)
u8 * name
The name in "normal human being" notation, e.g.
ip46_address_t fp_addr
The address type is not deriveable from the fp_addr member.
#define DNS_QR
query=0, response=1
#define DNS_RCODE_SERVER_FAILURE
DNS name resolution request.
void vlib_put_frame_to_node(vlib_main_t *vm, u32 to_node_index, vlib_frame_t *f)
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
#define pool_put(P, E)
Free an object E in pool P.
#define vec_dup(V)
Return copy of vector (no header, no alignment)
static clib_error_t * dns_cache_add_del_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * dns_api_hookup(vlib_main_t *vm)
#define VLIB_CONFIG_FUNCTION(x, n,...)
vl_api_address_union_t src_address
u8 * format_dns_reply_data(u8 *s, va_list *args)
format dns reply data verbose > 1, dump everything verbose == 1, dump all A and AAAA records verbose ...
DNS ip->name resolution reply.
vlib_thread_main_t vlib_thread_main
static clib_error_t * dns_init(vlib_main_t *vm)
static void vl_api_dns_resolve_name_t_handler(vl_api_dns_resolve_name_t *mp)
static clib_error_t * show_dns_cache_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
API main structure, used by both vpp and binary API clients.
u32 fib_entry_get_resolving_interface(fib_node_index_t entry_index)
#define pool_free(p)
Free a pool.
static void dns_cache_unlock(dns_main_t *dm)
#define vec_free(V)
Free vector's memory (no header).
static void vlib_process_signal_event_mt(vlib_main_t *vm, uword node_index, uword type_opaque, uword data)
Signal event to process from any thread.
int vnet_dns_resolve_name(dns_main_t *dm, u8 *name, dns_pending_request_t *t, dns_cache_entry_t **retp)
#define clib_warning(format, args...)
static void dns_cache_lock(dns_main_t *dm)
static int dns6_name_server_add_del(dns_main_t *dm, u8 *server_address_as_u8, int is_add)
u32 fib_node_index_t
A typedef of a node index.
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
static clib_error_t * test_dns_expire_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define DNS_AA
authoritative answer
#define VLIB_CLI_COMMAND(x,...)
u16 ip6_tcp_udp_icmp_compute_checksum(vlib_main_t *vm, vlib_buffer_t *p0, ip6_header_t *ip0, int *bogus_lengthp)
static int dns_cache_clear(dns_main_t *dm)
vlib_node_registration_t ip6_lookup_node
(constructor) VLIB_REGISTER_NODE (ip6_lookup_node)
ip_lookup_main_t lookup_main
#define DNS_RCODE_FORMAT_ERROR
#define vec_delete(V, N, M)
Delete N elements starting at element M.
u8 * vnet_dns_labels_to_name(u8 *label, u8 *full_text, u8 **parse_from_here)
arc-function for the above.
#define DNS_OPCODE_QUERY
standard query
static clib_error_t * dns_config_fn(vlib_main_t *vm, unformat_input_t *input)
int udp_ports_registered
udp port registration complete
static int dns_add_static_entry(dns_main_t *dm, u8 *name, u8 *dns_reply_data)
uword * cache_entry_by_name
Find cached record by name.
add or delete an upstream name server
enable/disable name resolution
uword unformat_dns_reply(unformat_input_t *input, va_list *args)
vlib_node_registration_t dns_resolver_node
(constructor) VLIB_REGISTER_NODE (dns_resolver_node)
vlib_node_registration_t dns6_request_node
(constructor) VLIB_REGISTER_NODE (dns6_request_node)
static int dns_delete_by_name(dns_main_t *dm, u8 *name)
#define FIB_NODE_INDEX_INVALID
#define DNS_RCODE_NAME_ERROR
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
u32 next_buffer
Next buffer for this linked-list of buffers.
u32 name_cache_size
config parameters
void vnet_send_dns6_reply(dns_main_t *dm, dns_pending_request_t *pr, dns_cache_entry_t *ep, vlib_buffer_t *b0)
void vnet_dns_send_dns6_request(dns_main_t *dm, dns_cache_entry_t *ep, ip6_address_t *server)
VLIB buffer representation.
static void * vlib_frame_vector_args(vlib_frame_t *f)
Get pointer to frame vector data.
static void vl_api_dns_name_server_add_del_t_handler(vl_api_dns_name_server_add_del_t *mp)
#define DNS_CACHE_ENTRY_FLAG_CNAME
CNAME (indirect) entry.
#define hash_get_mem(h, key)
struct clib_bihash_value offset
template key/value backing page structure
static void * clib_mem_alloc_aligned(uword size, uword align)
static u32 random_u32(u32 *seed)
32-bit random number generator
ip4_main_t ip4_main
Global ip4 main structure.
void vnet_dns_send_dns4_request(dns_main_t *dm, dns_cache_entry_t *ep, ip4_address_t *server)
static int dns4_name_server_add_del(dns_main_t *dm, u8 *server_address_as_u8, int is_add)
static clib_error_t * test_dns_unfmt_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static void vlib_buffer_free_one(vlib_main_t *vm, u32 buffer_index)
Free one buffer Shorthand to free a single buffer chain.
void udp_register_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u32 node_index, u8 is_ip4)
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
f64 expiration_time
Expiration time.
#define CLIB_CACHE_LINE_BYTES
u32 total_length_not_including_first_buffer
Only valid for first buffer in chain.
DNS name resolution reply.
static u32 vlib_buffer_alloc(vlib_main_t *vm, u32 *buffers, u32 n_buffers)
Allocate buffers into supplied array.
u8 * format_dns_cache(u8 *s, va_list *args)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
u8 * format_dns_query(u8 *s, va_list *args)
static vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
static u16 ip4_header_checksum(ip4_header_t *i)
static int dns_enable_disable(dns_main_t *dm, int is_enable)
#define DNS_RESOLVER_EVENT_PENDING
int is_enabled
enable / disable flag
dns_cache_entry_t * entries
Pool of cache entries.
static uword pool_elts(void *v)
Number of active elements in a pool.