24 #include <vpp/app/version.h> 28 #include <dns/dns.api_enum.h> 29 #include <dns/dns.api_types.h> 31 #define REPLY_MSG_ID_BASE dm->msg_id_base 35 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) 38 vl_print (handle, (char *)s); \ 50 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
58 vec_free (ep->pending_requests);
83 return VNET_API_ERROR_NO_NAME_SERVERS;
104 if (n_vlib_mains > 1)
123 vl_api_dns_enable_disable_reply_t *rmp;
135 u8 * server_address_as_u8,
int is_add)
146 sizeof (ip6_address_t)))
151 clib_memcpy (ap, server_address_as_u8,
sizeof (*ap));
158 sizeof (ip6_address_t)))
164 return VNET_API_ERROR_NAME_SERVER_NOT_FOUND;
171 u8 * server_address_as_u8,
int is_add)
187 clib_memcpy (ap, server_address_as_u8,
sizeof (*ap));
200 return VNET_API_ERROR_NAME_SERVER_NOT_FOUND;
209 vl_api_dns_name_server_add_del_reply_t *rmp;
217 REPLY_MACRO (VL_API_DNS_NAME_SERVER_ADD_DEL_REPLY);
248 if (fib_index == (
u32) ~ 0)
267 if (sw_if_index == ~0)
271 (
"route to %U exists, fei %d, get_resolving_interface returned" 280 goto found_src_address;
298 VLIB_BUFFER_TOTAL_LENGTH_VALID | VNET_BUFFER_F_LOCALLY_ORIGINATED;
307 dns_request = (
u8 *) (udp + 1);
319 udp->
src_port = clib_host_to_net_u16 (UDP_DST_PORT_dns_reply);
320 udp->
dst_port = clib_host_to_net_u16 (UDP_DST_PORT_dns);
357 int junk __attribute__ ((unused));
367 if (fib_index == (
u32) ~ 0)
388 goto found_src_address;
406 VLIB_BUFFER_TOTAL_LENGTH_VALID | VNET_BUFFER_F_LOCALLY_ORIGINATED;
413 dns_request = (
u8 *) (udp + 1);
417 clib_host_to_net_u32 (0x6 << 28);
428 udp->
src_port = clib_host_to_net_u16 (UDP_DST_PORT_dns_reply);
429 udp->
dst_port = clib_host_to_net_u16 (UDP_DST_PORT_dns);
455 int last_label_index;
462 last_label_index = 0;
469 rv[last_label_index] = (i - last_label_index) - 1;
470 if ((i - last_label_index) > 63)
472 i - last_label_index);
473 last_label_index =
i;
479 rv[last_label_index] = (i - last_label_index) - 1;
502 *parse_from_here = 0;
505 if ((label[0] & 0xC0) == 0xC0)
507 *parse_from_here = label + 2;
508 offset = ((label[0] & 0x3f) << 8) + label[1];
509 label = full_text +
offset;
516 for (i = 0; i <
len; i++)
520 if ((label[0] & 0xC0) == 0xC0)
522 *parse_from_here = label + 2;
523 offset = ((label[0] & 0x3f) << 8) + label[1];
524 label = full_text +
offset;
531 if (*parse_from_here == 0)
532 *parse_from_here =
label;
570 vec_validate (request, 2 * qp_offset + 2 *
sizeof (dns_query_t) - 1);
572 qp = (dns_query_t *) (request + qp_offset);
574 qp->type = clib_host_to_net_u16 (DNS_TYPE_A);
578 qp = (dns_query_t *) (((
u8 *) qp) +
vec_len (name_copy));
581 qp->type = clib_host_to_net_u16 (DNS_TYPE_AAAA);
585 vec_insert (request,
sizeof (dns_header_t), 0);
587 h = (dns_header_t *) request;
590 h->id = clib_host_to_net_u16 (ep - dm->
entries);
594 h->flags = clib_host_to_net_u16 (tmp);
595 h->qdcount = clib_host_to_net_u16 (2);
668 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
671 return VNET_API_ERROR_NO_SUCH_ENTRY;
682 clib_warning (
"pool elt %d supposedly pending, but not found...",
702 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
709 return VNET_API_ERROR_NO_SUCH_ENTRY;
722 u32 victim_index, start_index,
i;
727 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
735 return VNET_API_ERROR_UNSPECIFIED;
742 for (i = 0; i < limit; i++)
744 victim_index = (start_index +
i) % limit;
762 return VNET_API_ERROR_UNSPECIFIED;
773 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
780 return VNET_API_ERROR_ENTRY_ALREADY_EXISTS;
827 return VNET_API_ERROR_INVALID_VALUE;
842 u32 *indices_to_delete = 0;
865 for (i = 0; i <
vec_len (indices_to_delete); i++)
871 indices_to_delete[i]);
876 (dm, indices_to_delete[i]);
899 memcpy (pr, t,
sizeof (*pr));
957 #define foreach_notification_to_move \ 967 u32 ep_index,
u8 * reply)
985 h = (dns_header_t *) reply;
986 flags = clib_net_to_host_u16 (h->flags);
1003 curpos = (
u8 *) (h + 1);
1008 for (i = 0; i < clib_net_to_host_u16 (h->qdcount); i++)
1015 pos +=
sizeof (dns_query_t);
1019 if ((pos2[0] & 0xC0) == 0xC0)
1025 for (i = 0; i < clib_net_to_host_u16 (h->anscount); i++)
1027 rr = (dns_rr_t *) pos;
1028 switch (clib_net_to_host_u16 (rr->type))
1039 case DNS_TYPE_CNAME:
1047 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1049 if ((pos2[0] & 0xc0) == 0xc0)
1056 flags &= ~DNS_RCODE_MASK;
1058 h->flags = clib_host_to_net_u16 (flags);
1070 goto found_last_request;
1072 clib_warning (
"pool elt %d supposedly pending, but not found...", ep_index);
1081 _vec_len (cname) -= 1;
1100 _vec_len (next_ep->
name) -= 1;
1110 #define _(a) next_ep->a = ep->a; ep->a = 0; 1115 name_copy =
vec_dup (request);
1117 qp_offset =
vec_len (request);
1120 vec_validate (request, 2 * qp_offset + 2 *
sizeof (dns_query_t) - 1);
1122 qp = (dns_query_t *) (request + qp_offset);
1124 qp->type = clib_host_to_net_u16 (DNS_TYPE_A);
1127 qp = (dns_query_t *) (((
u8 *) qp) +
vec_len (name_copy));
1130 qp->type = clib_host_to_net_u16 (DNS_TYPE_AAAA);
1134 vec_insert (request,
sizeof (dns_header_t), 0);
1136 h = (dns_header_t *) request;
1139 h->id = clib_host_to_net_u16 (next_ep - dm->
entries);
1143 h->qdcount = clib_host_to_net_u16 (2);
1171 u8 *curpos, *pos, *pos2;
1177 h = (dns_header_t *) response;
1178 flags = clib_net_to_host_u16 (h->flags);
1190 return VNET_API_ERROR_NAME_SERVER_NO_SUCH_NAME;
1195 return VNET_API_ERROR_NAME_SERVER_NEXT_SERVER;
1199 if (clib_net_to_host_u16 (h->anscount) < 1)
1200 return VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES;
1202 curpos = (
u8 *) (h + 1);
1208 if ((len & 0xC0) == 0xC0)
1221 limit = clib_net_to_host_u16 (h->qdcount);
1222 qp = (dns_query_t *) curpos;
1227 limit = clib_net_to_host_u16 (h->anscount);
1229 for (i = 0; i < limit; i++)
1231 pos = pos2 = curpos;
1235 if ((pos2[0] & 0xC0) == 0xC0)
1238 pos2 = response + ((pos2[0] & 0x3f) << 8) + pos2[1];
1247 if ((pos2[0] & 0xc0) == 0xc0)
1253 if (pointer_chase == 0)
1255 pos2 = response + ((pos2[0] & 0x3f) << 8) + pos2[1];
1263 if (pointer_chase == 0)
1266 rr = (dns_rr_t *) pos;
1268 switch (clib_net_to_host_u16 (rr->type))
1274 ttl = clib_net_to_host_u32 (rr->ttl);
1275 if (min_ttlp && *min_ttlp > ttl)
1280 memcpy (rmp->
ip6_address, rr->rdata, sizeof (ip6_address_t));
1281 ttl = clib_net_to_host_u32 (rr->ttl);
1282 if (min_ttlp && *min_ttlp > ttl)
1293 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1298 return VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES;
1312 u8 *curpos, *pos, *pos2;
1317 u8 *junk __attribute__ ((unused));
1321 h = (dns_header_t *) response;
1322 flags = clib_net_to_host_u16 (h->flags);
1334 return VNET_API_ERROR_NAME_SERVER_NO_SUCH_NAME;
1339 return VNET_API_ERROR_NAME_SERVER_NEXT_SERVER;
1343 if (clib_net_to_host_u16 (h->anscount) < 1)
1344 return VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES;
1346 curpos = (
u8 *) (h + 1);
1352 if ((len & 0xC0) == 0xC0)
1365 limit = clib_net_to_host_u16 (h->qdcount);
1366 qp = (dns_query_t *) curpos;
1371 limit = clib_net_to_host_u16 (h->anscount);
1373 for (i = 0; i < limit; i++)
1375 pos = pos2 = curpos;
1379 if ((pos2[0] & 0xC0) == 0xC0)
1382 pos2 = response + ((pos2[0] & 0x3f) << 8) + pos2[1];
1391 if ((pos2[0] & 0xc0) == 0xc0)
1397 if (pointer_chase == 0)
1399 pos2 = response + ((pos2[0] & 0x3f) << 8) + pos2[1];
1407 if (pointer_chase == 0)
1410 rr = (dns_rr_t *) pos;
1412 switch (clib_net_to_host_u16 (rr->type))
1417 ttl = clib_net_to_host_u32 (rr->ttl);
1429 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1434 return VNET_API_ERROR_NAME_SERVER_NO_SUCH_NAME;
1472 rmp->
retval = clib_host_to_net_u32 (rv);
1486 u8 *lookup_name = 0;
1492 for (i = 15; i >= 0; i--)
1495 nybble = (digit & 0x0F);
1497 vec_add1 (lookup_name, (nybble - 10) +
'a');
1499 vec_add1 (lookup_name, nybble +
'0');
1501 nybble = (digit & 0xF0) >> 4;
1503 vec_add1 (lookup_name, (nybble - 10) +
'a');
1505 vec_add1 (lookup_name, nybble +
'0');
1510 memcpy (lookup_name + len,
"ip6.arpa", 8);
1514 for (i = 3; i >= 0; i--)
1517 lookup_name =
format (lookup_name,
"%d.", digit);
1519 lookup_name =
format (lookup_name,
"in-addr.arpa");
1547 rmp->
retval = clib_host_to_net_u32 (rv);
1575 u8 **result = va_arg (*args,
u8 **);
1576 u8 **namep = va_arg (*args,
u8 **);
1612 if (!(a4_set + a6_set))
1620 vec_validate (ce, qp_offset +
sizeof (dns_query_t) - 1);
1621 qp = (dns_query_t *) (ce + qp_offset);
1623 qp->type = clib_host_to_net_u16 (DNS_TYPE_ALL);
1629 h = (dns_header_t *) ce;
1635 h->qdcount = clib_host_to_net_u16 (1);
1636 h->anscount = clib_host_to_net_u16 (a4_set + a6_set);
1646 vec_add2 (ce, rru8,
sizeof (*rr) + 4);
1648 rr->type = clib_host_to_net_u16 (DNS_TYPE_A);
1650 rr->ttl = clib_host_to_net_u32 (86400);
1651 rr->rdlength = clib_host_to_net_u16 (4);
1652 memcpy (rr->rdata, &a4, sizeof (a4));
1659 vec_add2 (ce, rru8,
sizeof (*rr) + 16);
1661 rr->type = clib_host_to_net_u16 (DNS_TYPE_AAAA);
1663 rr->ttl = clib_host_to_net_u32 (86400);
1664 rr->rdlength = clib_host_to_net_u16 (16);
1665 memcpy (rr->rdata, &a6, sizeof (a6));
1679 u8 **curpos = va_arg (*args,
u8 **);
1680 int verbose = va_arg (*args,
int);
1685 s =
format (s,
" Name: ");
1693 for (i = 0; i <
len; i++)
1706 qp = (dns_query_t *) pos;
1709 switch (clib_net_to_host_u16 (qp->type))
1712 s =
format (s,
"type A\n");
1715 s =
format (s,
"type AAAA\n");
1718 s =
format (s,
"type ALL\n");
1722 s =
format (s,
"type %d\n", clib_net_to_host_u16 (qp->type));
1727 pos +=
sizeof (*qp);
1743 u8 *reply = va_arg (*args,
u8 *);
1744 u8 **curpos = va_arg (*args,
u8 **);
1745 int verbose = va_arg (*args,
int);
1746 int *print_ip4 = va_arg (*args,
int *);
1747 int *print_ip6 = va_arg (*args,
int *);
1752 int pointer_chase = 0;
1754 u16 rrtype_host_byte_order;
1756 pos = pos2 = *curpos;
1762 if ((pos2[0] & 0xc0) == 0xc0)
1765 pos2 = reply + ((pos2[0] & 0x3f) << 8) + pos2[1];
1773 for (i = 0; i <
len; i++)
1779 if ((pos2[0] & 0xc0) == 0xc0)
1785 if (pointer_chase == 0)
1787 pos2 = reply + ((pos2[0] & 0x3f) << 8) + pos2[1];
1805 if (pointer_chase == 0)
1808 rr = (dns_rr_t *) pos;
1809 rrtype_host_byte_order = clib_net_to_host_u16 (rr->type);
1811 switch (rrtype_host_byte_order)
1816 s =
format (s,
"A: ttl %d %U\n", clib_net_to_host_u32 (rr->ttl),
1823 clib_net_to_host_u32 (rr->ttl));
1828 pos +=
sizeof (*rr) + 4;
1834 s =
format (s,
"AAAA: ttl %d %U\n", clib_net_to_host_u32 (rr->ttl),
1841 clib_net_to_host_u32 (rr->ttl));
1845 pos +=
sizeof (*rr) + 16;
1851 s =
format (s,
"TEXT: ");
1852 for (i = 0; i < clib_net_to_host_u16 (rr->rdlength); i++)
1856 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1859 case DNS_TYPE_HINFO:
1867 s =
format (s,
"HINFO: ");
1870 for (i = 0; i < *
len; i++)
1875 for (i = 0; i < *
len; i++)
1881 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1884 case DNS_TYPE_NAMESERVER:
1887 s =
format (s,
"Nameserver: ");
1891 if ((pos2[0] & 0xc0) == 0xc0)
1894 pos2 = reply + ((pos2[0] & 0x3f) << 8) + pos2[1];
1901 for (i = 0; i <
len; i++)
1905 if (pos2[0] == 0xC0)
1906 pos2 = reply + pos2[1];
1915 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1918 case DNS_TYPE_MAIL_EXCHANGE:
1921 tp = (
u16 *) rr->rdata;
1923 s =
format (s,
"Mail Exchange: Preference %d ", (
u32)
1924 clib_net_to_host_u16 (*tp));
1926 pos2 = rr->rdata + 2;
1929 if (pos2[0] == 0xc0)
1930 pos2 = reply + pos2[1];
1936 for (i = 0; i <
len; i++)
1940 if (pos2[0] == 0xC0)
1941 pos2 = reply + pos2[1];
1951 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1955 case DNS_TYPE_CNAME:
1958 tp = (
u16 *) rr->rdata;
1960 if (rrtype_host_byte_order == DNS_TYPE_CNAME)
1961 s =
format (s,
"CNAME: ");
1968 if (pos2[0] == 0xc0)
1969 pos2 = reply + pos2[1];
1975 for (i = 0; i <
len; i++)
1979 if (pos2[0] == 0xC0)
1980 pos2 = reply + pos2[1];
1989 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1994 s =
format (s,
"type %d: len %d\n",
1995 (
int) clib_net_to_host_u16 (rr->type),
1996 sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength));
1997 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
2009 u8 *reply_as_u8 = va_arg (*args,
u8 *);
2010 int verbose = va_arg (*args,
int);
2018 h = (dns_header_t *) reply_as_u8;
2019 id = clib_net_to_host_u16 (h->id);
2020 flags = clib_net_to_host_u16 (h->flags);
2024 s =
format (s,
"DNS %s: id %d\n", (flags &
DNS_QR) ?
"reply" :
"query",
2026 s =
format (s,
" %s %s %s %s\n",
2027 (flags &
DNS_RA) ?
"recur" :
"no-recur",
2028 (flags &
DNS_RD) ?
"recur-des" :
"no-recur-des",
2029 (flags &
DNS_TC) ?
"trunc" :
"no-trunc",
2030 (flags &
DNS_AA) ?
"auth" :
"non-auth");
2031 s =
format (s,
" %d queries, %d answers, %d name-servers," 2033 clib_net_to_host_u16 (h->qdcount),
2034 clib_net_to_host_u16 (h->anscount),
2035 clib_net_to_host_u16 (h->nscount),
2036 clib_net_to_host_u16 (h->arcount));
2039 curpos = (
u8 *) (h + 1);
2044 s =
format (s,
" Queries:\n");
2045 for (i = 0; i < clib_net_to_host_u16 (h->qdcount); i++)
2054 s =
format (s,
" Replies:\n");
2056 for (i = 0; i < clib_net_to_host_u16 (h->anscount); i++)
2060 verbose, &print_ip4, &print_ip6);
2070 f64 now = va_arg (*args,
f64);
2071 int verbose = va_arg (*args,
int);
2079 s =
format (s,
"The DNS cache is disabled...");
2085 s =
format (s,
"The DNS cache is empty...");
2096 s =
format (s,
"%s is not in the cache...", name);
2106 s =
format (s,
"static u8 dns_reply_data_initializer[] =\n");
2138 if (time_left > 0.0)
2139 s =
format (s,
" TTL left %.1f", time_left);
2141 s =
format (s,
" EXPIRED");
2162 if (ep->flags & DNS_CACHE_ENTRY_FLAG_VALID)
2164 ASSERT (ep->dns_response);
2165 if (ep->flags & DNS_CACHE_ENTRY_FLAG_STATIC)
2170 if (verbose < 2 && ep->flags & DNS_CACHE_ENTRY_FLAG_CNAME)
2171 s = format (s,
"%s%s -> %s", ss, ep->name, ep->cname);
2173 s = format (s,
"%s%s -> %U", ss, ep->name,
2177 if (!(ep->flags & DNS_CACHE_ENTRY_FLAG_STATIC))
2179 f64 time_left = ep->expiration_time - now;
2180 if (time_left > 0.0)
2181 s = format (s,
" TTL left %.1f", time_left);
2183 s = format (s,
" EXPIRED");
2186 s = format (s,
" %d client notifications pending\n",
2187 vec_len(ep->pending_requests));
2192 ASSERT (ep->dns_request);
2193 s = format (s,
"[P] %U", format_dns_reply, ep->dns_request,
2217 if (
unformat (input,
"verbose %d", &verbose))
2219 else if (
unformat (input,
"verbose"))
2221 else if (
unformat (input,
"name %s", &name))
2236 .path =
"show dns cache",
2237 .short_help =
"show dns cache [verbose [nn]]",
2273 .path =
"show dns servers",
2274 .short_help =
"show dns servers",
2300 if (is_add == -1 && is_clear == -1)
2311 case VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED:
2325 case VNET_API_ERROR_NO_SUCH_ENTRY:
2330 case VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED:
2356 case VNET_API_ERROR_ENTRY_ALREADY_EXISTS:
2375 .path =
"dns cache",
2376 .short_help =
"dns cache [add|del|clear] <name> [ip4][ip6]",
2381 #define DNS_FORMAT_TEST 1 2383 #if DNS_FORMAT_TEST > 0 2386 static u8 dns_reply_data_initializer[] =
2387 { 0x0, 0x0, 0x81, 0x80, 0x0, 0x1, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5,
2388 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x3, 0x63, 0x6f, 0x6d,
2393 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x24, 0x23,
2394 0x76, 0x3d, 0x73, 0x70, 0x66, 0x31, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72,
2395 0x65, 0x63, 0x74, 0x3d, 0x5f, 0x73, 0x70, 0x66, 0x2e, 0x6d, 0x61, 0x69,
2396 0x6c, 0x2e, 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0xc0,
2397 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0, 0x6, 0x3, 0x6e, 0x73,
2398 0x35, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0,
2399 0x6, 0x3, 0x6e, 0x73, 0x34, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0,
2400 0x1, 0x50, 0xd4, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x31, 0xc0, 0xc, 0xc0, 0xc,
2401 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x32,
2402 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0, 0x6,
2403 0x3, 0x6e, 0x73, 0x33, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0,
2404 0x6, 0x5c, 0x0, 0x19, 0x0, 0x1, 0x4, 0x6d, 0x74, 0x61, 0x36, 0x3, 0x61,
2405 0x6d, 0x30, 0x8, 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x64, 0x6e, 0x73, 0x3,
2407 0x65, 0x74, 0x0, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0,
2408 0x9, 0x0, 0x1, 0x4, 0x6d, 0x74, 0x61, 0x37, 0xc0, 0xb8, 0xc0, 0xc, 0x0,
2409 0xf, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x9, 0x0, 0x1, 0x4, 0x6d, 0x74,
2410 0x61, 0x35, 0xc0, 0xb8, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x6,
2411 0x5c, 0x0, 0x10, 0x20, 0x1, 0x49, 0x98, 0x0, 0x44, 0x2, 0x4, 0x0, 0x0,
2413 0x0, 0x0, 0x0, 0x0, 0xa7, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x6,
2414 0x5c, 0x0, 0x10, 0x20, 0x1, 0x49, 0x98, 0x0, 0xc, 0xa, 0x6, 0x0, 0x0, 0x0,
2415 0x0, 0x0, 0x2, 0x40, 0x8, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x6,
2416 0x5c, 0x0, 0x10, 0x20, 0x1, 0x49, 0x98, 0x0, 0x58, 0xc, 0x2, 0x0, 0x0,
2418 0x0, 0x0, 0x0, 0x0, 0xa9, 0xc0, 0xc, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x6,
2419 0x5c, 0x0, 0x4, 0x62, 0x8a, 0xfd, 0x6d, 0xc0, 0xc, 0x0, 0x1, 0x0, 0x1,
2421 0x0, 0x6, 0x5c, 0x0, 0x4, 0xce, 0xbe, 0x24, 0x2d, 0xc0, 0xc, 0x0, 0x1,
2423 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x4, 0x62, 0x8b, 0xb4, 0x95, 0xc0, 0xc,
2425 0x6, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x2d, 0xc0, 0x7b, 0xa, 0x68,
2427 0x73, 0x74, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x9, 0x79, 0x61, 0x68,
2428 0x6f, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0xc0, 0x12, 0x78, 0x3a, 0x85, 0x44,
2429 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x1, 0x2c, 0x0, 0x1b, 0xaf, 0x80, 0x0, 0x0,
2434 static u8 dns_reply_data_initializer[] = {
2435 0x00, 0x01, 0x81, 0x80, 0x00, 0x01, 0x00, 0x01,
2436 0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77, 0x05,
2437 0x63, 0x69, 0x73, 0x63, 0x6f, 0x03, 0x63, 0x6f, 0x6d,
2439 0x00, 0x00, 0xff, 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x05,
2440 0x00, 0x01, 0x00, 0x00, 0x0b, 0xd3, 0x00, 0x1a, 0x03,
2441 0x77, 0x77, 0x77, 0x05, 0x63, 0x69, 0x73, 0x63, 0x6f,
2442 0x03, 0x63, 0x6f, 0x6d, 0x06, 0x61, 0x6b, 0x61, 0x64,
2443 0x6e, 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00,
2447 static u8 dns_reply_data_initializer[] = {
2449 0x00, 0x01, 0x81, 0x80, 0x00, 0x01, 0x00, 0x08,
2451 0x00, 0x06, 0x00, 0x06, 0x0a, 0x6f, 0x72, 0x69,
2453 0x67, 0x69, 0x6e, 0x2d, 0x77, 0x77, 0x77, 0x05,
2455 0x63, 0x69, 0x73, 0x63, 0x6f, 0x03, 0x63, 0x6f,
2457 0x6d, 0x00, 0x00, 0xff, 0x00, 0x01, 0x0a, 0x6f,
2459 0x72, 0x69, 0x67, 0x69, 0x6e, 0x2d, 0x77, 0x77,
2461 0x77, 0x05, 0x43, 0x49, 0x53, 0x43, 0x4f, 0xc0,
2464 0x1d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05,
2467 0x9a, 0x00, 0x18, 0x15, 0x72, 0x63, 0x64,
2468 0x6e, 0x39, 0x2d, 0x31, 0x34, 0x70, 0x2d, 0x64, 0x63,
2469 0x7a, 0x30, 0x35, 0x6e, 0x2d, 0x67, 0x73, 0x73, 0x31,
2470 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02, 0x00, 0x01, 0x00,
2471 0x00, 0x05, 0x9a, 0x00, 0x1a, 0x17, 0x61, 0x6c, 0x6c,
2472 0x6e, 0x30, 0x31, 0x2d, 0x61, 0x67, 0x30, 0x39, 0x2d,
2473 0x64, 0x63, 0x7a, 0x30, 0x33, 0x6e, 0x2d, 0x67, 0x73,
2474 0x73, 0x31, 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02, 0x00,
2475 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x10, 0x0d, 0x72,
2476 0x74, 0x70, 0x35, 0x2d, 0x64, 0x6d, 0x7a, 0x2d, 0x67,
2477 0x73, 0x73, 0x31, 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02,
2478 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x18, 0x15,
2479 0x6d, 0x74, 0x76, 0x35, 0x2d, 0x61, 0x70, 0x31, 0x30,
2480 0x2d, 0x64, 0x63, 0x7a, 0x30, 0x36, 0x6e, 0x2d, 0x67,
2481 0x73, 0x73, 0x31, 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02,
2482 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x1b, 0x18,
2483 0x73, 0x6e, 0x67, 0x64, 0x63, 0x30, 0x31, 0x2d, 0x61,
2484 0x62, 0x30, 0x37, 0x2d, 0x64, 0x63, 0x7a, 0x30, 0x31,
2485 0x6e, 0x2d, 0x67, 0x73, 0x73, 0x31, 0xc0, 0x17, 0xc0,
2486 0x26, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a,
2487 0x00, 0x1a, 0x17, 0x61, 0x65, 0x72, 0x30, 0x31, 0x2d,
2488 0x72, 0x34, 0x63, 0x32, 0x35, 0x2d, 0x64, 0x63, 0x7a,
2489 0x30, 0x31, 0x6e, 0x2d, 0x67, 0x73, 0x73, 0x31, 0xc0,
2490 0x17, 0xc0, 0x26, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
2491 0x00, 0x81, 0x00, 0x04, 0x48, 0xa3, 0x04, 0xa1, 0xc0,
2492 0x26, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82,
2493 0x00, 0x10, 0x20, 0x01, 0x04, 0x20, 0x12, 0x01, 0x00,
2494 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
2495 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05,
2496 0x9a, 0x00, 0x02, 0xc0, 0xf4, 0xc0, 0x0c, 0x00, 0x02,
2497 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x02, 0xc0,
2498 0xcd, 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00,
2499 0x05, 0x9a, 0x00, 0x02, 0xc0, 0x8d, 0xc0, 0x0c, 0x00,
2500 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x02,
2501 0xc0, 0x43, 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00,
2502 0x00, 0x05, 0x9a, 0x00, 0x02, 0xc0, 0xa9, 0xc0, 0x0c,
2503 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00,
2504 0x02, 0xc0, 0x67, 0xc0, 0x8d, 0x00, 0x01, 0x00, 0x01,
2505 0x00, 0x00, 0x07, 0x08, 0x00, 0x04, 0x40, 0x66, 0xf6,
2506 0x05, 0xc0, 0xa9, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
2507 0x07, 0x08, 0x00, 0x04, 0xad, 0x24, 0xe0, 0x64, 0xc0,
2508 0x43, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x07, 0x08,
2509 0x00, 0x04, 0x48, 0xa3, 0x04, 0x1c, 0xc0, 0xf4, 0x00,
2510 0x01, 0x00, 0x01, 0x00, 0x00, 0x07, 0x08, 0x00, 0x04,
2511 0xad, 0x26, 0xd4, 0x6c, 0xc0, 0x67, 0x00, 0x01, 0x00,
2512 0x01, 0x00, 0x00, 0x07, 0x08, 0x00, 0x04, 0xad, 0x25,
2513 0x90, 0x64, 0xc0, 0xcd, 0x00, 0x01, 0x00, 0x01, 0x00,
2514 0x00, 0x07, 0x08, 0x00, 0x04, 0xad, 0x27, 0x70, 0x44,
2518 static u8 dns_reply_data_initializer[] =
2519 { 0x0, 0x0, 0x81, 0x80, 0x0, 0x1, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x6,
2520 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3, 0x63, 0x6f, 0x6d, 0x0, 0x0, 0xff,
2521 0x0, 0x1, 0xc0, 0xc, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x2b, 0x0, 0x4,
2522 0xac, 0xd9, 0x3, 0x2e, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x1,
2524 0x0, 0x10, 0x26, 0x7, 0xf8, 0xb0, 0x40, 0x4, 0x8, 0xf, 0x0, 0x0, 0x0, 0x0,
2525 0x0, 0x0, 0x20, 0xe, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x51, 0x7f,
2526 0x0, 0x6, 0x3, 0x6e, 0x73, 0x31, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x6, 0x0, 0x1,
2527 0x0, 0x0, 0x0, 0x3b, 0x0, 0x22, 0xc0, 0x54, 0x9, 0x64, 0x6e, 0x73, 0x2d,
2528 0x61, 0x64, 0x6d, 0x69, 0x6e, 0xc0, 0xc, 0xa, 0x3d, 0xc7, 0x30, 0x0, 0x0,
2529 0x3, 0x84, 0x0, 0x0, 0x3, 0x84, 0x0, 0x0, 0x7, 0x8, 0x0, 0x0, 0x0, 0x3c,
2530 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x11, 0x0, 0x1e,
2531 0x4, 0x61, 0x6c, 0x74, 0x32, 0x5, 0x61, 0x73, 0x70, 0x6d, 0x78, 0x1, 0x6c,
2532 0xc0, 0xc, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x4,
2533 0x0, 0xa, 0xc0, 0x9b, 0xc0, 0xc, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0xe, 0xf,
2534 0x0, 0x24, 0x23, 0x76, 0x3d, 0x73, 0x70, 0x66, 0x31, 0x20, 0x69, 0x6e,
2535 0x63, 0x6c, 0x75, 0x64, 0x65, 0x3a, 0x5f, 0x73, 0x70, 0x66, 0x2e, 0x67,
2536 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x7e, 0x61,
2537 0x6c, 0x6c, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x51, 0x7f, 0x0, 0x6,
2538 0x3, 0x6e, 0x73, 0x32, 0xc0, 0xc, 0xc0, 0xc, 0x1, 0x1, 0x0, 0x1, 0x0, 0x1,
2539 0x51, 0x7f, 0x0, 0xf, 0x0, 0x5, 0x69, 0x73, 0x73, 0x75, 0x65, 0x70, 0x6b,
2540 0x69, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0,
2541 0x1, 0x51, 0x7f, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x34, 0xc0, 0xc, 0xc0, 0xc,
2542 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x9, 0x0, 0x28, 0x4, 0x61,
2543 0x6c, 0x74, 0x33, 0xc0, 0x9b, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1,
2544 0x51, 0x7f, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x33, 0xc0, 0xc, 0xc0, 0xc, 0x0,
2545 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x9, 0x0, 0x32, 0x4, 0x61, 0x6c,
2546 0x74, 0x34, 0xc0, 0x9b, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2,
2548 0x0, 0x9, 0x0, 0x14, 0x4, 0x61, 0x6c, 0x74, 0x31, 0xc0, 0x9b
2553 static u8 dns_reply_data_initializer[] = {
2554 0x00, 0x00, 0x81, 0x80, 0x00, 0x01, 0x00, 0x01,
2555 0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77, 0x0b,
2556 0x77, 0x65, 0x61, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x69,
2557 0x6e, 0x6b, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0xff,
2558 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x05, 0x00, 0x01, 0x00,
2559 0x00, 0x0c, 0x9e, 0x00, 0x1f, 0x0e, 0x64, 0x33, 0x6b,
2560 0x72, 0x30, 0x67, 0x75, 0x62, 0x61, 0x31, 0x64, 0x76,
2561 0x77, 0x66, 0x0a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x66,
2562 0x72, 0x6f, 0x6e, 0x74, 0x03, 0x6e, 0x65, 0x74, 0x00,
2571 u8 *dns_reply_data = 0;
2578 if (
unformat (input,
"verbose %d", &verbose))
2580 else if (
unformat (input,
"verbose"))
2589 memcpy (dns_reply_data, dns_reply_data_initializer,
2590 ARRAY_LEN (dns_reply_data_initializer));
2600 case VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES:
2627 .path =
"test dns format",
2628 .short_help =
"test dns format",
2637 u8 *dns_reply_data = 0;
2643 if (
unformat (input,
"verbose %d", &verbose))
2645 else if (
unformat (input,
"verbose"))
2667 .path =
"test dns unformat",
2668 .short_help =
"test dns unformat <name> [ip4][ip6]",
2687 _vec_len (name) -= 1;
2713 .path =
"test dns expire",
2714 .short_help =
"test dns expire <name>",
2757 int is_recycle = (b0 != 0);
2809 if (b0->
flags & VLIB_BUFFER_NEXT_PRESENT)
2819 b0->
flags |= (VNET_BUFFER_F_LOCALLY_ORIGINATED
2820 | VLIB_BUFFER_TOTAL_LENGTH_VALID);
2830 if (fib_index == (
u32) ~ 0)
2847 if (sw_if_index == ~0)
2850 (
"route to %U exists, fei %d, get_resolving_interface returned" 2859 goto found_src_address;
2870 dns_response = (
u8 *) (udp + 1);
2871 clib_memset (ip, 0,
sizeof (*ip) +
sizeof (*udp));
2884 vec_validate (reply, qp_offset +
sizeof (dns_query_t) - 1);
2886 qp = (dns_query_t *) (reply + qp_offset);
2889 qp->type = clib_host_to_net_u16 (DNS_TYPE_A);
2891 qp->type = clib_host_to_net_u16 (DNS_TYPE_PTR);
2896 vec_insert (reply,
sizeof (dns_header_t), 0);
2898 dh = (dns_header_t *) reply;
2907 dh->flags = clib_host_to_net_u16 (tmp);
2908 dh->qdcount = clib_host_to_net_u16 (1);
2909 dh->anscount = (is_fail == 0) ? clib_host_to_net_u16 (1) : 0;
2924 rr = (dns_rr_t *) rrptr;
2926 rr->type = clib_host_to_net_u16 (DNS_TYPE_A);
2927 rr->class = clib_host_to_net_u16 (1 );
2928 rr->ttl = clib_host_to_net_u32 (ttl);
2929 rr->rdlength = clib_host_to_net_u16 (
sizeof (
ip4_address_t));
2940 rr = (dns_rr_t *) rrptr;
2941 rr->type = clib_host_to_net_u16 (DNS_TYPE_PTR);
2942 rr->class = clib_host_to_net_u16 (1 );
2943 rr->ttl = clib_host_to_net_u32 (ttl);
2944 rr->rdlength = clib_host_to_net_u16 (
vec_len (label_vec));
2965 udp->
src_port = clib_host_to_net_u16 (UDP_DST_PORT_dns);
2976 if (is_recycle == 0)
2991 s =
format (0,
"SCRIPT: dns_enable_disable ");
2992 s =
format (s,
"%s ", mp->
enable ?
"enable" :
"disable");
3002 s =
format (0,
"SCRIPT: dns_name_server_add_del ");
3021 s =
format (0,
"SCRIPT: dns_resolve_name ");
3031 s =
format (0,
"SCRIPT: dns_resolve_ip ");
3039 #include <dns/dns.api.c> 3062 .version = VPP_BUILD_VER,
3063 .description =
"Simple DNS name resolver",
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
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
void vnet_send_dns4_reply(vlib_main_t *vm, dns_main_t *dm, dns_pending_request_t *pr, dns_cache_entry_t *ep, vlib_buffer_t *b0)
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
vl_api_wireguard_peer_flags_t flags
static void * vl_api_dns_enable_disable_t_print(vl_api_dns_enable_disable_t *mp, void *handle)
vnet_main_t * vnet_get_main(void)
#define DNS_CACHE_ENTRY_FLAG_VALID
we have Actual Data
#define DNS_RD
recursion desired
vlib_node_registration_t dns46_reply_node
(constructor) VLIB_REGISTER_NODE (dns46_reply_node)
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
static int delete_random_entry(dns_main_t *dm)
#define REPLY_MACRO2(t, body)
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
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_terminate_c_string(V)
(If necessary) NULL terminate a vector containing a c-string.
#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.
void vnet_send_dns6_reply(vlib_main_t *vm, dns_main_t *dm, dns_pending_request_t *pr, dns_cache_entry_t *ep, vlib_buffer_t *b0)
#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)
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
void vnet_dns_create_resolver_process(vlib_main_t *vm, dns_main_t *dm)
vlib_node_registration_t ip4_lookup_node
(constructor) VLIB_REGISTER_NODE (ip4_lookup_node)
#define clib_memcpy(d, s, n)
static clib_error_t * show_dns_servers_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
clib_spinlock_t cache_lock
#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)
Aggregate type for a prefix.
vlib_frame_t * vlib_get_frame_to_node(vlib_main_t *vm, u32 to_node_index)
static void * vl_api_dns_name_server_add_del_t_print(vl_api_dns_name_server_add_del_t *mp, void *handle)
#define clib_error_return(e, args...)
u8 * format_dns_reply(u8 *s, va_list *args)
u32 * unresolved_entries
Pool indices of unresolved entries.
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.
static void * vl_api_dns_resolve_ip_t_print(vl_api_dns_resolve_ip_t *mp, void *handle)
u32 resolver_process_node_index
resolver process node index
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...
static u32 vlib_get_buffer_index(vlib_main_t *vm, void *p)
Translate buffer pointer into buffer index.
#define hash_create_string(elts, value_bytes)
#define DNS_RETRIES_PER_SERVER
ip4_address_t * ip4_name_servers
upstream name servers, e.g.
static void clib_spinlock_init(clib_spinlock_t *p)
#define DNS_RA
recursion available
u8 * cname
For CNAME records, the "next name" to resolve.
static int dns_enable_disable(vlib_main_t *vm, dns_main_t *dm, int is_enable)
#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
static_always_inline void vlib_buffer_copy_template(vlib_buffer_t *b, vlib_buffer_t *bt)
DNS name resolution request.
static __clib_warn_unused_result u32 vlib_buffer_alloc(vlib_main_t *vm, u32 *buffers, u32 n_buffers)
Allocate buffers into supplied array.
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)
#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)
u32 fib_entry_get_resolving_interface(fib_node_index_t entry_index)
#define pool_free(p)
Free a pool.
void vnet_send_dns_request(vlib_main_t *vm, dns_main_t *dm, dns_cache_entry_t *ep)
static void dns_cache_unlock(dns_main_t *dm)
sll srl srl sll sra u16x4 i
int vnet_dns_cname_indirection_nolock(vlib_main_t *vm, dns_main_t *dm, u32 ep_index, u8 *reply)
Handle cname indirection.
#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.
#define clib_warning(format, args...)
static int dns6_name_server_add_del(dns_main_t *dm, u8 *server_address_as_u8, int is_add)
u16 msg_id_base
message-ID base
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)
vl_api_ikev2_sa_transform_t dh
#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)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
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
static vlib_main_t * vlib_get_main(void)
enable/disable name resolution
uword unformat_dns_reply(unformat_input_t *input, va_list *args)
void vnet_dns_send_dns4_request(vlib_main_t *vm, dns_main_t *dm, dns_cache_entry_t *ep, ip4_address_t *server)
vlib_node_registration_t dns6_request_node
(constructor) VLIB_REGISTER_NODE (dns6_request_node)
static void dns_cache_lock(dns_main_t *dm, int tag)
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
#define foreach_ip_interface_address(lm, a, sw_if_index, loop, body)
VLIB buffer representation.
static void * vlib_frame_vector_args(vlib_frame_t *f)
Get pointer to frame vector data.
int vnet_dns_resolve_name(vlib_main_t *vm, dns_main_t *dm, u8 *name, dns_pending_request_t *t, dns_cache_entry_t **retp)
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 api_main_t * vlibapi_get_main(void)
static u32 random_u32(u32 *seed)
32-bit random number generator
void vnet_dns_send_dns6_request(vlib_main_t *vm, dns_main_t *dm, dns_cache_entry_t *ep, ip6_address_t *server)
ip4_main_t ip4_main
Global ip4 main structure.
static void setup_message_id_table(snat_main_t *sm, api_main_t *am)
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)
f64 expiration_time
Expiration time.
u32 total_length_not_including_first_buffer
Only valid for first buffer in chain.
DNS name resolution reply.
u8 * format_dns_cache(u8 *s, va_list *args)
volatile u8 ref_count
Reference count for this buffer.
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)
vl_api_interface_index_t sw_if_index
#define DNS_RESOLVER_EVENT_PENDING
static void * vl_api_dns_resolve_name_t_print(vl_api_dns_resolve_name_t *mp, void *handle)
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.