Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 58e8646 in mainline


Ignore:
Timestamp:
2017-08-23T18:37:21Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
258d77e
Parents:
853802e
Message:

Fix DNS resolution not working due to missing local address.

Location:
uspace
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/inet/udp.c

    r853802e r58e8646  
    227227}
    228228
     229/** Set UDP association sending messages with no local address
     230 *
     231 * @param assoc Association
     232 * @param flags Flags
     233 */
     234int udp_assoc_set_nolocal(udp_assoc_t *assoc)
     235{
     236        async_exch_t *exch;
     237
     238        exch = async_exchange_begin(assoc->udp->sess);
     239        sysarg_t rc = async_req_1_0(exch, UDP_ASSOC_SET_NOLOCAL, assoc->id);
     240        async_exchange_end(exch);
     241
     242        return rc;
     243}
     244
    229245/** Send message via UDP association.
    230246 *
  • uspace/lib/c/include/inet/udp.h

    r853802e r58e8646  
    9595extern int udp_assoc_create(udp_t *, inet_ep2_t *, udp_cb_t *, void *,
    9696    udp_assoc_t **);
     97extern int udp_assoc_set_nolocal(udp_assoc_t *);
    9798extern void udp_assoc_destroy(udp_assoc_t *);
    9899extern int udp_assoc_send_msg(udp_assoc_t *, inet_ep_t *, void *, size_t);
  • uspace/lib/c/include/ipc/udp.h

    r853802e r58e8646  
    4242        UDP_ASSOC_CREATE,
    4343        UDP_ASSOC_DESTROY,
     44        UDP_ASSOC_SET_NOLOCAL,
    4445        UDP_ASSOC_SEND_MSG,
    4546        UDP_RMSG_INFO,
  • uspace/srv/net/dhcp/transport.c

    r853802e r58e8646  
    153153        }
    154154
     155        rc = udp_assoc_set_nolocal(assoc);
     156        if (rc != EOK) {
     157                rc = EIO;
     158                goto error;
     159        }
     160
    155161        dt->udp = udp;
    156162        dt->assoc = assoc;
  • uspace/srv/net/dnsrsrv/query.c

    r853802e r58e8646  
    9090        list_append(&question->msg, &msg->question);
    9191       
     92        log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_name_query: send DNS request");
    9293        dns_message_t *amsg;
    9394        int rc = dns_request(msg, &amsg);
  • uspace/srv/net/dnsrsrv/transport.c

    r853802e r58e8646  
    183183        void *req_data;
    184184        size_t req_size;
     185        log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_request: Encode dns message");
    185186        int rc = dns_message_encode(req, &req_data, &req_size);
    186187        if (rc != EOK)
     
    194195
    195196        while (ntry < REQ_RETRY_MAX) {
     197                log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_request: Send DNS message");
    196198                rc = udp_assoc_send_msg(transport_assoc, &ep, req_data,
    197199                    req_size);
    198                 if (rc != EOK)
     200                if (rc != EOK) {
     201                        log_msg(LOG_DEFAULT, LVL_DEBUG, "Error %d sending message", rc);
    199202                        goto error;
     203                }
    200204
    201205                treq = treq_create(req);
  • uspace/srv/net/udp/assoc.c

    r853802e r58e8646  
    4040#include <fibril_synch.h>
    4141#include <inet/endpoint.h>
     42#include <inet/inet.h>
    4243#include <io/log.h>
    4344#include <nettl/amap.h>
     
    261262                return EINVAL;
    262263
     264        /* This association has no local address set. Need to determine one. */
     265        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send - check no local addr");
     266        if (inet_addr_is_any(&epp.local.addr) && !assoc->nolocal) {
     267                log_msg(LOG_DEFAULT, LVL_DEBUG, "Determine local address.");
     268                rc = inet_get_srcaddr(&epp.remote.addr, 0, &epp.local.addr);
     269                if (rc != EOK) {
     270                        log_msg(LOG_DEFAULT, LVL_DEBUG, "Cannot determine "
     271                            "local address.");
     272                        return EINVAL;
     273                }
     274        }
     275
    263276        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send - check version");
    264277
    265         if (epp.remote.addr.version != epp.local.addr.version)
     278        if (!inet_addr_is_any(&epp.local.addr) &&
     279            epp.remote.addr.version != epp.local.addr.version)
    266280                return EINVAL;
    267281
  • uspace/srv/net/udp/service.c

    r853802e r58e8646  
    270270}
    271271
     272/** Set association sending messages with no local address.
     273 *
     274 * Handle client request to set nolocal flag (with parameters unmarshalled).
     275 *
     276 * @param client   UDP client
     277 * @param assoc_id Association ID
     278 * @return EOK on success, ENOENT if no such association is found
     279 */
     280static int udp_assoc_set_nolocal_impl(udp_client_t *client, sysarg_t assoc_id)
     281{
     282        udp_cassoc_t *cassoc;
     283        int rc;
     284
     285        rc = udp_cassoc_get(client, assoc_id, &cassoc);
     286        if (rc != EOK) {
     287                assert(rc == ENOENT);
     288                return ENOENT;
     289        }
     290
     291        log_msg(LOG_DEFAULT, LVL_NOTE, "Setting nolocal to true");
     292        cassoc->assoc->nolocal = true;
     293        return EOK;
     294}
     295
    272296/** Send message via association.
    273297 *
     
    391415        assoc_id = IPC_GET_ARG1(*icall);
    392416        rc = udp_assoc_destroy_impl(client, assoc_id);
     417        async_answer_0(iid, rc);
     418}
     419
     420/** Set association with no local address.
     421 *
     422 * Handle client request to set no local address flag.
     423 *
     424 * @param client   UDP client
     425 * @param iid      Async request ID
     426 * @param icall    Async request data
     427 */
     428static void udp_assoc_set_nolocal_srv(udp_client_t *client, ipc_callid_t iid,
     429    ipc_call_t *icall)
     430{
     431        sysarg_t assoc_id;
     432        int rc;
     433
     434        log_msg(LOG_DEFAULT, LVL_NOTE, "udp_assoc_set_nolocal_srv()");
     435
     436        assoc_id = IPC_GET_ARG1(*icall);
     437        rc = udp_assoc_set_nolocal_impl(client, assoc_id);
    393438        async_answer_0(iid, rc);
    394439}
     
    662707                        udp_assoc_destroy_srv(&client, callid, &call);
    663708                        break;
     709                case UDP_ASSOC_SET_NOLOCAL:
     710                        udp_assoc_set_nolocal_srv(&client, callid, &call);
     711                        break;
    664712                case UDP_ASSOC_SEND_MSG:
    665713                        udp_assoc_send_msg_srv(&client, callid, &call);
  • uspace/srv/net/udp/udp_type.h

    r853802e r58e8646  
    4141#include <inet/endpoint.h>
    4242#include <ipc/loc.h>
     43#include <stdbool.h>
    4344#include <stddef.h>
    4445#include <inet/addr.h>
     
    119120        /** Receive queue CV. Broadcast when new datagram is inserted */
    120121        fibril_condvar_t rcv_queue_cv;
     122        /** Allow sending messages with no local address */
     123        bool nolocal;
    121124
    122125        udp_assoc_cb_t *cb;
Note: See TracChangeset for help on using the changeset viewer.