Changeset 02a09ed in mainline for uspace/srv/net/inetsrv/inetping.c


Ignore:
Timestamp:
2013-06-28T20:20:03Z (11 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1d24ad3
Parents:
edf0d27
Message:

add basic infrastructure for IPv6 (inactive)
make inet_addr_t a universal address type

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/inetsrv/inetping.c

    redf0d27 r02a09ed  
    4343#include <stdlib.h>
    4444#include <sys/types.h>
    45 
     45#include <net/socket_codes.h>
    4646#include "icmp.h"
    4747#include "icmp_std.h"
     
    5555static uint16_t inetping_ident = 0;
    5656
    57 static inetping_client_t *inetping_client_find(uint16_t);
    58 
    5957static int inetping_send(inetping_client_t *client, inetping_sdu_t *sdu)
    6058{
     
    6260}
    6361
    64 static int inetping_get_srcaddr(inetping_client_t *client, uint32_t remote,
    65     uint32_t *local)
     62static int inetping_get_srcaddr(inetping_client_t *client, addr32_t remote,
     63    addr32_t *local)
    6664{
    6765        inet_addr_t remote_addr;
    68         inet_addr_unpack(remote, &remote_addr);
     66        inet_addr_set(remote, &remote_addr);
    6967       
    7068        inet_addr_t local_addr;
     
    7371                return rc;
    7472       
    75         return inet_addr_pack(&local_addr, local);
     73        uint16_t family = inet_addr_get(&local_addr, local, NULL);
     74        if (family != AF_INET)
     75                return EINVAL;
     76       
     77        return EOK;
     78}
     79
     80static inetping_client_t *inetping_client_find(uint16_t ident)
     81{
     82        fibril_mutex_lock(&client_list_lock);
     83       
     84        list_foreach(client_list, link) {
     85                inetping_client_t *client = list_get_instance(link,
     86                    inetping_client_t, client_list);
     87               
     88                if (client->ident == ident) {
     89                        fibril_mutex_unlock(&client_list_lock);
     90                        return client;
     91                }
     92        }
     93       
     94        fibril_mutex_unlock(&client_list_lock);
     95        return NULL;
    7696}
    7797
    7898int inetping_recv(uint16_t ident, inetping_sdu_t *sdu)
    7999{
    80         inetping_client_t *client;
    81         async_exch_t *exch;
    82         ipc_call_t answer;
    83 
    84         client = inetping_client_find(ident);
     100        inetping_client_t *client = inetping_client_find(ident);
    85101        if (client == NULL) {
    86102                log_msg(LOG_DEFAULT, LVL_DEBUG, "Unknown ICMP ident. Dropping.");
    87103                return ENOENT;
    88104        }
    89 
    90         exch = async_exchange_begin(client->sess);
    91 
     105       
     106        async_exch_t *exch = async_exchange_begin(client->sess);
     107       
     108        ipc_call_t answer;
    92109        aid_t req = async_send_3(exch, INETPING_EV_RECV, (sysarg_t) sdu->src,
    93110            (sysarg_t) sdu->dest, sdu->seq_no, &answer);
    94111        int rc = async_data_write_start(exch, sdu->data, sdu->size);
     112       
    95113        async_exchange_end(exch);
    96114       
     
    170188}
    171189
    172 static inetping_client_t *inetping_client_find(uint16_t ident)
    173 {
    174         fibril_mutex_lock(&client_list_lock);
    175 
    176         list_foreach(client_list, link) {
    177                 inetping_client_t *client = list_get_instance(link,
    178                     inetping_client_t, client_list);
    179 
    180                 if (client->ident == ident) {
    181                         fibril_mutex_unlock(&client_list_lock);
    182                         return client;
    183                 }
    184         }
    185 
    186         fibril_mutex_unlock(&client_list_lock);
    187         return NULL;
    188 }
    189 
    190190void inetping_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
    191191{
    192         inetping_client_t client;
    193         int rc;
    194 
    195192        log_msg(LOG_DEFAULT, LVL_DEBUG, "inetping_conn()");
    196 
     193       
    197194        /* Accept the connection */
    198195        async_answer_0(iid, EOK);
    199 
    200         rc = inetping_client_init(&client);
     196       
     197        inetping_client_t client;
     198        int rc = inetping_client_init(&client);
    201199        if (rc != EOK)
    202200                return;
Note: See TracChangeset for help on using the changeset viewer.