Changeset 4e716180 in mainline


Ignore:
Timestamp:
2013-05-03T21:14:39Z (12 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
716357f
Parents:
1c7ba2d (diff), 5d1cb8a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge simple DNS resolver.

Files:
17 added
19 edited

Legend:

Unmodified
Added
Removed
  • boot/Makefile.common

    r1c7ba2d r4e716180  
    112112        $(USPACE_PATH)/srv/hid/remcons/remcons \
    113113        $(USPACE_PATH)/srv/hid/isdv4_tablet/isdv4_tablet \
     114        $(USPACE_PATH)/srv/net/dnsrsrv/dnsrsrv \
    114115        $(USPACE_PATH)/srv/net/ethip/ethip \
    115116        $(USPACE_PATH)/srv/net/inetsrv/inetsrv \
     
    165166        $(USPACE_PATH)/app/dltest2/dltest2 \
    166167        $(USPACE_PATH)/app/dload/dload \
     168        $(USPACE_PATH)/app/dnscfg/dnscfg \
     169        $(USPACE_PATH)/app/dnsres/dnsres \
    167170        $(USPACE_PATH)/app/edit/edit \
    168171        $(USPACE_PATH)/app/inet/inet \
  • uspace/Makefile

    r1c7ba2d r4e716180  
    3939        app/bnchmark \
    4040        app/devctl \
     41        app/dnscfg \
     42        app/dnsres \
    4143        app/edit \
    4244        app/getterm \
     
    8284        srv/devman \
    8385        srv/loader \
     86        srv/net/dnsrsrv \
    8487        srv/net/ethip \
    8588        srv/net/inetsrv \
  • uspace/app/init/init.c

    r1c7ba2d r4e716180  
    359359        srv_start("/srv/tcp");
    360360        srv_start("/srv/udp");
     361        srv_start("/srv/dnsrsrv");
    361362       
    362363        srv_start("/srv/clipboard");
  • uspace/app/nettest1/nettest1.c

    r1c7ba2d r4e716180  
    4646#include <arg_parse.h>
    4747
     48#include <inet/dnsr.h>
    4849#include <net/in.h>
    4950#include <net/in6.h>
     
    7576        printf(
    7677            "Network Networking test 1 aplication - sockets\n"
    77             "Usage: echo [options] numeric_address\n"
     78            "Usage: nettest1 [options] host\n"
    7879            "Where options are:\n"
    7980            "-f protocol_family | --family=protocol_family\n"
     
    290291        struct sockaddr_in address_in;
    291292        struct sockaddr_in6 address_in6;
     293        dnsr_hostinfo_t *hinfo;
    292294        uint8_t *address_start;
    293295
     
    319321        }
    320322
    321         /* If not before the last argument containing the address */
     323        /* If not before the last argument containing the host */
    322324        if (index >= argc) {
    323                 printf("Command line error: missing address\n");
     325                printf("Command line error: missing host name\n");
    324326                nettest1_print_help();
    325327                return EINVAL;
     
    348350        }
    349351
    350         /* Parse the last argument which should contain the address */
     352        /* Parse the last argument which should contain the host/address */
    351353        rc = inet_pton(family, argv[argc - 1], address_start);
    352354        if (rc != EOK) {
    353                 fprintf(stderr, "Address parse error %d\n", rc);
    354                 return rc;
     355                /* Try interpreting as a host name */
     356                rc = dnsr_name2host(argv[argc - 1], &hinfo);
     357                if (rc != EOK) {
     358                        printf("Error resolving host '%s'.\n", argv[argc - 1]);
     359                        return rc;
     360                }
     361
     362                address_in.sin_addr.s_addr = host2uint32_t_be(hinfo->addr.ipv4);
    355363        }
    356364
  • uspace/app/nettest2/nettest2.c

    r1c7ba2d r4e716180  
    4747#include <stdbool.h>
    4848
     49#include <inet/dnsr.h>
    4950#include <net/in.h>
    5051#include <net/in6.h>
     
    7172        printf(
    7273            "Network Networking test 2 aplication - UDP transfer\n"
    73             "Usage: echo [options] address\n"
     74            "Usage: nettest2 [options] host\n"
    7475            "Where options are:\n"
    7576            "-f protocol_family | --family=protocol_family\n"
     
    227228        struct sockaddr_in address_in;
    228229        struct sockaddr_in6 address_in6;
     230        dnsr_hostinfo_t *hinfo;
    229231        socklen_t addrlen;
    230232        uint8_t *address_start;
     
    265267        }
    266268
    267         /* If not before the last argument containing the address */
     269        /* If not before the last argument containing the host */
    268270        if (index >= argc) {
    269                 printf("Command line error: missing address\n");
     271                printf("Command line error: missing host name\n");
    270272                nettest2_print_help();
    271273                return EINVAL;
     
    294296        }
    295297
    296         /* Parse the last argument which should contain the address. */
     298        /* Parse the last argument which should contain the host/address */
    297299        rc = inet_pton(family, argv[argc - 1], address_start);
    298300        if (rc != EOK) {
    299                 fprintf(stderr, "Address parse error %d\n", rc);
    300                 return rc;
     301                /* Try interpreting as a host name */
     302                rc = dnsr_name2host(argv[argc - 1], &hinfo);
     303                if (rc != EOK) {
     304                        printf("Error resolving host '%s'.\n", argv[argc - 1]);
     305                        return rc;
     306                }
     307
     308                address_in.sin_addr.s_addr = host2uint32_t_be(hinfo->addr.ipv4);
    301309        }
    302310
  • uspace/app/nettest3/nettest3.c

    r1c7ba2d r4e716180  
    3939#include <str.h>
    4040
     41#include <inet/dnsr.h>
    4142#include <net/in.h>
    4243#include <net/in6.h>
     
    6061        int fd;
    6162        char *endptr;
     63        dnsr_hostinfo_t *hinfo;
    6264
    6365        port = 7;
     
    7577                rc = inet_pton(AF_INET, argv[1], (uint8_t *)&addr.sin_addr.s_addr);
    7678                if (rc != EOK) {
    77                         fprintf(stderr, "Error parsing address\n");
    78                         return 1;
     79                        /* Try interpreting as a host name */
     80                        rc = dnsr_name2host(argv[1], &hinfo);
     81                        if (rc != EOK) {
     82                                printf("Error resolving host '%s'.\n", argv[1]);
     83                                return rc;
     84                        }
     85
     86                        addr.sin_addr.s_addr = host2uint32_t_be(hinfo->addr.ipv4);
     87                        addr.sin_family = AF_INET;
    7988                }
    8089                printf("result: rc=%d, family=%d, addr=%x\n", rc,
  • uspace/app/nterm/conn.c

    r1c7ba2d r4e716180  
    3333 */
    3434
     35#include <byteorder.h>
    3536#include <stdbool.h>
    3637#include <errno.h>
    3738#include <fibril.h>
     39#include <inet/dnsr.h>
    3840#include <net/socket.h>
    3941#include <stdio.h>
     
    7476{
    7577        struct sockaddr_in addr;
     78        dnsr_hostinfo_t *hinfo = NULL;
    7679        int rc;
    7780        char *endptr;
     
    8184        rc = inet_pton(addr.sin_family, addr_s, (uint8_t *)&addr.sin_addr);
    8285        if (rc != EOK) {
    83                 printf("Invalid addres %s\n", addr_s);
    84                 return EINVAL;
     86                /* Try interpreting as a host name */
     87                rc = dnsr_name2host(addr_s, &hinfo);
     88                if (rc != EOK) {
     89                        printf("Error resolving host '%s'.\n", addr_s);
     90                        goto error;
     91                }
     92
     93                addr.sin_addr.s_addr = host2uint32_t_be(hinfo->addr.ipv4);
    8594        }
    8695
     
    8897        if (*endptr != '\0') {
    8998                printf("Invalid port number %s\n", port_s);
    90                 return EINVAL;
     99                goto error;
    91100        }
    92101
     
    95104                goto error;
    96105
    97         printf("Connecting to address %s port %u\n", addr_s, ntohs(addr.sin_port));
     106        printf("Connecting to host %s port %u\n", addr_s, ntohs(addr.sin_port));
    98107
    99108        rc = connect(conn_fd, (struct sockaddr *)&addr, sizeof(addr));
  • uspace/app/nterm/nterm.c

    r1c7ba2d r4e716180  
    104104static void print_syntax(void)
    105105{
    106         printf("syntax: nterm <ip-address> <port>\n");
     106        printf("syntax: nterm <host> <port>\n");
    107107}
    108108
  • uspace/app/ping/ping.c

    r1c7ba2d r4e716180  
    3737#include <errno.h>
    3838#include <fibril_synch.h>
     39#include <inet/dnsr.h>
    3940#include <inet/addr.h>
    4041#include <inet/inetping.h>
     
    6970static void print_syntax(void)
    7071{
    71         printf("syntax: " NAME " [-r] <addr>\n");
     72        printf("syntax: " NAME " [-r] <host>\n");
    7273}
    7374
     
    173174int main(int argc, char *argv[])
    174175{
     176        dnsr_hostinfo_t *hinfo = NULL;
     177        char *asrc = NULL;
     178        char *adest = NULL;
     179        char *sdest = NULL;
    175180        int rc;
    176181        int argi;
     
    180185                printf(NAME ": Failed connecting to internet ping service "
    181186                    "(%d).\n", rc);
    182                 return 1;
     187                goto error;
    183188        }
    184189
     
    193198        if (argc - argi != 1) {
    194199                print_syntax();
    195                 return 1;
     200                goto error;
    196201        }
    197202
     
    199204        rc = inet_addr_parse(argv[argi], &dest_addr);
    200205        if (rc != EOK) {
    201                 printf(NAME ": Invalid address format.\n");
    202                 print_syntax();
    203                 return 1;
     206                /* Try interpreting as a host name */
     207                rc = dnsr_name2host(argv[argi], &hinfo);
     208                if (rc != EOK) {
     209                        printf(NAME ": Error resolving host '%s'.\n", argv[argi]);
     210                        goto error;
     211                }
     212
     213                dest_addr = hinfo->addr;
    204214        }
    205215
     
    208218        if (rc != EOK) {
    209219                printf(NAME ": Failed determining source address.\n");
    210                 return 1;
    211         }
     220                goto error;
     221        }
     222
     223        rc = inet_addr_format(&src_addr, &asrc);
     224        if (rc != EOK) {
     225                printf(NAME ": Out of memory.\n");
     226                goto error;
     227        }
     228
     229        rc = inet_addr_format(&dest_addr, &adest);
     230        if (rc != EOK) {
     231                printf(NAME ": Out of memory.\n");
     232                goto error;
     233        }
     234
     235        if (hinfo != NULL) {
     236                rc = asprintf(&sdest, "%s (%s)", hinfo->name, adest);
     237                if (rc < 0) {
     238                        printf(NAME ": Out of memory.\n");
     239                        goto error;
     240                }
     241        } else {
     242                sdest = adest;
     243                adest = NULL;
     244        }
     245
     246        printf("Sending ICMP echo request from %s to %s.\n",
     247            asrc, sdest);
    212248
    213249        fid_t fid;
     
    217253                if (fid == 0) {
    218254                        printf(NAME ": Failed creating transmit fibril.\n");
    219                         return 1;
     255                        goto error;
    220256                }
    221257
     
    225261                if (fid == 0) {
    226262                        printf(NAME ": Failed creating input fibril.\n");
    227                         return 1;
     263                        goto error;
    228264                }
    229265
     
    243279        if (rc == ETIMEOUT) {
    244280                printf(NAME ": Echo request timed out.\n");
    245                 return 1;
    246         }
    247 
     281                goto error;
     282        }
     283
     284        free(asrc);
     285        free(adest);
     286        free(sdest);
     287        dnsr_hostinfo_destroy(hinfo);
    248288        return 0;
     289error:
     290        free(asrc);
     291        free(adest);
     292        free(sdest);
     293        dnsr_hostinfo_destroy(hinfo);
     294        return 1;
    249295}
    250296
  • uspace/lib/c/Makefile

    r1c7ba2d r4e716180  
    7474        generic/device/pci.c \
    7575        generic/device/ahci.c \
     76        generic/dnsr.c \
    7677        generic/dlfcn.c \
    7778        generic/elf/elf_load.c \
  • uspace/lib/c/include/ipc/services.h

    r1c7ba2d r4e716180  
    5353} services_t;
    5454
     55#define SERVICE_NAME_DNSR     "net/dnsr"
    5556#define SERVICE_NAME_INET     "net/inet"
    5657#define SERVICE_NAME_INETCFG  "net/inetcfg"
  • uspace/srv/net/inetsrv/addrobj.c

    r1c7ba2d r4e716180  
    221221
    222222        lsrc_addr.ipv4 = addr->naddr.ipv4;
    223         ldest_addr = &dgram->dest;
     223        ldest_addr = ldest;
    224224
    225225        return inet_link_send_dgram(addr->ilink, &lsrc_addr, ldest_addr, dgram,
  • uspace/srv/net/inetsrv/inetsrv.c

    r1c7ba2d r4e716180  
    9898        }
    9999       
    100         rc = inet_link_discovery_start();
     100        inet_sroute_t *sroute = inet_sroute_new();
     101        if (sroute == NULL) {
     102                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed creating default route (%d).", rc);
     103                return ENOMEM;
     104        }
     105
     106        sroute->dest.ipv4 = 0;
     107        sroute->dest.bits = 0;
     108        sroute->router.ipv4 = (192 << 24) | (168 << 16) | (0 << 8) | 1;
     109        sroute->name = str_dup("default");
     110        inet_sroute_add(sroute);
     111
     112        rc = inet_link_discovery_start();
    101113        if (rc != EOK)
    102114                return EEXIST;
  • uspace/srv/net/udp/assoc.c

    r1c7ba2d r4e716180  
    279279
    280280        fibril_mutex_lock(&assoc->lock);
    281         while (list_empty(&assoc->rcv_queue)) {
     281        while (list_empty(&assoc->rcv_queue) && !assoc->reset) {
    282282                log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv() - waiting");
    283283                fibril_condvar_wait(&assoc->rcv_queue_cv, &assoc->lock);
     284        }
     285
     286        if (assoc->reset) {
     287                log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv() - association was reset");
     288                fibril_mutex_unlock(&assoc->lock);
     289                return ECONNABORTED;
    284290        }
    285291
     
    323329}
    324330
     331/** Reset association.
     332 *
     333 * This causes any pendingreceive operations to return immediately with
     334 * UDP_ERESET.
     335 */
     336void udp_assoc_reset(udp_assoc_t *assoc)
     337{
     338        fibril_mutex_lock(&assoc->lock);
     339        assoc->reset = true;
     340        fibril_condvar_broadcast(&assoc->rcv_queue_cv);
     341        fibril_mutex_unlock(&assoc->lock);
     342}
     343
    325344static int udp_assoc_queue_msg(udp_assoc_t *assoc, udp_sockpair_t *sp,
    326345    udp_msg_t *msg)
  • uspace/srv/net/udp/assoc.h

    r1c7ba2d r4e716180  
    5151extern int udp_assoc_recv(udp_assoc_t *, udp_msg_t **, udp_sock_t *);
    5252extern void udp_assoc_received(udp_sockpair_t *, udp_msg_t *);
    53 
     53extern void udp_assoc_reset(udp_assoc_t *);
    5454
    5555#endif
  • uspace/srv/net/udp/sock.c

    r1c7ba2d r4e716180  
    537537        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close()");
    538538        int socket_id = SOCKET_GET_SOCKET_ID(call);
    539        
     539
     540        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - find core");
    540541        socket_core_t *sock_core =
    541542            socket_cores_find(&client->sockets, socket_id);
    542543        if (sock_core == NULL) {
     544        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - core not found");
    543545                async_answer_0(callid, ENOTSOCK);
    544546                return;
    545547        }
    546        
     548
     549        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - spec data");
    547550        udp_sockdata_t *socket =
    548551            (udp_sockdata_t *) sock_core->specific_data;
     552        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - lock socket");
    549553        fibril_mutex_lock(&socket->lock);
    550        
     554
     555        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - lock socket buffer");
     556        fibril_mutex_lock(&socket->recv_buffer_lock);
     557        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - set socket->sock_core = NULL");
     558        socket->sock_core = NULL;
     559        fibril_mutex_unlock(&socket->recv_buffer_lock);
     560
     561        udp_uc_reset(socket->assoc);
     562
    551563        int rc = socket_destroy(NULL, socket_id, &client->sockets, &gsock,
    552564            udp_free_sock_data);
    553565        if (rc != EOK) {
     566                log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - socket_destroy failed");
    554567                fibril_mutex_unlock(&socket->lock);
    555568                async_answer_0(callid, rc);
    556569                return;
    557570        }
    558        
     571
     572        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - broadcast recv_buffer_cv");
     573        fibril_condvar_broadcast(&socket->recv_buffer_cv);
     574
    559575        fibril_mutex_unlock(&socket->lock);
    560576        async_answer_0(callid, EOK);
     
    582598        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril()");
    583599
     600        fibril_mutex_lock(&sock->recv_buffer_lock);
     601
    584602        while (true) {
    585603                log_msg(LOG_DEFAULT, LVL_DEBUG, "[] wait for rcv buffer empty()");
    586                 fibril_mutex_lock(&sock->recv_buffer_lock);
    587                 while (sock->recv_buffer_used != 0) {
     604                while (sock->recv_buffer_used != 0 && sock->sock_core != NULL) {
    588605                        fibril_condvar_wait(&sock->recv_buffer_cv,
    589606                            &sock->recv_buffer_lock);
    590607                }
    591                
     608
     609                fibril_mutex_unlock(&sock->recv_buffer_lock);
     610
    592611                log_msg(LOG_DEFAULT, LVL_DEBUG, "[] call udp_uc_receive()");
    593612                urc = udp_uc_receive(sock->assoc, sock->recv_buffer,
    594613                    UDP_FRAGMENT_SIZE, &rcvd, &xflags, &sock->recv_fsock);
     614                fibril_mutex_lock(&sock->recv_buffer_lock);
    595615                sock->recv_error = urc;
    596                
    597                 udp_sock_notify_data(sock->sock_core);
    598                
     616
     617                log_msg(LOG_DEFAULT, LVL_DEBUG, "[] udp_uc_receive -> %d", urc);
     618
     619                if (sock->sock_core != NULL)
     620                        udp_sock_notify_data(sock->sock_core);
     621
    599622                if (urc != UDP_EOK) {
     623                        log_msg(LOG_DEFAULT, LVL_DEBUG, "[] urc != UDP_EOK, break");
    600624                        fibril_condvar_broadcast(&sock->recv_buffer_cv);
    601                         fibril_mutex_unlock(&sock->recv_buffer_lock);
    602                         break;
    603                 }
    604                
     625                        break;
     626                }
     627
    605628                log_msg(LOG_DEFAULT, LVL_DEBUG, "[] got data - broadcast recv_buffer_cv");
    606                
     629
    607630                sock->recv_buffer_used = rcvd;
    608                 fibril_mutex_unlock(&sock->recv_buffer_lock);
    609631                fibril_condvar_broadcast(&sock->recv_buffer_cv);
    610632        }
    611633
     634        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril() exited loop");
     635        fibril_mutex_unlock(&sock->recv_buffer_lock);
    612636        udp_uc_destroy(sock->assoc);
     637
     638        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril() terminated");
    613639
    614640        return 0;
  • uspace/srv/net/udp/ucall.c

    r1c7ba2d r4e716180  
    113113        log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: udp_uc_receive()", assoc->name);
    114114        rc = udp_assoc_recv(assoc, &msg, fsock);
     115        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv -> %d", rc);
    115116        switch (rc) {
     117        case EOK:
     118                break;
     119        case ECONNABORTED:
     120                return UDP_ERESET;
     121        default:
     122                assert(false);
    116123        }
    117124
     
    133140{
    134141        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_uc_destroy()");
     142        udp_assoc_reset(assoc);
    135143        udp_assoc_remove(assoc);
    136144        udp_assoc_delete(assoc);
     145}
     146
     147void udp_uc_reset(udp_assoc_t *assoc)
     148{
     149        udp_assoc_reset(assoc);
    137150}
    138151
  • uspace/srv/net/udp/ucall.h

    r1c7ba2d r4e716180  
    4949extern void udp_uc_status(udp_assoc_t *, udp_assoc_status_t *);
    5050extern void udp_uc_destroy(udp_assoc_t *);
     51extern void udp_uc_reset(udp_assoc_t *);
    5152
    5253#endif
  • uspace/srv/net/udp/udp_type.h

    r1c7ba2d r4e716180  
    5151        UDP_EUNSPEC,
    5252        /* No route to destination */
    53         UDP_ENOROUTE
     53        UDP_ENOROUTE,
     54        /** Association reset by user */
     55        UDP_ERESET
    5456} udp_error_t;
    5557
     
    119121        udp_sockpair_t ident;
    120122
     123        /** True if association was reset by user */
     124        bool reset;
     125
    121126        /** True if association was deleted by user */
    122127        bool deleted;
Note: See TracChangeset for help on using the changeset viewer.