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);
84 return VNET_API_ERROR_NO_NAME_SERVERS;
105 if (n_vlib_mains > 1)
124 vl_api_dns_enable_disable_reply_t *rmp;
135 u8 * server_address_as_u8,
int is_add)
151 clib_memcpy (ap, server_address_as_u8,
sizeof (*ap));
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);
249 if (fib_index == (
u32) ~ 0)
268 if (sw_if_index == ~0)
272 (
"route to %U exists, fei %d, get_resolving_interface returned" 281 goto found_src_address;
299 VLIB_BUFFER_TOTAL_LENGTH_VALID | VNET_BUFFER_F_LOCALLY_ORIGINATED;
308 dns_request = (
u8 *) (udp + 1);
320 udp->
src_port = clib_host_to_net_u16 (UDP_DST_PORT_dns_reply);
321 udp->
dst_port = clib_host_to_net_u16 (UDP_DST_PORT_dns);
359 int junk __attribute__ ((unused));
369 if (fib_index == (
u32) ~ 0)
390 goto found_src_address;
408 VLIB_BUFFER_TOTAL_LENGTH_VALID | VNET_BUFFER_F_LOCALLY_ORIGINATED;
415 dns_request = (
u8 *) (udp + 1);
419 clib_host_to_net_u32 (0x6 << 28);
430 udp->
src_port = clib_host_to_net_u16 (UDP_DST_PORT_dns_reply);
431 udp->
dst_port = clib_host_to_net_u16 (UDP_DST_PORT_dns);
457 int last_label_index;
464 last_label_index = 0;
471 rv[last_label_index] = (i - last_label_index) - 1;
472 if ((i - last_label_index) > 63)
474 i - last_label_index);
475 last_label_index =
i;
481 rv[last_label_index] = (i - last_label_index) - 1;
504 *parse_from_here = 0;
507 if ((label[0] & 0xC0) == 0xC0)
509 *parse_from_here = label + 2;
510 offset = ((label[0] & 0x3f) << 8) + label[1];
511 label = full_text +
offset;
518 for (i = 0; i <
len; i++)
522 if ((label[0] & 0xC0) == 0xC0)
524 *parse_from_here = label + 2;
525 offset = ((label[0] & 0x3f) << 8) + label[1];
526 label = full_text +
offset;
533 if (*parse_from_here == 0)
534 *parse_from_here =
label;
571 vec_validate (request, 2 * qp_offset + 2 *
sizeof (dns_query_t) - 1);
573 qp = (dns_query_t *) (request + qp_offset);
575 qp->type = clib_host_to_net_u16 (DNS_TYPE_A);
579 qp = (dns_query_t *) (((
u8 *) qp) +
vec_len (name_copy));
582 qp->type = clib_host_to_net_u16 (DNS_TYPE_AAAA);
586 vec_insert (request,
sizeof (dns_header_t), 0);
588 h = (dns_header_t *) request;
591 h->id = clib_host_to_net_u16 (ep - dm->
entries);
595 h->flags = clib_host_to_net_u16 (tmp);
596 h->qdcount = clib_host_to_net_u16 (2);
669 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
672 return VNET_API_ERROR_NO_SUCH_ENTRY;
683 clib_warning (
"pool elt %d supposedly pending, but not found...",
703 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
710 return VNET_API_ERROR_NO_SUCH_ENTRY;
723 u32 victim_index, start_index,
i;
728 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
736 return VNET_API_ERROR_UNSPECIFIED;
743 for (i = 0; i < limit; i++)
745 victim_index = (start_index +
i) % limit;
763 return VNET_API_ERROR_UNSPECIFIED;
774 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
781 return VNET_API_ERROR_ENTRY_ALREADY_EXISTS;
828 return VNET_API_ERROR_INVALID_VALUE;
843 u32 *indices_to_delete = 0;
866 for (i = 0; i <
vec_len (indices_to_delete); i++)
872 indices_to_delete[i]);
877 (dm, indices_to_delete[i]);
900 memcpy (pr, t,
sizeof (*pr));
958 #define foreach_notification_to_move \ 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)
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;
1471 rmp->
retval = clib_host_to_net_u32 (rv);
1490 u8 *lookup_name = 0;
1496 for (i = 15; i >= 0; i--)
1499 nybble = (digit & 0x0F);
1501 vec_add1 (lookup_name, (nybble - 10) +
'a');
1503 vec_add1 (lookup_name, nybble +
'0');
1505 nybble = (digit & 0xF0) >> 4;
1507 vec_add1 (lookup_name, (nybble - 10) +
'a');
1509 vec_add1 (lookup_name, nybble +
'0');
1514 memcpy (lookup_name + len,
"ip6.arpa", 8);
1518 for (i = 3; i >= 0; i--)
1521 lookup_name =
format (lookup_name,
"%d.", digit);
1523 lookup_name =
format (lookup_name,
"in-addr.arpa");
1551 rmp->
retval = clib_host_to_net_u32 (rv);
1585 u8 **result = va_arg (*args,
u8 **);
1586 u8 **namep = va_arg (*args,
u8 **);
1622 if (!(a4_set + a6_set))
1630 vec_validate (ce, qp_offset +
sizeof (dns_query_t) - 1);
1631 qp = (dns_query_t *) (ce + qp_offset);
1633 qp->type = clib_host_to_net_u16 (DNS_TYPE_ALL);
1639 h = (dns_header_t *) ce;
1645 h->qdcount = clib_host_to_net_u16 (1);
1646 h->anscount = clib_host_to_net_u16 (a4_set + a6_set);
1656 vec_add2 (ce, rru8,
sizeof (*rr) + 4);
1658 rr->type = clib_host_to_net_u16 (DNS_TYPE_A);
1660 rr->ttl = clib_host_to_net_u32 (86400);
1661 rr->rdlength = clib_host_to_net_u16 (4);
1662 memcpy (rr->rdata, &a4, sizeof (a4));
1669 vec_add2 (ce, rru8,
sizeof (*rr) + 16);
1671 rr->type = clib_host_to_net_u16 (DNS_TYPE_AAAA);
1673 rr->ttl = clib_host_to_net_u32 (86400);
1674 rr->rdlength = clib_host_to_net_u16 (16);
1675 memcpy (rr->rdata, &a6, sizeof (a6));
1689 u8 **curpos = va_arg (*args,
u8 **);
1690 int verbose = va_arg (*args,
int);
1695 s =
format (s,
" Name: ");
1703 for (i = 0; i <
len; i++)
1716 qp = (dns_query_t *) pos;
1719 switch (clib_net_to_host_u16 (qp->type))
1722 s =
format (s,
"type A\n");
1725 s =
format (s,
"type AAAA\n");
1728 s =
format (s,
"type ALL\n");
1732 s =
format (s,
"type %d\n", clib_net_to_host_u16 (qp->type));
1737 pos +=
sizeof (*qp);
1753 u8 *reply = va_arg (*args,
u8 *);
1754 u8 **curpos = va_arg (*args,
u8 **);
1755 int verbose = va_arg (*args,
int);
1756 int *print_ip4 = va_arg (*args,
int *);
1757 int *print_ip6 = va_arg (*args,
int *);
1762 int pointer_chase = 0;
1764 u16 rrtype_host_byte_order;
1766 pos = pos2 = *curpos;
1772 if ((pos2[0] & 0xc0) == 0xc0)
1775 pos2 = reply + ((pos2[0] & 0x3f) << 8) + pos2[1];
1783 for (i = 0; i <
len; i++)
1789 if ((pos2[0] & 0xc0) == 0xc0)
1795 if (pointer_chase == 0)
1797 pos2 = reply + ((pos2[0] & 0x3f) << 8) + pos2[1];
1815 if (pointer_chase == 0)
1818 rr = (dns_rr_t *) pos;
1819 rrtype_host_byte_order = clib_net_to_host_u16 (rr->type);
1821 switch (rrtype_host_byte_order)
1826 s =
format (s,
"A: ttl %d %U\n", clib_net_to_host_u32 (rr->ttl),
1833 clib_net_to_host_u32 (rr->ttl));
1838 pos +=
sizeof (*rr) + 4;
1844 s =
format (s,
"AAAA: ttl %d %U\n", clib_net_to_host_u32 (rr->ttl),
1851 clib_net_to_host_u32 (rr->ttl));
1855 pos +=
sizeof (*rr) + 16;
1861 s =
format (s,
"TEXT: ");
1862 for (i = 0; i < clib_net_to_host_u16 (rr->rdlength); i++)
1866 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1869 case DNS_TYPE_HINFO:
1877 s =
format (s,
"HINFO: ");
1880 for (i = 0; i < *
len; i++)
1885 for (i = 0; i < *
len; i++)
1891 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1894 case DNS_TYPE_NAMESERVER:
1897 s =
format (s,
"Nameserver: ");
1901 if ((pos2[0] & 0xc0) == 0xc0)
1904 pos2 = reply + ((pos2[0] & 0x3f) << 8) + pos2[1];
1911 for (i = 0; i <
len; i++)
1915 if (pos2[0] == 0xC0)
1916 pos2 = reply + pos2[1];
1925 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1928 case DNS_TYPE_MAIL_EXCHANGE:
1931 tp = (
u16 *) rr->rdata;
1933 s =
format (s,
"Mail Exchange: Preference %d ", (
u32)
1934 clib_net_to_host_u16 (*tp));
1936 pos2 = rr->rdata + 2;
1939 if (pos2[0] == 0xc0)
1940 pos2 = reply + pos2[1];
1946 for (i = 0; i <
len; i++)
1950 if (pos2[0] == 0xC0)
1951 pos2 = reply + pos2[1];
1961 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1965 case DNS_TYPE_CNAME:
1968 tp = (
u16 *) rr->rdata;
1970 if (rrtype_host_byte_order == DNS_TYPE_CNAME)
1971 s =
format (s,
"CNAME: ");
1978 if (pos2[0] == 0xc0)
1979 pos2 = reply + pos2[1];
1985 for (i = 0; i <
len; i++)
1989 if (pos2[0] == 0xC0)
1990 pos2 = reply + pos2[1];
1999 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
2004 s =
format (s,
"type %d: len %d\n",
2005 (
int) clib_net_to_host_u16 (rr->type),
2006 sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength));
2007 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
2019 u8 *reply_as_u8 = va_arg (*args,
u8 *);
2020 int verbose = va_arg (*args,
int);
2028 h = (dns_header_t *) reply_as_u8;
2029 id = clib_net_to_host_u16 (h->id);
2030 flags = clib_net_to_host_u16 (h->flags);
2034 s =
format (s,
"DNS %s: id %d\n", (flags &
DNS_QR) ?
"reply" :
"query",
2036 s =
format (s,
" %s %s %s %s\n",
2037 (flags &
DNS_RA) ?
"recur" :
"no-recur",
2038 (flags &
DNS_RD) ?
"recur-des" :
"no-recur-des",
2039 (flags &
DNS_TC) ?
"trunc" :
"no-trunc",
2040 (flags &
DNS_AA) ?
"auth" :
"non-auth");
2041 s =
format (s,
" %d queries, %d answers, %d name-servers," 2043 clib_net_to_host_u16 (h->qdcount),
2044 clib_net_to_host_u16 (h->anscount),
2045 clib_net_to_host_u16 (h->nscount),
2046 clib_net_to_host_u16 (h->arcount));
2049 curpos = (
u8 *) (h + 1);
2054 s =
format (s,
" Queries:\n");
2055 for (i = 0; i < clib_net_to_host_u16 (h->qdcount); i++)
2064 s =
format (s,
" Replies:\n");
2066 for (i = 0; i < clib_net_to_host_u16 (h->anscount); i++)
2070 verbose, &print_ip4, &print_ip6);
2080 f64 now = va_arg (*args,
f64);
2081 int verbose = va_arg (*args,
int);
2089 s =
format (s,
"The DNS cache is disabled...");
2095 s =
format (s,
"The DNS cache is empty...");
2106 s =
format (s,
"%s is not in the cache...", name);
2116 s =
format (s,
"static u8 dns_reply_data_initializer[] =\n");
2148 if (time_left > 0.0)
2149 s =
format (s,
" TTL left %.1f", time_left);
2151 s =
format (s,
" EXPIRED");
2172 if (ep->flags & DNS_CACHE_ENTRY_FLAG_VALID)
2174 ASSERT (ep->dns_response);
2175 if (ep->flags & DNS_CACHE_ENTRY_FLAG_STATIC)
2180 if (verbose < 2 && ep->flags & DNS_CACHE_ENTRY_FLAG_CNAME)
2181 s = format (s,
"%s%s -> %s", ss, ep->name, ep->cname);
2183 s = format (s,
"%s%s -> %U", ss, ep->name,
2187 if (!(ep->flags & DNS_CACHE_ENTRY_FLAG_STATIC))
2189 f64 time_left = ep->expiration_time - now;
2190 if (time_left > 0.0)
2191 s = format (s,
" TTL left %.1f", time_left);
2193 s = format (s,
" EXPIRED");
2196 s = format (s,
" %d client notifications pending\n",
2197 vec_len(ep->pending_requests));
2202 ASSERT (ep->dns_request);
2203 s = format (s,
"[P] %U", format_dns_reply, ep->dns_request,
2227 if (
unformat (input,
"verbose %d", &verbose))
2229 else if (
unformat (input,
"verbose"))
2231 else if (
unformat (input,
"name %s", &name))
2246 .path =
"show dns cache",
2247 .short_help =
"show dns cache [verbose [nn]]",
2283 .path =
"show dns servers",
2284 .short_help =
"show dns servers",
2310 if (is_add == -1 && is_clear == -1)
2321 case VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED:
2335 case VNET_API_ERROR_NO_SUCH_ENTRY:
2340 case VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED:
2366 case VNET_API_ERROR_ENTRY_ALREADY_EXISTS:
2385 .path =
"dns cache",
2386 .short_help =
"dns cache [add|del|clear] <name> [ip4][ip6]",
2391 #define DNS_FORMAT_TEST 1 2393 #if DNS_FORMAT_TEST > 0 2396 static u8 dns_reply_data_initializer[] =
2397 { 0x0, 0x0, 0x81, 0x80, 0x0, 0x1, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5,
2398 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x3, 0x63, 0x6f, 0x6d,
2403 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x24, 0x23,
2404 0x76, 0x3d, 0x73, 0x70, 0x66, 0x31, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72,
2405 0x65, 0x63, 0x74, 0x3d, 0x5f, 0x73, 0x70, 0x66, 0x2e, 0x6d, 0x61, 0x69,
2406 0x6c, 0x2e, 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0xc0,
2407 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0, 0x6, 0x3, 0x6e, 0x73,
2408 0x35, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0,
2409 0x6, 0x3, 0x6e, 0x73, 0x34, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0,
2410 0x1, 0x50, 0xd4, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x31, 0xc0, 0xc, 0xc0, 0xc,
2411 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x32,
2412 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0, 0x6,
2413 0x3, 0x6e, 0x73, 0x33, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0,
2414 0x6, 0x5c, 0x0, 0x19, 0x0, 0x1, 0x4, 0x6d, 0x74, 0x61, 0x36, 0x3, 0x61,
2415 0x6d, 0x30, 0x8, 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x64, 0x6e, 0x73, 0x3,
2417 0x65, 0x74, 0x0, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0,
2418 0x9, 0x0, 0x1, 0x4, 0x6d, 0x74, 0x61, 0x37, 0xc0, 0xb8, 0xc0, 0xc, 0x0,
2419 0xf, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x9, 0x0, 0x1, 0x4, 0x6d, 0x74,
2420 0x61, 0x35, 0xc0, 0xb8, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x6,
2421 0x5c, 0x0, 0x10, 0x20, 0x1, 0x49, 0x98, 0x0, 0x44, 0x2, 0x4, 0x0, 0x0,
2423 0x0, 0x0, 0x0, 0x0, 0xa7, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x6,
2424 0x5c, 0x0, 0x10, 0x20, 0x1, 0x49, 0x98, 0x0, 0xc, 0xa, 0x6, 0x0, 0x0, 0x0,
2425 0x0, 0x0, 0x2, 0x40, 0x8, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x6,
2426 0x5c, 0x0, 0x10, 0x20, 0x1, 0x49, 0x98, 0x0, 0x58, 0xc, 0x2, 0x0, 0x0,
2428 0x0, 0x0, 0x0, 0x0, 0xa9, 0xc0, 0xc, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x6,
2429 0x5c, 0x0, 0x4, 0x62, 0x8a, 0xfd, 0x6d, 0xc0, 0xc, 0x0, 0x1, 0x0, 0x1,
2431 0x0, 0x6, 0x5c, 0x0, 0x4, 0xce, 0xbe, 0x24, 0x2d, 0xc0, 0xc, 0x0, 0x1,
2433 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x4, 0x62, 0x8b, 0xb4, 0x95, 0xc0, 0xc,
2435 0x6, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x2d, 0xc0, 0x7b, 0xa, 0x68,
2437 0x73, 0x74, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x9, 0x79, 0x61, 0x68,
2438 0x6f, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0xc0, 0x12, 0x78, 0x3a, 0x85, 0x44,
2439 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x1, 0x2c, 0x0, 0x1b, 0xaf, 0x80, 0x0, 0x0,
2444 static u8 dns_reply_data_initializer[] = {
2445 0x00, 0x01, 0x81, 0x80, 0x00, 0x01, 0x00, 0x01,
2446 0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77, 0x05,
2447 0x63, 0x69, 0x73, 0x63, 0x6f, 0x03, 0x63, 0x6f, 0x6d,
2449 0x00, 0x00, 0xff, 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x05,
2450 0x00, 0x01, 0x00, 0x00, 0x0b, 0xd3, 0x00, 0x1a, 0x03,
2451 0x77, 0x77, 0x77, 0x05, 0x63, 0x69, 0x73, 0x63, 0x6f,
2452 0x03, 0x63, 0x6f, 0x6d, 0x06, 0x61, 0x6b, 0x61, 0x64,
2453 0x6e, 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00,
2457 static u8 dns_reply_data_initializer[] = {
2459 0x00, 0x01, 0x81, 0x80, 0x00, 0x01, 0x00, 0x08,
2461 0x00, 0x06, 0x00, 0x06, 0x0a, 0x6f, 0x72, 0x69,
2463 0x67, 0x69, 0x6e, 0x2d, 0x77, 0x77, 0x77, 0x05,
2465 0x63, 0x69, 0x73, 0x63, 0x6f, 0x03, 0x63, 0x6f,
2467 0x6d, 0x00, 0x00, 0xff, 0x00, 0x01, 0x0a, 0x6f,
2469 0x72, 0x69, 0x67, 0x69, 0x6e, 0x2d, 0x77, 0x77,
2471 0x77, 0x05, 0x43, 0x49, 0x53, 0x43, 0x4f, 0xc0,
2474 0x1d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05,
2477 0x9a, 0x00, 0x18, 0x15, 0x72, 0x63, 0x64,
2478 0x6e, 0x39, 0x2d, 0x31, 0x34, 0x70, 0x2d, 0x64, 0x63,
2479 0x7a, 0x30, 0x35, 0x6e, 0x2d, 0x67, 0x73, 0x73, 0x31,
2480 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02, 0x00, 0x01, 0x00,
2481 0x00, 0x05, 0x9a, 0x00, 0x1a, 0x17, 0x61, 0x6c, 0x6c,
2482 0x6e, 0x30, 0x31, 0x2d, 0x61, 0x67, 0x30, 0x39, 0x2d,
2483 0x64, 0x63, 0x7a, 0x30, 0x33, 0x6e, 0x2d, 0x67, 0x73,
2484 0x73, 0x31, 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02, 0x00,
2485 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x10, 0x0d, 0x72,
2486 0x74, 0x70, 0x35, 0x2d, 0x64, 0x6d, 0x7a, 0x2d, 0x67,
2487 0x73, 0x73, 0x31, 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02,
2488 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x18, 0x15,
2489 0x6d, 0x74, 0x76, 0x35, 0x2d, 0x61, 0x70, 0x31, 0x30,
2490 0x2d, 0x64, 0x63, 0x7a, 0x30, 0x36, 0x6e, 0x2d, 0x67,
2491 0x73, 0x73, 0x31, 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02,
2492 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x1b, 0x18,
2493 0x73, 0x6e, 0x67, 0x64, 0x63, 0x30, 0x31, 0x2d, 0x61,
2494 0x62, 0x30, 0x37, 0x2d, 0x64, 0x63, 0x7a, 0x30, 0x31,
2495 0x6e, 0x2d, 0x67, 0x73, 0x73, 0x31, 0xc0, 0x17, 0xc0,
2496 0x26, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a,
2497 0x00, 0x1a, 0x17, 0x61, 0x65, 0x72, 0x30, 0x31, 0x2d,
2498 0x72, 0x34, 0x63, 0x32, 0x35, 0x2d, 0x64, 0x63, 0x7a,
2499 0x30, 0x31, 0x6e, 0x2d, 0x67, 0x73, 0x73, 0x31, 0xc0,
2500 0x17, 0xc0, 0x26, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
2501 0x00, 0x81, 0x00, 0x04, 0x48, 0xa3, 0x04, 0xa1, 0xc0,
2502 0x26, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82,
2503 0x00, 0x10, 0x20, 0x01, 0x04, 0x20, 0x12, 0x01, 0x00,
2504 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
2505 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05,
2506 0x9a, 0x00, 0x02, 0xc0, 0xf4, 0xc0, 0x0c, 0x00, 0x02,
2507 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x02, 0xc0,
2508 0xcd, 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00,
2509 0x05, 0x9a, 0x00, 0x02, 0xc0, 0x8d, 0xc0, 0x0c, 0x00,
2510 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x02,
2511 0xc0, 0x43, 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00,
2512 0x00, 0x05, 0x9a, 0x00, 0x02, 0xc0, 0xa9, 0xc0, 0x0c,
2513 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00,
2514 0x02, 0xc0, 0x67, 0xc0, 0x8d, 0x00, 0x01, 0x00, 0x01,
2515 0x00, 0x00, 0x07, 0x08, 0x00, 0x04, 0x40, 0x66, 0xf6,
2516 0x05, 0xc0, 0xa9, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
2517 0x07, 0x08, 0x00, 0x04, 0xad, 0x24, 0xe0, 0x64, 0xc0,
2518 0x43, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x07, 0x08,
2519 0x00, 0x04, 0x48, 0xa3, 0x04, 0x1c, 0xc0, 0xf4, 0x00,
2520 0x01, 0x00, 0x01, 0x00, 0x00, 0x07, 0x08, 0x00, 0x04,
2521 0xad, 0x26, 0xd4, 0x6c, 0xc0, 0x67, 0x00, 0x01, 0x00,
2522 0x01, 0x00, 0x00, 0x07, 0x08, 0x00, 0x04, 0xad, 0x25,
2523 0x90, 0x64, 0xc0, 0xcd, 0x00, 0x01, 0x00, 0x01, 0x00,
2524 0x00, 0x07, 0x08, 0x00, 0x04, 0xad, 0x27, 0x70, 0x44,
2528 static u8 dns_reply_data_initializer[] =
2529 { 0x0, 0x0, 0x81, 0x80, 0x0, 0x1, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x6,
2530 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3, 0x63, 0x6f, 0x6d, 0x0, 0x0, 0xff,
2531 0x0, 0x1, 0xc0, 0xc, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x2b, 0x0, 0x4,
2532 0xac, 0xd9, 0x3, 0x2e, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x1,
2534 0x0, 0x10, 0x26, 0x7, 0xf8, 0xb0, 0x40, 0x4, 0x8, 0xf, 0x0, 0x0, 0x0, 0x0,
2535 0x0, 0x0, 0x20, 0xe, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x51, 0x7f,
2536 0x0, 0x6, 0x3, 0x6e, 0x73, 0x31, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x6, 0x0, 0x1,
2537 0x0, 0x0, 0x0, 0x3b, 0x0, 0x22, 0xc0, 0x54, 0x9, 0x64, 0x6e, 0x73, 0x2d,
2538 0x61, 0x64, 0x6d, 0x69, 0x6e, 0xc0, 0xc, 0xa, 0x3d, 0xc7, 0x30, 0x0, 0x0,
2539 0x3, 0x84, 0x0, 0x0, 0x3, 0x84, 0x0, 0x0, 0x7, 0x8, 0x0, 0x0, 0x0, 0x3c,
2540 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x11, 0x0, 0x1e,
2541 0x4, 0x61, 0x6c, 0x74, 0x32, 0x5, 0x61, 0x73, 0x70, 0x6d, 0x78, 0x1, 0x6c,
2542 0xc0, 0xc, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x4,
2543 0x0, 0xa, 0xc0, 0x9b, 0xc0, 0xc, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0xe, 0xf,
2544 0x0, 0x24, 0x23, 0x76, 0x3d, 0x73, 0x70, 0x66, 0x31, 0x20, 0x69, 0x6e,
2545 0x63, 0x6c, 0x75, 0x64, 0x65, 0x3a, 0x5f, 0x73, 0x70, 0x66, 0x2e, 0x67,
2546 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x7e, 0x61,
2547 0x6c, 0x6c, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x51, 0x7f, 0x0, 0x6,
2548 0x3, 0x6e, 0x73, 0x32, 0xc0, 0xc, 0xc0, 0xc, 0x1, 0x1, 0x0, 0x1, 0x0, 0x1,
2549 0x51, 0x7f, 0x0, 0xf, 0x0, 0x5, 0x69, 0x73, 0x73, 0x75, 0x65, 0x70, 0x6b,
2550 0x69, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0,
2551 0x1, 0x51, 0x7f, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x34, 0xc0, 0xc, 0xc0, 0xc,
2552 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x9, 0x0, 0x28, 0x4, 0x61,
2553 0x6c, 0x74, 0x33, 0xc0, 0x9b, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1,
2554 0x51, 0x7f, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x33, 0xc0, 0xc, 0xc0, 0xc, 0x0,
2555 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x9, 0x0, 0x32, 0x4, 0x61, 0x6c,
2556 0x74, 0x34, 0xc0, 0x9b, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2,
2558 0x0, 0x9, 0x0, 0x14, 0x4, 0x61, 0x6c, 0x74, 0x31, 0xc0, 0x9b
2563 static u8 dns_reply_data_initializer[] = {
2564 0x00, 0x00, 0x81, 0x80, 0x00, 0x01, 0x00, 0x01,
2565 0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77, 0x0b,
2566 0x77, 0x65, 0x61, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x69,
2567 0x6e, 0x6b, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0xff,
2568 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x05, 0x00, 0x01, 0x00,
2569 0x00, 0x0c, 0x9e, 0x00, 0x1f, 0x0e, 0x64, 0x33, 0x6b,
2570 0x72, 0x30, 0x67, 0x75, 0x62, 0x61, 0x31, 0x64, 0x76,
2571 0x77, 0x66, 0x0a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x66,
2572 0x72, 0x6f, 0x6e, 0x74, 0x03, 0x6e, 0x65, 0x74, 0x00,
2581 u8 *dns_reply_data = 0;
2588 if (
unformat (input,
"verbose %d", &verbose))
2590 else if (
unformat (input,
"verbose"))
2599 memcpy (dns_reply_data, dns_reply_data_initializer,
2600 ARRAY_LEN (dns_reply_data_initializer));
2610 case VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES:
2637 .path =
"test dns format",
2638 .short_help =
"test dns format",
2647 u8 *dns_reply_data = 0;
2653 if (
unformat (input,
"verbose %d", &verbose))
2655 else if (
unformat (input,
"verbose"))
2677 .path =
"test dns unformat",
2678 .short_help =
"test dns unformat <name> [ip4][ip6]",
2697 _vec_len (name) -= 1;
2723 .path =
"test dns expire",
2724 .short_help =
"test dns expire <name>",
2766 int is_recycle = (b0 != 0);
2818 if (b0->
flags & VLIB_BUFFER_NEXT_PRESENT)
2828 b0->
flags |= (VNET_BUFFER_F_LOCALLY_ORIGINATED
2829 | VLIB_BUFFER_TOTAL_LENGTH_VALID);
2839 if (fib_index == (
u32) ~ 0)
2856 if (sw_if_index == ~0)
2859 (
"route to %U exists, fei %d, get_resolving_interface returned" 2868 goto found_src_address;
2879 dns_response = (
u8 *) (udp + 1);
2880 clib_memset (ip, 0,
sizeof (*ip) +
sizeof (*udp));
2893 vec_validate (reply, qp_offset +
sizeof (dns_query_t) - 1);
2895 qp = (dns_query_t *) (reply + qp_offset);
2898 qp->type = clib_host_to_net_u16 (DNS_TYPE_A);
2900 qp->type = clib_host_to_net_u16 (DNS_TYPE_PTR);
2905 vec_insert (reply,
sizeof (dns_header_t), 0);
2907 dh = (dns_header_t *) reply;
2916 dh->flags = clib_host_to_net_u16 (tmp);
2917 dh->qdcount = clib_host_to_net_u16 (1);
2918 dh->anscount = (is_fail == 0) ? clib_host_to_net_u16 (1) : 0;
2933 rr = (dns_rr_t *) rrptr;
2935 rr->type = clib_host_to_net_u16 (DNS_TYPE_A);
2936 rr->class = clib_host_to_net_u16 (1 );
2937 rr->ttl = clib_host_to_net_u32 (ttl);
2938 rr->rdlength = clib_host_to_net_u16 (
sizeof (
ip4_address_t));
2949 rr = (dns_rr_t *) rrptr;
2950 rr->type = clib_host_to_net_u16 (DNS_TYPE_PTR);
2951 rr->class = clib_host_to_net_u16 (1 );
2952 rr->ttl = clib_host_to_net_u32 (ttl);
2953 rr->rdlength = clib_host_to_net_u16 (
vec_len (label_vec));
2974 udp->
src_port = clib_host_to_net_u16 (UDP_DST_PORT_dns);
2985 if (is_recycle == 0)
3000 s =
format (0,
"SCRIPT: dns_enable_disable ");
3001 s =
format (s,
"%s ", mp->
enable ?
"enable" :
"disable");
3011 s =
format (0,
"SCRIPT: dns_name_server_add_del ");
3030 s =
format (0,
"SCRIPT: dns_resolve_name ");
3040 s =
format (0,
"SCRIPT: dns_resolve_ip ");
3048 #include <dns/dns.api.c> 3072 .version = VPP_BUILD_VER,
3073 .description =
"Simple DNS name resolver",
#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 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
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 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)
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.
#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
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)
void vnet_send_dns_request(dns_main_t *dm, dns_cache_entry_t *ep)
clib_spinlock_t cache_lock
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
vl_api_interface_index_t sw_if_index
#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.
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.
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.
#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.
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.
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 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)
#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 dns6_request_node
(constructor) VLIB_REGISTER_NODE (dns6_request_node)
static void dns_cache_lock(dns_main_t *dm, int tag)
void vnet_dns_create_resolver_process(dns_main_t *dm)
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 api_main_t * vlibapi_get_main(void)
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 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)
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
f64 expiration_time
Expiration time.
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,...)
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)
static int dns_enable_disable(dns_main_t *dm, int is_enable)
#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.