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);
80 return VNET_API_ERROR_NO_NAME_SERVERS;
104 vl_api_dns_enable_disable_reply_t *rmp;
115 u8 * server_address_as_u8,
int is_add)
131 clib_memcpy (ap, server_address_as_u8,
sizeof (*ap));
144 return VNET_API_ERROR_NAME_SERVER_NOT_FOUND;
151 u8 * server_address_as_u8,
int is_add)
167 clib_memcpy (ap, server_address_as_u8,
sizeof (*ap));
180 return VNET_API_ERROR_NAME_SERVER_NOT_FOUND;
189 vl_api_dns_name_server_add_del_reply_t *rmp;
197 REPLY_MACRO (VL_API_DNS_NAME_SERVER_ADD_DEL_REPLY);
211 u32 sw_if_index, fib_index;
229 if (fib_index == (
u32) ~ 0)
246 if (sw_if_index == ~0)
249 (
"route to %U exists, fei %d, get_resolving_interface returned" 258 goto found_src_address;
276 VLIB_BUFFER_TOTAL_LENGTH_VALID | VNET_BUFFER_F_LOCALLY_ORIGINATED;
281 memset (ip, 0,
sizeof (*ip));
283 memset (udp, 0,
sizeof (*udp));
285 dns_request = (
u8 *) (udp + 1);
297 udp->
src_port = clib_host_to_net_u16 (UDP_DST_PORT_dns_reply);
298 udp->
dst_port = clib_host_to_net_u16 (UDP_DST_PORT_dns);
327 u32 sw_if_index, fib_index;
336 int junk __attribute__ ((unused));
346 if (fib_index == (
u32) ~ 0)
366 goto found_src_address;
384 VLIB_BUFFER_TOTAL_LENGTH_VALID | VNET_BUFFER_F_LOCALLY_ORIGINATED;
387 memset (ip, 0,
sizeof (*ip));
389 memset (udp, 0,
sizeof (*udp));
391 dns_request = (
u8 *) (udp + 1);
395 clib_host_to_net_u32 (0x6 << 28);
406 udp->
src_port = clib_host_to_net_u16 (UDP_DST_PORT_dns_reply);
407 udp->
dst_port = clib_host_to_net_u16 (UDP_DST_PORT_dns);
433 int last_label_index;
440 last_label_index = 0;
447 rv[last_label_index] = (i - last_label_index) - 1;
448 if ((i - last_label_index) > 63)
450 i - last_label_index);
451 last_label_index =
i;
457 rv[last_label_index] = (i - last_label_index) - 1;
480 *parse_from_here = 0;
483 if ((label[0] & 0xC0) == 0xC0)
485 *parse_from_here = label + 2;
486 offset = ((label[0] & 0x3f) << 8) + label[1];
487 label = full_text +
offset;
494 for (i = 0; i < len; i++)
498 if ((label[0] & 0xC0) == 0xC0)
500 *parse_from_here = label + 2;
501 offset = ((label[0] & 0x3f) << 8) + label[1];
502 label = full_text +
offset;
509 if (*parse_from_here == 0)
510 *parse_from_here = label;
547 vec_validate (request, 2 * qp_offset + 2 *
sizeof (dns_query_t) - 1);
549 qp = (dns_query_t *) (request + qp_offset);
551 qp->type = clib_host_to_net_u16 (DNS_TYPE_A);
555 qp = (dns_query_t *) (((
u8 *) qp) +
vec_len (name_copy));
558 qp->type = clib_host_to_net_u16 (DNS_TYPE_AAAA);
562 vec_insert (request,
sizeof (dns_header_t), 0);
564 h = (dns_header_t *) request;
567 h->id = clib_host_to_net_u16 (ep - dm->
entries);
571 h->flags = clib_host_to_net_u16 (tmp);
572 h->qdcount = clib_host_to_net_u16 (2);
644 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
647 return VNET_API_ERROR_NO_SUCH_ENTRY;
658 clib_warning (
"pool elt %d supposedly pending, but not found...",
678 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
685 return VNET_API_ERROR_NO_SUCH_ENTRY;
698 u32 victim_index, start_index,
i;
703 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
711 return VNET_API_ERROR_UNSPECIFIED;
718 for (i = 0; i < limit; i++)
720 victim_index = (start_index +
i) % limit;
738 return VNET_API_ERROR_UNSPECIFIED;
749 return VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED;
756 return VNET_API_ERROR_ENTRY_ALREADY_EXISTS;
771 memset (ep, 0,
sizeof (*ep));
812 u32 *indices_to_delete = 0;
835 for (i = 0; i <
vec_len (indices_to_delete); i++)
841 indices_to_delete[i]);
846 (dm, indices_to_delete[i]);
870 memcpy (pr, t,
sizeof (*pr));
890 memset (ep, 0,
sizeof (*ep));
928 #define foreach_notification_to_move \ 955 h = (dns_header_t *) reply;
956 flags = clib_net_to_host_u16 (h->flags);
973 curpos = (
u8 *) (h + 1);
978 for (i = 0; i < clib_net_to_host_u16 (h->qdcount); i++)
985 pos +=
sizeof (dns_query_t);
989 if ((pos2[0] & 0xC0) == 0xC0)
995 for (i = 0; i < clib_net_to_host_u16 (h->anscount); i++)
997 rr = (dns_rr_t *) pos;
998 switch (clib_net_to_host_u16 (rr->type))
1009 case DNS_TYPE_CNAME:
1017 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1019 if ((pos2[0] & 0xc0) == 0xc0)
1026 flags &= ~DNS_RCODE_MASK;
1028 h->flags = clib_host_to_net_u16 (flags);
1040 goto found_last_request;
1042 clib_warning (
"pool elt %d supposedly pending, but not found...", ep_index);
1050 _vec_len (cname) -= 1;
1066 memset (next_ep, 0,
sizeof (*next_ep));
1069 _vec_len (next_ep->
name) -= 1;
1079 #define _(a) next_ep->a = ep->a; ep->a = 0; 1084 name_copy =
vec_dup (request);
1086 qp_offset =
vec_len (request);
1089 vec_validate (request, 2 * qp_offset + 2 *
sizeof (dns_query_t) - 1);
1091 qp = (dns_query_t *) (request + qp_offset);
1093 qp->type = clib_host_to_net_u16 (DNS_TYPE_A);
1096 qp = (dns_query_t *) (((
u8 *) qp) +
vec_len (name_copy));
1099 qp->type = clib_host_to_net_u16 (DNS_TYPE_AAAA);
1103 vec_insert (request,
sizeof (dns_header_t), 0);
1105 h = (dns_header_t *) request;
1108 h->id = clib_host_to_net_u16 (next_ep - dm->
entries);
1112 h->qdcount = clib_host_to_net_u16 (2);
1140 u8 *curpos, *pos, *pos2;
1146 h = (dns_header_t *) response;
1147 flags = clib_net_to_host_u16 (h->flags);
1159 return VNET_API_ERROR_NAME_SERVER_NO_SUCH_NAME;
1164 return VNET_API_ERROR_NAME_SERVER_NEXT_SERVER;
1168 if (clib_net_to_host_u16 (h->anscount) < 1)
1169 return VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES;
1171 curpos = (
u8 *) (h + 1);
1177 if ((len & 0xC0) == 0xC0)
1190 limit = clib_net_to_host_u16 (h->qdcount);
1191 qp = (dns_query_t *) curpos;
1196 limit = clib_net_to_host_u16 (h->anscount);
1198 for (i = 0; i < limit; i++)
1200 pos = pos2 = curpos;
1204 if ((pos2[0] & 0xC0) == 0xC0)
1207 pos2 = response + ((pos2[0] & 0x3f) << 8) + pos2[1];
1216 if ((pos2[0] & 0xc0) == 0xc0)
1222 if (pointer_chase == 0)
1224 pos2 = response + ((pos2[0] & 0x3f) << 8) + pos2[1];
1232 if (pointer_chase == 0)
1235 rr = (dns_rr_t *) pos;
1237 switch (clib_net_to_host_u16 (rr->type))
1243 ttl = clib_net_to_host_u32 (rr->ttl);
1244 if (min_ttlp && *min_ttlp > ttl)
1250 ttl = clib_net_to_host_u32 (rr->ttl);
1251 if (min_ttlp && *min_ttlp > ttl)
1262 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1267 return VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES;
1281 u8 *curpos, *pos, *pos2;
1286 u8 *junk __attribute__ ((unused));
1290 h = (dns_header_t *) response;
1291 flags = clib_net_to_host_u16 (h->flags);
1303 return VNET_API_ERROR_NAME_SERVER_NO_SUCH_NAME;
1308 return VNET_API_ERROR_NAME_SERVER_NEXT_SERVER;
1312 if (clib_net_to_host_u16 (h->anscount) < 1)
1313 return VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES;
1315 curpos = (
u8 *) (h + 1);
1321 if ((len & 0xC0) == 0xC0)
1334 limit = clib_net_to_host_u16 (h->qdcount);
1335 qp = (dns_query_t *) curpos;
1340 limit = clib_net_to_host_u16 (h->anscount);
1342 for (i = 0; i < limit; i++)
1344 pos = pos2 = curpos;
1348 if ((pos2[0] & 0xC0) == 0xC0)
1351 pos2 = response + ((pos2[0] & 0x3f) << 8) + pos2[1];
1360 if ((pos2[0] & 0xc0) == 0xc0)
1366 if (pointer_chase == 0)
1368 pos2 = response + ((pos2[0] & 0x3f) << 8) + pos2[1];
1376 if (pointer_chase == 0)
1379 rr = (dns_rr_t *) pos;
1381 switch (clib_net_to_host_u16 (rr->type))
1386 ttl = clib_net_to_host_u32 (rr->ttl);
1398 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1403 return VNET_API_ERROR_NAME_SERVER_NO_SUCH_NAME;
1440 rmp->
retval = clib_host_to_net_u32 (rv);
1459 u8 *lookup_name = 0;
1465 for (i = 15; i >= 0; i--)
1468 nybble = (digit & 0x0F);
1470 vec_add1 (lookup_name, (nybble - 10) +
'a');
1472 vec_add1 (lookup_name, nybble +
'0');
1474 nybble = (digit & 0xF0) >> 4;
1476 vec_add1 (lookup_name, (nybble - 10) +
'a');
1478 vec_add1 (lookup_name, nybble +
'0');
1483 memcpy (lookup_name + len,
"ip6.arpa", 8);
1487 for (i = 3; i >= 0; i--)
1490 lookup_name =
format (lookup_name,
"%d.", digit);
1492 lookup_name =
format (lookup_name,
"in-addr.arpa");
1520 rmp->
retval = clib_host_to_net_u32 (rv);
1531 #define vl_msg_name_crc_list 1533 #undef vl_msg_name_crc_list 1538 #define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id); 1539 foreach_vl_msg_name_crc_dns;
1543 #define foreach_dns_api_msg \ 1544 _(DNS_ENABLE_DISABLE, dns_enable_disable) \ 1545 _(DNS_NAME_SERVER_ADD_DEL, dns_name_server_add_del) \ 1546 _(DNS_RESOLVE_NAME, dns_resolve_name) \ 1547 _(DNS_RESOLVE_IP, dns_resolve_ip) 1553 vl_msg_api_set_handlers(VL_API_##N, #n, \ 1554 vl_api_##n##_t_handler, \ 1556 vl_api_##n##_t_endian, \ 1557 vl_api_##n##_t_print, \ 1558 sizeof(vl_api_##n##_t), 1); 1619 u8 **result = va_arg (*args,
u8 **);
1620 u8 **namep = va_arg (*args,
u8 **);
1656 if (!(a4_set + a6_set))
1664 vec_validate (ce, qp_offset +
sizeof (dns_query_t) - 1);
1665 qp = (dns_query_t *) (ce + qp_offset);
1667 qp->type = clib_host_to_net_u16 (DNS_TYPE_ALL);
1673 h = (dns_header_t *) ce;
1679 h->qdcount = clib_host_to_net_u16 (1);
1680 h->anscount = clib_host_to_net_u16 (a4_set + a6_set);
1690 vec_add2 (ce, rru8,
sizeof (*rr) + 4);
1692 rr->type = clib_host_to_net_u16 (DNS_TYPE_A);
1694 rr->ttl = clib_host_to_net_u32 (86400);
1695 rr->rdlength = clib_host_to_net_u16 (4);
1696 memcpy (rr->rdata, &a4, sizeof (a4));
1703 vec_add2 (ce, rru8,
sizeof (*rr) + 16);
1705 rr->type = clib_host_to_net_u16 (DNS_TYPE_AAAA);
1707 rr->ttl = clib_host_to_net_u32 (86400);
1708 rr->rdlength = clib_host_to_net_u16 (16);
1709 memcpy (rr->rdata, &a6, sizeof (a6));
1723 u8 **curpos = va_arg (*args,
u8 **);
1724 int verbose = va_arg (*args,
int);
1729 s =
format (s,
" Name: ");
1737 for (i = 0; i < len; i++)
1750 qp = (dns_query_t *) pos;
1753 switch (clib_net_to_host_u16 (qp->type))
1756 s =
format (s,
"type A\n");
1759 s =
format (s,
"type AAAA\n");
1762 s =
format (s,
"type ALL\n");
1766 s =
format (s,
"type %d\n", clib_net_to_host_u16 (qp->type));
1771 pos +=
sizeof (*qp);
1787 u8 *reply = va_arg (*args,
u8 *);
1788 u8 **curpos = va_arg (*args,
u8 **);
1789 int verbose = va_arg (*args,
int);
1790 int *print_ip4 = va_arg (*args,
int *);
1791 int *print_ip6 = va_arg (*args,
int *);
1796 int pointer_chase = 0;
1798 u16 rrtype_host_byte_order;
1800 pos = pos2 = *curpos;
1806 if ((pos2[0] & 0xc0) == 0xc0)
1809 pos2 = reply + ((pos2[0] & 0x3f) << 8) + pos2[1];
1817 for (i = 0; i < len; i++)
1823 if ((pos2[0] & 0xc0) == 0xc0)
1829 if (pointer_chase == 0)
1831 pos2 = reply + ((pos2[0] & 0x3f) << 8) + pos2[1];
1849 if (pointer_chase == 0)
1852 rr = (dns_rr_t *) pos;
1853 rrtype_host_byte_order = clib_net_to_host_u16 (rr->type);
1855 switch (rrtype_host_byte_order)
1860 s =
format (s,
"A: ttl %d %U\n", clib_net_to_host_u32 (rr->ttl),
1867 clib_net_to_host_u32 (rr->ttl));
1872 pos +=
sizeof (*rr) + 4;
1878 s =
format (s,
"AAAA: ttl %d %U\n", clib_net_to_host_u32 (rr->ttl),
1885 clib_net_to_host_u32 (rr->ttl));
1889 pos +=
sizeof (*rr) + 16;
1895 s =
format (s,
"TEXT: ");
1896 for (i = 0; i < clib_net_to_host_u16 (rr->rdlength); i++)
1900 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1903 case DNS_TYPE_HINFO:
1911 s =
format (s,
"HINFO: ");
1914 for (i = 0; i < *len; i++)
1919 for (i = 0; i < *len; i++)
1925 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1928 case DNS_TYPE_NAMESERVER:
1931 s =
format (s,
"Nameserver: ");
1935 if ((pos2[0] & 0xc0) == 0xc0)
1938 pos2 = reply + ((pos2[0] & 0x3f) << 8) + pos2[1];
1945 for (i = 0; i < len; i++)
1949 if (pos2[0] == 0xC0)
1950 pos2 = reply + pos2[1];
1959 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1962 case DNS_TYPE_MAIL_EXCHANGE:
1965 tp = (
u16 *) rr->rdata;
1967 s =
format (s,
"Mail Exchange: Preference %d ", (
u32)
1968 clib_net_to_host_u16 (*tp));
1970 pos2 = rr->rdata + 2;
1973 if (pos2[0] == 0xc0)
1974 pos2 = reply + pos2[1];
1980 for (i = 0; i < len; i++)
1984 if (pos2[0] == 0xC0)
1985 pos2 = reply + pos2[1];
1995 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
1999 case DNS_TYPE_CNAME:
2002 tp = (
u16 *) rr->rdata;
2004 if (rrtype_host_byte_order == DNS_TYPE_CNAME)
2005 s =
format (s,
"CNAME: ");
2012 if (pos2[0] == 0xc0)
2013 pos2 = reply + pos2[1];
2019 for (i = 0; i < len; i++)
2023 if (pos2[0] == 0xC0)
2024 pos2 = reply + pos2[1];
2033 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
2038 s =
format (s,
"type %d: len %d\n",
2039 (
int) clib_net_to_host_u16 (rr->type),
2040 sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength));
2041 pos +=
sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength);
2053 u8 *reply_as_u8 = va_arg (*args,
u8 *);
2054 int verbose = va_arg (*args,
int);
2062 h = (dns_header_t *) reply_as_u8;
2063 id = clib_net_to_host_u16 (h->id);
2064 flags = clib_net_to_host_u16 (h->flags);
2068 s =
format (s,
"DNS %s: id %d\n", (flags &
DNS_QR) ?
"reply" :
"query",
2070 s =
format (s,
" %s %s %s %s\n",
2071 (flags &
DNS_RA) ?
"recur" :
"no-recur",
2072 (flags &
DNS_RD) ?
"recur-des" :
"no-recur-des",
2073 (flags &
DNS_TC) ?
"trunc" :
"no-trunc",
2074 (flags &
DNS_AA) ?
"auth" :
"non-auth");
2075 s =
format (s,
" %d queries, %d answers, %d name-servers," 2077 clib_net_to_host_u16 (h->qdcount),
2078 clib_net_to_host_u16 (h->anscount),
2079 clib_net_to_host_u16 (h->nscount),
2080 clib_net_to_host_u16 (h->arcount));
2083 curpos = (
u8 *) (h + 1);
2088 s =
format (s,
" Queries:\n");
2089 for (i = 0; i < clib_net_to_host_u16 (h->qdcount); i++)
2098 s =
format (s,
" Replies:\n");
2100 for (i = 0; i < clib_net_to_host_u16 (h->anscount); i++)
2104 verbose, &print_ip4, &print_ip6);
2114 f64 now = va_arg (*args,
f64);
2115 int verbose = va_arg (*args,
int);
2116 u8 *name = va_arg (*args,
u8 *);
2123 s =
format (s,
"The DNS cache is disabled...");
2129 s =
format (s,
"The DNS cache is empty...");
2140 s =
format (s,
"%s is not in the cache...", name);
2150 s =
format (s,
"static u8 dns_reply_data_initializer[] =\n");
2182 if (time_left > 0.0)
2183 s =
format (s,
" TTL left %.1f", time_left);
2185 s =
format (s,
" EXPIRED");
2202 if (ep->flags & DNS_CACHE_ENTRY_FLAG_VALID)
2204 ASSERT (ep->dns_response);
2205 if (ep->flags & DNS_CACHE_ENTRY_FLAG_STATIC)
2210 if (verbose < 2 && ep->flags & DNS_CACHE_ENTRY_FLAG_CNAME)
2211 s = format (s,
"%s%s -> %s", ss, ep->name, ep->cname);
2213 s = format (s,
"%s%s -> %U", ss, ep->name,
2217 if (!(ep->flags & DNS_CACHE_ENTRY_FLAG_STATIC))
2219 f64 time_left = ep->expiration_time - now;
2220 if (time_left > 0.0)
2221 s = format (s,
" TTL left %.1f", time_left);
2223 s = format (s,
" EXPIRED");
2226 s = format (s,
" %d client notifications pending\n",
2227 vec_len(ep->pending_requests));
2232 ASSERT (ep->dns_request);
2233 s = format (s,
"[P] %U", format_dns_reply, ep->dns_request,
2256 if (
unformat (input,
"verbose %d", &verbose))
2258 else if (
unformat (input,
"verbose"))
2260 else if (
unformat (input,
"name %s", &name))
2275 .path =
"show dns cache",
2276 .short_help =
"show dns cache [verbose [nn]]",
2301 if (is_add == -1 && is_clear == -1)
2312 case VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED:
2326 case VNET_API_ERROR_NO_SUCH_ENTRY:
2331 case VNET_API_ERROR_NAME_RESOLUTION_NOT_ENABLED:
2357 case VNET_API_ERROR_ENTRY_ALREADY_EXISTS:
2376 .path =
"dns cache",
2377 .short_help =
"dns cache [add|del|clear] <name> [ip4][ip6]",
2382 #define DNS_FORMAT_TEST 1 2384 #if DNS_FORMAT_TEST > 0 2387 static u8 dns_reply_data_initializer[] =
2388 { 0x0, 0x0, 0x81, 0x80, 0x0, 0x1, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5,
2389 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x3, 0x63, 0x6f, 0x6d,
2394 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x24, 0x23,
2395 0x76, 0x3d, 0x73, 0x70, 0x66, 0x31, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72,
2396 0x65, 0x63, 0x74, 0x3d, 0x5f, 0x73, 0x70, 0x66, 0x2e, 0x6d, 0x61, 0x69,
2397 0x6c, 0x2e, 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0xc0,
2398 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0, 0x6, 0x3, 0x6e, 0x73,
2399 0x35, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0,
2400 0x6, 0x3, 0x6e, 0x73, 0x34, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0,
2401 0x1, 0x50, 0xd4, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x31, 0xc0, 0xc, 0xc0, 0xc,
2402 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x32,
2403 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x50, 0xd4, 0x0, 0x6,
2404 0x3, 0x6e, 0x73, 0x33, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0,
2405 0x6, 0x5c, 0x0, 0x19, 0x0, 0x1, 0x4, 0x6d, 0x74, 0x61, 0x36, 0x3, 0x61,
2406 0x6d, 0x30, 0x8, 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x64, 0x6e, 0x73, 0x3,
2408 0x65, 0x74, 0x0, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0,
2409 0x9, 0x0, 0x1, 0x4, 0x6d, 0x74, 0x61, 0x37, 0xc0, 0xb8, 0xc0, 0xc, 0x0,
2410 0xf, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x9, 0x0, 0x1, 0x4, 0x6d, 0x74,
2411 0x61, 0x35, 0xc0, 0xb8, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x6,
2412 0x5c, 0x0, 0x10, 0x20, 0x1, 0x49, 0x98, 0x0, 0x44, 0x2, 0x4, 0x0, 0x0,
2414 0x0, 0x0, 0x0, 0x0, 0xa7, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x6,
2415 0x5c, 0x0, 0x10, 0x20, 0x1, 0x49, 0x98, 0x0, 0xc, 0xa, 0x6, 0x0, 0x0, 0x0,
2416 0x0, 0x0, 0x2, 0x40, 0x8, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x6,
2417 0x5c, 0x0, 0x10, 0x20, 0x1, 0x49, 0x98, 0x0, 0x58, 0xc, 0x2, 0x0, 0x0,
2419 0x0, 0x0, 0x0, 0x0, 0xa9, 0xc0, 0xc, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x6,
2420 0x5c, 0x0, 0x4, 0x62, 0x8a, 0xfd, 0x6d, 0xc0, 0xc, 0x0, 0x1, 0x0, 0x1,
2422 0x0, 0x6, 0x5c, 0x0, 0x4, 0xce, 0xbe, 0x24, 0x2d, 0xc0, 0xc, 0x0, 0x1,
2424 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x4, 0x62, 0x8b, 0xb4, 0x95, 0xc0, 0xc,
2426 0x6, 0x0, 0x1, 0x0, 0x0, 0x6, 0x5c, 0x0, 0x2d, 0xc0, 0x7b, 0xa, 0x68,
2428 0x73, 0x74, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x9, 0x79, 0x61, 0x68,
2429 0x6f, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0xc0, 0x12, 0x78, 0x3a, 0x85, 0x44,
2430 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x1, 0x2c, 0x0, 0x1b, 0xaf, 0x80, 0x0, 0x0,
2435 static u8 dns_reply_data_initializer[] = {
2436 0x00, 0x01, 0x81, 0x80, 0x00, 0x01, 0x00, 0x01,
2437 0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77, 0x05,
2438 0x63, 0x69, 0x73, 0x63, 0x6f, 0x03, 0x63, 0x6f, 0x6d,
2440 0x00, 0x00, 0xff, 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x05,
2441 0x00, 0x01, 0x00, 0x00, 0x0b, 0xd3, 0x00, 0x1a, 0x03,
2442 0x77, 0x77, 0x77, 0x05, 0x63, 0x69, 0x73, 0x63, 0x6f,
2443 0x03, 0x63, 0x6f, 0x6d, 0x06, 0x61, 0x6b, 0x61, 0x64,
2444 0x6e, 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00,
2448 static u8 dns_reply_data_initializer[] = {
2450 0x00, 0x01, 0x81, 0x80, 0x00, 0x01, 0x00, 0x08,
2452 0x00, 0x06, 0x00, 0x06, 0x0a, 0x6f, 0x72, 0x69,
2454 0x67, 0x69, 0x6e, 0x2d, 0x77, 0x77, 0x77, 0x05,
2456 0x63, 0x69, 0x73, 0x63, 0x6f, 0x03, 0x63, 0x6f,
2458 0x6d, 0x00, 0x00, 0xff, 0x00, 0x01, 0x0a, 0x6f,
2460 0x72, 0x69, 0x67, 0x69, 0x6e, 0x2d, 0x77, 0x77,
2462 0x77, 0x05, 0x43, 0x49, 0x53, 0x43, 0x4f, 0xc0,
2465 0x1d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05,
2468 0x9a, 0x00, 0x18, 0x15, 0x72, 0x63, 0x64,
2469 0x6e, 0x39, 0x2d, 0x31, 0x34, 0x70, 0x2d, 0x64, 0x63,
2470 0x7a, 0x30, 0x35, 0x6e, 0x2d, 0x67, 0x73, 0x73, 0x31,
2471 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02, 0x00, 0x01, 0x00,
2472 0x00, 0x05, 0x9a, 0x00, 0x1a, 0x17, 0x61, 0x6c, 0x6c,
2473 0x6e, 0x30, 0x31, 0x2d, 0x61, 0x67, 0x30, 0x39, 0x2d,
2474 0x64, 0x63, 0x7a, 0x30, 0x33, 0x6e, 0x2d, 0x67, 0x73,
2475 0x73, 0x31, 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02, 0x00,
2476 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x10, 0x0d, 0x72,
2477 0x74, 0x70, 0x35, 0x2d, 0x64, 0x6d, 0x7a, 0x2d, 0x67,
2478 0x73, 0x73, 0x31, 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02,
2479 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x18, 0x15,
2480 0x6d, 0x74, 0x76, 0x35, 0x2d, 0x61, 0x70, 0x31, 0x30,
2481 0x2d, 0x64, 0x63, 0x7a, 0x30, 0x36, 0x6e, 0x2d, 0x67,
2482 0x73, 0x73, 0x31, 0xc0, 0x17, 0xc0, 0x26, 0x00, 0x02,
2483 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x1b, 0x18,
2484 0x73, 0x6e, 0x67, 0x64, 0x63, 0x30, 0x31, 0x2d, 0x61,
2485 0x62, 0x30, 0x37, 0x2d, 0x64, 0x63, 0x7a, 0x30, 0x31,
2486 0x6e, 0x2d, 0x67, 0x73, 0x73, 0x31, 0xc0, 0x17, 0xc0,
2487 0x26, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a,
2488 0x00, 0x1a, 0x17, 0x61, 0x65, 0x72, 0x30, 0x31, 0x2d,
2489 0x72, 0x34, 0x63, 0x32, 0x35, 0x2d, 0x64, 0x63, 0x7a,
2490 0x30, 0x31, 0x6e, 0x2d, 0x67, 0x73, 0x73, 0x31, 0xc0,
2491 0x17, 0xc0, 0x26, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
2492 0x00, 0x81, 0x00, 0x04, 0x48, 0xa3, 0x04, 0xa1, 0xc0,
2493 0x26, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82,
2494 0x00, 0x10, 0x20, 0x01, 0x04, 0x20, 0x12, 0x01, 0x00,
2495 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
2496 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05,
2497 0x9a, 0x00, 0x02, 0xc0, 0xf4, 0xc0, 0x0c, 0x00, 0x02,
2498 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x02, 0xc0,
2499 0xcd, 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00,
2500 0x05, 0x9a, 0x00, 0x02, 0xc0, 0x8d, 0xc0, 0x0c, 0x00,
2501 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00, 0x02,
2502 0xc0, 0x43, 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00,
2503 0x00, 0x05, 0x9a, 0x00, 0x02, 0xc0, 0xa9, 0xc0, 0x0c,
2504 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x9a, 0x00,
2505 0x02, 0xc0, 0x67, 0xc0, 0x8d, 0x00, 0x01, 0x00, 0x01,
2506 0x00, 0x00, 0x07, 0x08, 0x00, 0x04, 0x40, 0x66, 0xf6,
2507 0x05, 0xc0, 0xa9, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
2508 0x07, 0x08, 0x00, 0x04, 0xad, 0x24, 0xe0, 0x64, 0xc0,
2509 0x43, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x07, 0x08,
2510 0x00, 0x04, 0x48, 0xa3, 0x04, 0x1c, 0xc0, 0xf4, 0x00,
2511 0x01, 0x00, 0x01, 0x00, 0x00, 0x07, 0x08, 0x00, 0x04,
2512 0xad, 0x26, 0xd4, 0x6c, 0xc0, 0x67, 0x00, 0x01, 0x00,
2513 0x01, 0x00, 0x00, 0x07, 0x08, 0x00, 0x04, 0xad, 0x25,
2514 0x90, 0x64, 0xc0, 0xcd, 0x00, 0x01, 0x00, 0x01, 0x00,
2515 0x00, 0x07, 0x08, 0x00, 0x04, 0xad, 0x27, 0x70, 0x44,
2519 static u8 dns_reply_data_initializer[] =
2520 { 0x0, 0x0, 0x81, 0x80, 0x0, 0x1, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x6,
2521 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3, 0x63, 0x6f, 0x6d, 0x0, 0x0, 0xff,
2522 0x0, 0x1, 0xc0, 0xc, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x2b, 0x0, 0x4,
2523 0xac, 0xd9, 0x3, 0x2e, 0xc0, 0xc, 0x0, 0x1c, 0x0, 0x1, 0x0, 0x0, 0x1,
2525 0x0, 0x10, 0x26, 0x7, 0xf8, 0xb0, 0x40, 0x4, 0x8, 0xf, 0x0, 0x0, 0x0, 0x0,
2526 0x0, 0x0, 0x20, 0xe, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x51, 0x7f,
2527 0x0, 0x6, 0x3, 0x6e, 0x73, 0x31, 0xc0, 0xc, 0xc0, 0xc, 0x0, 0x6, 0x0, 0x1,
2528 0x0, 0x0, 0x0, 0x3b, 0x0, 0x22, 0xc0, 0x54, 0x9, 0x64, 0x6e, 0x73, 0x2d,
2529 0x61, 0x64, 0x6d, 0x69, 0x6e, 0xc0, 0xc, 0xa, 0x3d, 0xc7, 0x30, 0x0, 0x0,
2530 0x3, 0x84, 0x0, 0x0, 0x3, 0x84, 0x0, 0x0, 0x7, 0x8, 0x0, 0x0, 0x0, 0x3c,
2531 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x11, 0x0, 0x1e,
2532 0x4, 0x61, 0x6c, 0x74, 0x32, 0x5, 0x61, 0x73, 0x70, 0x6d, 0x78, 0x1, 0x6c,
2533 0xc0, 0xc, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x4,
2534 0x0, 0xa, 0xc0, 0x9b, 0xc0, 0xc, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0xe, 0xf,
2535 0x0, 0x24, 0x23, 0x76, 0x3d, 0x73, 0x70, 0x66, 0x31, 0x20, 0x69, 0x6e,
2536 0x63, 0x6c, 0x75, 0x64, 0x65, 0x3a, 0x5f, 0x73, 0x70, 0x66, 0x2e, 0x67,
2537 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x7e, 0x61,
2538 0x6c, 0x6c, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1, 0x51, 0x7f, 0x0, 0x6,
2539 0x3, 0x6e, 0x73, 0x32, 0xc0, 0xc, 0xc0, 0xc, 0x1, 0x1, 0x0, 0x1, 0x0, 0x1,
2540 0x51, 0x7f, 0x0, 0xf, 0x0, 0x5, 0x69, 0x73, 0x73, 0x75, 0x65, 0x70, 0x6b,
2541 0x69, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0,
2542 0x1, 0x51, 0x7f, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x34, 0xc0, 0xc, 0xc0, 0xc,
2543 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x9, 0x0, 0x28, 0x4, 0x61,
2544 0x6c, 0x74, 0x33, 0xc0, 0x9b, 0xc0, 0xc, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1,
2545 0x51, 0x7f, 0x0, 0x6, 0x3, 0x6e, 0x73, 0x33, 0xc0, 0xc, 0xc0, 0xc, 0x0,
2546 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x57, 0x0, 0x9, 0x0, 0x32, 0x4, 0x61, 0x6c,
2547 0x74, 0x34, 0xc0, 0x9b, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2,
2549 0x0, 0x9, 0x0, 0x14, 0x4, 0x61, 0x6c, 0x74, 0x31, 0xc0, 0x9b
2554 static u8 dns_reply_data_initializer[] = {
2555 0x00, 0x00, 0x81, 0x80, 0x00, 0x01, 0x00, 0x01,
2556 0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77, 0x0b,
2557 0x77, 0x65, 0x61, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x69,
2558 0x6e, 0x6b, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0xff,
2559 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x05, 0x00, 0x01, 0x00,
2560 0x00, 0x0c, 0x9e, 0x00, 0x1f, 0x0e, 0x64, 0x33, 0x6b,
2561 0x72, 0x30, 0x67, 0x75, 0x62, 0x61, 0x31, 0x64, 0x76,
2562 0x77, 0x66, 0x0a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x66,
2563 0x72, 0x6f, 0x6e, 0x74, 0x03, 0x6e, 0x65, 0x74, 0x00,
2572 u8 *dns_reply_data = 0;
2579 if (
unformat (input,
"verbose %d", &verbose))
2581 else if (
unformat (input,
"verbose"))
2590 memcpy (dns_reply_data, dns_reply_data_initializer,
2591 ARRAY_LEN (dns_reply_data_initializer));
2595 memset (rmp, 0,
sizeof (*rmp));
2601 case VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES:
2628 .path =
"test dns format",
2629 .short_help =
"test dns format",
2638 u8 *dns_reply_data = 0;
2644 if (
unformat (input,
"verbose %d", &verbose))
2646 else if (
unformat (input,
"verbose"))
2668 .path =
"test dns unformat",
2669 .short_help =
"test dns unformat <name> [ip4][ip6]",
2688 _vec_len (name) -= 1;
2712 .path =
"test dns expire",
2713 .short_help =
"test dns expire <name>",
2735 u32 sw_if_index, fib_index;
2761 memset (rnr, 0,
sizeof (*rnr));
2775 memset (rir, 0,
sizeof (*rir));
2796 if (b0->
flags & VLIB_BUFFER_NEXT_PRESENT)
2806 b0->
flags &= VLIB_BUFFER_NON_DEFAULT_FREELIST;
2807 b0->
flags |= (VNET_BUFFER_F_LOCALLY_ORIGINATED
2808 | VLIB_BUFFER_TOTAL_LENGTH_VALID);
2821 if (fib_index == (
u32) ~ 0)
2838 if (sw_if_index == ~0)
2841 (
"route to %U exists, fei %d, get_resolving_interface returned" 2850 goto found_src_address;
2861 dns_response = (
u8 *) (udp + 1);
2862 memset (ip, 0,
sizeof (*ip) +
sizeof (*udp));
2875 vec_validate (reply, qp_offset +
sizeof (dns_query_t) - 1);
2877 qp = (dns_query_t *) (reply + qp_offset);
2880 qp->type = clib_host_to_net_u16 (DNS_TYPE_A);
2882 qp->type = clib_host_to_net_u16 (DNS_TYPE_PTR);
2887 vec_insert (reply,
sizeof (dns_header_t), 0);
2889 dh = (dns_header_t *) reply;
2898 dh->flags = clib_host_to_net_u16 (tmp);
2899 dh->qdcount = clib_host_to_net_u16 (1);
2900 dh->anscount = (is_fail == 0) ? clib_host_to_net_u16 (1) : 0;
2915 rr = (dns_rr_t *) rrptr;
2917 rr->type = clib_host_to_net_u16 (DNS_TYPE_A);
2918 rr->class = clib_host_to_net_u16 (1 );
2919 rr->ttl = clib_host_to_net_u32 (ttl);
2920 rr->rdlength = clib_host_to_net_u16 (
sizeof (
ip4_address_t));
2931 rr = (dns_rr_t *) rrptr;
2932 rr->type = clib_host_to_net_u16 (DNS_TYPE_PTR);
2933 rr->class = clib_host_to_net_u16 (1 );
2934 rr->ttl = clib_host_to_net_u32 (ttl);
2935 rr->rdlength = clib_host_to_net_u16 (
vec_len (label_vec));
2956 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)
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)
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.
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)
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)
i16 current_data
signed offset in data[], pre_data[] that we are currently processing.
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.
u16 current_length
Nbytes between current data and the end of this buffer.
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,...)
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)
#define clib_memcpy(a, b, c)
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.
u32 next_buffer
Next buffer for this linked-list of buffers.
#define DNS_OPCODE_QUERY
standard query
static clib_error_t * dns_config_fn(vlib_main_t *vm, unformat_input_t *input)
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)
u32 total_length_not_including_first_buffer
Only valid for first buffer in chain.
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 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)
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 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index, VLIB_BUFFER_IS_TRACED: trace this buffer.
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.