X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fdns%2Fdns.c;h=f3ce4fc55c95929b9dbaa68faadad2be2e861b11;hb=af2cc6425;hp=4a07fc09a6de59ed48366a227d1ff6a45d80b761;hpb=39d69112fcec114fde34955ceb41555221d3ba11;p=vpp.git diff --git a/src/plugins/dns/dns.c b/src/plugins/dns/dns.c index 4a07fc09a6d..f3ce4fc55c9 100644 --- a/src/plugins/dns/dns.c +++ b/src/plugins/dns/dns.c @@ -14,7 +14,7 @@ */ #include -#include +#include #include #include #include @@ -52,11 +52,11 @@ dns_cache_clear (dns_main_t * dm) dns_cache_lock (dm, 1); /* *INDENT-OFF* */ - pool_foreach (ep, dm->entries, - ({ + pool_foreach (ep, dm->entries) + { vec_free (ep->name); vec_free (ep->pending_requests); - })); + } /* *INDENT-ON* */ pool_free (dm->entries); @@ -68,14 +68,13 @@ dns_cache_clear (dns_main_t * dm) } static int -dns_enable_disable (dns_main_t * dm, int is_enable) +dns_enable_disable (vlib_main_t * vm, dns_main_t * dm, int is_enable) { vlib_thread_main_t *tm = &vlib_thread_main; u32 n_vlib_mains = tm->n_vlib_mains; - vlib_main_t *vm = dm->vlib_main; /* Create the resolver process if not done already */ - vnet_dns_create_resolver_process (dm); + vnet_dns_create_resolver_process (vm, dm); if (is_enable) { @@ -122,10 +121,11 @@ static void vl_api_dns_enable_disable_t_handler (vl_api_dns_enable_disable_t * mp) { vl_api_dns_enable_disable_reply_t *rmp; + vlib_main_t *vm = vlib_get_main (); dns_main_t *dm = &dns_main; int rv; - rv = dns_enable_disable (dm, mp->enable); + rv = dns_enable_disable (vm, dm, mp->enable); REPLY_MACRO (VL_API_DNS_ENABLE_DISABLE_REPLY); } @@ -218,10 +218,9 @@ static void vl_api_dns_name_server_add_del_t_handler } void -vnet_dns_send_dns4_request (dns_main_t * dm, +vnet_dns_send_dns4_request (vlib_main_t * vm, dns_main_t * dm, dns_cache_entry_t * ep, ip4_address_t * server) { - vlib_main_t *vm = dm->vlib_main; f64 now = vlib_time_now (vm); u32 bi; vlib_buffer_t *b; @@ -288,7 +287,7 @@ vnet_dns_send_dns4_request (dns_main_t * dm, found_src_address: /* Go get a buffer */ - if (vlib_buffer_alloc (dm->vlib_main, &bi, 1) != 1) + if (vlib_buffer_alloc (vm, &bi, 1) != 1) return; b = vlib_get_buffer (vm, bi); @@ -337,10 +336,9 @@ found_src_address: } void -vnet_dns_send_dns6_request (dns_main_t * dm, +vnet_dns_send_dns6_request (vlib_main_t * vm, dns_main_t * dm, dns_cache_entry_t * ep, ip6_address_t * server) { - vlib_main_t *vm = dm->vlib_main; f64 now = vlib_time_now (vm); u32 bi; vlib_buffer_t *b; @@ -397,7 +395,7 @@ vnet_dns_send_dns6_request (dns_main_t * dm, found_src_address: /* Go get a buffer */ - if (vlib_buffer_alloc (dm->vlib_main, &bi, 1) != 1) + if (vlib_buffer_alloc (vm, &bi, 1) != 1) return; b = vlib_get_buffer (vm, bi); @@ -536,7 +534,8 @@ vnet_dns_labels_to_name (u8 * label, u8 * full_text, u8 ** parse_from_here) } void -vnet_send_dns_request (dns_main_t * dm, dns_cache_entry_t * ep) +vnet_send_dns_request (vlib_main_t * vm, dns_main_t * dm, + dns_cache_entry_t * ep) { dns_header_t *h; dns_query_t *qp; @@ -610,7 +609,7 @@ vnet_send_dns_request (dns_main_t * dm, dns_cache_entry_t * ep) if (vec_len (dm->ip6_name_servers)) { vnet_dns_send_dns6_request - (dm, ep, dm->ip6_name_servers + ep->server_rotor); + (vm, dm, ep, dm->ip6_name_servers + ep->server_rotor); goto out; } else @@ -619,7 +618,7 @@ vnet_send_dns_request (dns_main_t * dm, dns_cache_entry_t * ep) if (vec_len (dm->ip4_name_servers)) { vnet_dns_send_dns4_request - (dm, ep, dm->ip4_name_servers + ep->server_rotor); + (vm, dm, ep, dm->ip4_name_servers + ep->server_rotor); goto out; } } @@ -647,14 +646,14 @@ vnet_send_dns_request (dns_main_t * dm, dns_cache_entry_t * ep) if (ep->server_af == 1 /* ip6 */ ) vnet_dns_send_dns6_request - (dm, ep, dm->ip6_name_servers + ep->server_rotor); + (vm, dm, ep, dm->ip6_name_servers + ep->server_rotor); else vnet_dns_send_dns4_request - (dm, ep, dm->ip4_name_servers + ep->server_rotor); + (vm, dm, ep, dm->ip4_name_servers + ep->server_rotor); out: - vlib_process_signal_event_mt (dm->vlib_main, + vlib_process_signal_event_mt (vm, dm->resolver_process_node_index, DNS_RESOLVER_EVENT_PENDING, 0); } @@ -808,8 +807,8 @@ dns_add_static_entry (dns_main_t * dm, u8 * name, u8 * dns_reply_data) } int -vnet_dns_resolve_name (dns_main_t * dm, u8 * name, dns_pending_request_t * t, - dns_cache_entry_t ** retp) +vnet_dns_resolve_name (vlib_main_t * vm, dns_main_t * dm, u8 * name, + dns_pending_request_t * t, dns_cache_entry_t ** retp) { dns_cache_entry_t *ep; int rv; @@ -818,7 +817,7 @@ vnet_dns_resolve_name (dns_main_t * dm, u8 * name, dns_pending_request_t * t, dns_pending_request_t *pr; int count; - now = vlib_time_now (dm->vlib_main); + now = vlib_time_now (vm); /* In case we can't actually answer the question right now... */ *retp = 0; @@ -950,7 +949,7 @@ re_resolve: clib_memcpy (pr->dst_address, t->dst_address, count); } - vnet_send_dns_request (dm, ep); + vnet_send_dns_request (vm, dm, ep); dns_cache_unlock (dm); return 0; } @@ -964,7 +963,8 @@ _(pending_requests) */ int -vnet_dns_cname_indirection_nolock (dns_main_t * dm, u32 ep_index, u8 * reply) +vnet_dns_cname_indirection_nolock (vlib_main_t * vm, dns_main_t * dm, + u32 ep_index, u8 * reply) { dns_header_t *h; dns_query_t *qp; @@ -1074,7 +1074,7 @@ vnet_dns_cname_indirection_nolock (dns_main_t * dm, u32 ep_index, u8 * reply) found_last_request: - now = vlib_time_now (dm->vlib_main); + now = vlib_time_now (vm); cname = vnet_dns_labels_to_name (rr->rdata, reply, &pos2); /* Save the cname */ vec_add1 (cname, 0); @@ -1154,14 +1154,13 @@ found_last_request: */ vec_add1 (dm->unresolved_entries, next_ep - dm->entries); - vnet_send_dns_request (dm, next_ep); + vnet_send_dns_request (vm, dm, next_ep); return (1); } int -vnet_dns_response_to_reply (u8 * response, - vl_api_dns_resolve_name_reply_t * rmp, - u32 * min_ttlp) +vnet_dns_response_to_reply (u8 *response, dns_resolve_name_t *rn, + u32 *min_ttlp) { dns_header_t *h; dns_query_t *qp; @@ -1172,7 +1171,7 @@ vnet_dns_response_to_reply (u8 * response, u16 flags; u16 rcode; u32 ttl; - int pointer_chase; + int pointer_chase, addr_set = 0; h = (dns_header_t *) response; flags = clib_net_to_host_u16 (h->flags); @@ -1269,32 +1268,32 @@ vnet_dns_response_to_reply (u8 * response, { case DNS_TYPE_A: /* Collect an ip4 address. Do not pass go. Do not collect $200 */ - memcpy (rmp->ip4_address, rr->rdata, sizeof (ip4_address_t)); - rmp->ip4_set = 1; + ip_address_set (&rn->address, rr->rdata, AF_IP4); ttl = clib_net_to_host_u32 (rr->ttl); + addr_set += 1; if (min_ttlp && *min_ttlp > ttl) *min_ttlp = ttl; break; case DNS_TYPE_AAAA: /* Collect an ip6 address. Do not pass go. Do not collect $200 */ - memcpy (rmp->ip6_address, rr->rdata, sizeof (ip6_address_t)); + ip_address_set (&rn->address, rr->rdata, AF_IP6); ttl = clib_net_to_host_u32 (rr->ttl); if (min_ttlp && *min_ttlp > ttl) *min_ttlp = ttl; - rmp->ip6_set = 1; + addr_set += 1; break; default: break; } /* Might as well stop ASAP */ - if (rmp->ip4_set && rmp->ip6_set) + if (addr_set > 1) break; pos += sizeof (*rr) + clib_net_to_host_u16 (rr->rdlength); curpos = pos; } - if ((rmp->ip4_set + rmp->ip6_set) == 0) + if (addr_set == 0) return VNET_API_ERROR_NAME_SERVER_NO_ADDRESSES; return 0; } @@ -1435,14 +1434,35 @@ vnet_dns_response_to_name (u8 * response, return 0; } +__clib_export int +dns_resolve_name (u8 *name, dns_cache_entry_t **ep, dns_pending_request_t *t0, + dns_resolve_name_t *rn) +{ + dns_main_t *dm = &dns_main; + vlib_main_t *vm = vlib_get_main (); + + int rv = vnet_dns_resolve_name (vm, dm, name, t0, ep); + + /* Error, e.g. not enabled? Tell the user */ + if (rv < 0) + return rv; + + /* Resolution pending? Don't reply... */ + if (ep[0] == 0) + return 0; + + return vnet_dns_response_to_reply (ep[0]->dns_response, rn, 0 /* ttl-ptr */); +} + static void vl_api_dns_resolve_name_t_handler (vl_api_dns_resolve_name_t * mp) { dns_main_t *dm = &dns_main; vl_api_dns_resolve_name_reply_t *rmp; - dns_cache_entry_t *ep; + dns_cache_entry_t *ep = 0; dns_pending_request_t _t0, *t0 = &_t0; int rv; + dns_resolve_name_t rn; /* Sanitize the name slightly */ mp->name[ARRAY_LEN (mp->name) - 1] = 0; @@ -1451,7 +1471,7 @@ vl_api_dns_resolve_name_t_handler (vl_api_dns_resolve_name_t * mp) t0->client_index = mp->client_index; t0->client_context = mp->context; - rv = vnet_dns_resolve_name (dm, mp->name, t0, &ep); + rv = dns_resolve_name (mp->name, &ep, t0, &rn); /* Error, e.g. not enabled? Tell the user */ if (rv < 0) @@ -1465,23 +1485,20 @@ vl_api_dns_resolve_name_t_handler (vl_api_dns_resolve_name_t * mp) return; /* *INDENT-OFF* */ - REPLY_MACRO2(VL_API_DNS_RESOLVE_NAME_REPLY, - ({ - rv = vnet_dns_response_to_reply (ep->dns_response, rmp, 0 /* ttl-ptr */); - rmp->retval = clib_host_to_net_u32 (rv); - })); + REPLY_MACRO2 (VL_API_DNS_RESOLVE_NAME_REPLY, ({ + ip_address_copy_addr (rmp->ip4_address, &rn.address); + if (ip_addr_version (&rn.address) == AF_IP4) + rmp->ip4_set = 1; + else + rmp->ip6_set = 1; + })); /* *INDENT-ON* */ - - /* - * dns_resolve_name leaves the cache locked when it returns - * a cached result, so unlock it here. - */ - dns_cache_unlock (dm); } static void vl_api_dns_resolve_ip_t_handler (vl_api_dns_resolve_ip_t * mp) { + vlib_main_t *vm = vlib_get_main (); dns_main_t *dm = &dns_main; vl_api_dns_resolve_ip_reply_t *rmp; dns_cache_entry_t *ep; @@ -1529,7 +1546,7 @@ vl_api_dns_resolve_ip_t_handler (vl_api_dns_resolve_ip_t * mp) t0->client_index = mp->client_index; t0->client_context = mp->context; - rv = vnet_dns_resolve_name (dm, lookup_name, t0, &ep); + rv = vnet_dns_resolve_name (vm, dm, lookup_name, t0, &ep); vec_free (lookup_name); @@ -1551,12 +1568,6 @@ vl_api_dns_resolve_ip_t_handler (vl_api_dns_resolve_ip_t * mp) rmp->retval = clib_host_to_net_u32 (rv); })); /* *INDENT-ON* */ - - /* - * vnet_dns_resolve_name leaves the cache locked when it returns - * a cached result, so unlock it here. - */ - dns_cache_unlock (dm); } static clib_error_t * @@ -2167,8 +2178,8 @@ format_dns_cache (u8 * s, va_list * args) if (verbose > 0) { /* *INDENT-OFF* */ - pool_foreach (ep, dm->entries, - ({ + pool_foreach (ep, dm->entries) + { if (ep->flags & DNS_CACHE_ENTRY_FLAG_VALID) { ASSERT (ep->dns_response); @@ -2204,7 +2215,7 @@ format_dns_cache (u8 * s, va_list * args) verbose); } vec_add1 (s, '\n'); - })); + } /* *INDENT-ON* */ } @@ -2578,6 +2589,7 @@ static clib_error_t * test_dns_fmt_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { + dns_resolve_name_t _rn, *rn = &_rn; u8 *dns_reply_data = 0; int verbose = 0; int rv; @@ -2603,7 +2615,7 @@ test_dns_fmt_command_fn (vlib_main_t * vm, clib_memset (rmp, 0, sizeof (*rmp)); - rv = vnet_dns_response_to_reply (dns_reply_data, rmp, 0 /* ttl-ptr */ ); + rv = vnet_dns_response_to_reply (dns_reply_data, rn, 0 /* ttl-ptr */); switch (rv) { @@ -2616,12 +2628,7 @@ test_dns_fmt_command_fn (vlib_main_t * vm, break; case 0: - if (rmp->ip4_set) - vlib_cli_output (vm, "ip4 address: %U", format_ip4_address, - (ip4_address_t *) rmp->ip4_address); - if (rmp->ip6_set) - vlib_cli_output (vm, "ip6 address: %U", format_ip6_address, - (ip6_address_t *) rmp->ip6_address); + vlib_cli_output (vm, "ip address: %U", format_ip_address, &rn->address); break; } @@ -2728,18 +2735,19 @@ VLIB_CLI_COMMAND (test_dns_expire_command) = #endif void -vnet_send_dns6_reply (dns_main_t * dm, dns_pending_request_t * pr, - dns_cache_entry_t * ep, vlib_buffer_t * b0) +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) { clib_warning ("Unimplemented..."); } void -vnet_send_dns4_reply (dns_main_t * dm, dns_pending_request_t * pr, - dns_cache_entry_t * ep, vlib_buffer_t * b0) +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) { - vlib_main_t *vm = dm->vlib_main; u32 bi = 0; fib_prefix_t prefix; fib_node_index_t fei; @@ -2755,9 +2763,10 @@ vnet_send_dns4_reply (dns_main_t * dm, dns_pending_request_t * pr, u32 *to_next; u8 *dns_response; u8 *reply; - vl_api_dns_resolve_name_reply_t _rnr, *rnr = &_rnr; + /* vl_api_dns_resolve_name_reply_t _rnr, *rnr = &_rnr; */ + dns_resolve_name_t _rn, *rn = &_rn; vl_api_dns_resolve_ip_reply_t _rir, *rir = &_rir; - u32 ttl, tmp; + u32 ttl = 64, tmp; u32 qp_offset; dns_query_t *qp; dns_rr_t *rr; @@ -2770,13 +2779,13 @@ vnet_send_dns4_reply (dns_main_t * dm, dns_pending_request_t * pr, if (pr->request_type == DNS_PEER_PENDING_NAME_TO_IP) { /* Quick and dirty way to dig up the A-record address. $$ FIXME */ - clib_memset (rnr, 0, sizeof (*rnr)); - if (vnet_dns_response_to_reply (ep->dns_response, rnr, &ttl)) + clib_memset (rn, 0, sizeof (*rn)); + if (vnet_dns_response_to_reply (ep->dns_response, rn, &ttl)) { /* clib_warning ("response_to_reply failed..."); */ is_fail = 1; } - if (rnr->ip4_set == 0) + else if (ip_addr_version (&rn->address) != AF_IP4) { /* clib_warning ("No A-record..."); */ is_fail = 1; @@ -2936,7 +2945,7 @@ found_src_address: rr->class = clib_host_to_net_u16 (1 /* internet */ ); rr->ttl = clib_host_to_net_u32 (ttl); rr->rdlength = clib_host_to_net_u16 (sizeof (ip4_address_t)); - clib_memcpy (rr->rdata, rnr->ip4_address, sizeof (ip4_address_t)); + ip_address_copy_addr (rr->rdata, &rn->address); } else { @@ -2992,66 +3001,12 @@ found_src_address: } } -static void *vl_api_dns_enable_disable_t_print - (vl_api_dns_enable_disable_t * mp, void *handle) -{ - u8 *s; - - s = format (0, "SCRIPT: dns_enable_disable "); - s = format (s, "%s ", mp->enable ? "enable" : "disable"); - - FINISH; -} - -static void *vl_api_dns_name_server_add_del_t_print - (vl_api_dns_name_server_add_del_t * mp, void *handle) -{ - u8 *s; - - s = format (0, "SCRIPT: dns_name_server_add_del "); - if (mp->is_ip6) - s = format (s, "%U ", format_ip6_address, - (ip6_address_t *) mp->server_address); - else - s = format (s, "%U ", format_ip4_address, - (ip4_address_t *) mp->server_address); - - if (mp->is_add == 0) - s = format (s, "del "); - - FINISH; -} - -static void *vl_api_dns_resolve_name_t_print - (vl_api_dns_resolve_name_t * mp, void *handle) -{ - u8 *s; - - s = format (0, "SCRIPT: dns_resolve_name "); - s = format (s, "%s ", mp->name); - FINISH; -} - -static void *vl_api_dns_resolve_ip_t_print - (vl_api_dns_resolve_ip_t * mp, void *handle) -{ - u8 *s; - - s = format (0, "SCRIPT: dns_resolve_ip "); - if (mp->is_ip6) - s = format (s, "%U ", format_ip6_address, mp->address); - else - s = format (s, "%U ", format_ip4_address, mp->address); - FINISH; -} - #include static clib_error_t * dns_init (vlib_main_t * vm) { dns_main_t *dm = &dns_main; - dm->vlib_main = vm; dm->vnet_main = vnet_get_main (); dm->name_cache_size = 1000; dm->max_ttl_in_seconds = 86400;