Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/nil/nildummy/nildummy.c

    r6b82009 r49bd793b  
    11/*
    22 * Copyright (c) 2009 Lukas Mejdrech
     3 * Copyright (c) 2011 Radim Vansa
    34 * All rights reserved.
    45 *
     
    3637 */
    3738
     39#include <assert.h>
    3840#include <async.h>
    3941#include <malloc.h>
     
    5052#include <net/packet.h>
    5153#include <packet_remote.h>
    52 #include <netif_remote.h>
     54#include <packet_client.h>
     55#include <devman.h>
     56#include <device/nic.h>
    5357#include <nil_skel.h>
    5458#include "nildummy.h"
     
    6569DEVICE_MAP_IMPLEMENT(nildummy_devices, nildummy_device_t);
    6670
    67 int nil_device_state_msg_local(device_id_t device_id, sysarg_t state)
     71int nil_device_state_msg_local(nic_device_id_t device_id, sysarg_t state)
    6872{
    6973        fibril_rwlock_read_lock(&nildummy_globals.protos_lock);
     
    9195       
    9296        return rc;
    93 }
    94 
    95 /** Process IPC messages from the registered device driver modules
    96  *
    97  * @param[in]     iid   Message identifier.
    98  * @param[in,out] icall Message parameters.
    99  * @param[in]     arg    Local argument.
    100  *
    101  */
    102 static void nildummy_receiver(ipc_callid_t iid, ipc_call_t *icall, void *arg)
    103 {
    104         packet_t *packet;
    105         int rc;
    106        
    107         while (true) {
    108                 switch (IPC_GET_IMETHOD(*icall)) {
    109                 case NET_NIL_DEVICE_STATE:
    110                         rc = nil_device_state_msg_local(IPC_GET_DEVICE(*icall),
    111                             IPC_GET_STATE(*icall));
    112                         async_answer_0(iid, (sysarg_t) rc);
    113                         break;
    114                
    115                 case NET_NIL_RECEIVED:
    116                         rc = packet_translate_remote(nildummy_globals.net_sess,
    117                             &packet, IPC_GET_PACKET(*icall));
    118                         if (rc == EOK)
    119                                 rc = nil_received_msg_local(IPC_GET_DEVICE(*icall),
    120                                     packet, 0);
    121                        
    122                         async_answer_0(iid, (sysarg_t) rc);
    123                         break;
    124                
    125                 default:
    126                         async_answer_0(iid, (sysarg_t) ENOTSUP);
    127                 }
    128                
    129                 iid = async_get_call(icall);
    130         }
    13197}
    13298
     
    148114 *
    149115 */
    150 static int nildummy_device_message(device_id_t device_id, services_t service,
    151     size_t mtu)
     116static int nildummy_device_message(nic_device_id_t device_id,
     117    devman_handle_t handle, size_t mtu)
    152118{
    153119        fibril_rwlock_write_lock(&nildummy_globals.devices_lock);
     
    157123            nildummy_devices_find(&nildummy_globals.devices, device_id);
    158124        if (device) {
    159                 if (device->service != service) {
    160                         printf("Device %d already exists\n", device->device_id);
    161                         fibril_rwlock_write_unlock(
    162                             &nildummy_globals.devices_lock);
     125                if (device->handle != handle) {
     126                        printf("Device %d exists, handles do not match\n",
     127                            device->device_id);
     128                        fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
    163129                        return EEXIST;
    164130                }
     
    170136                        device->mtu = NET_DEFAULT_MTU;
    171137               
    172                 printf("Device %d already exists:\tMTU\t= %zu\n",
    173                     device->device_id, device->mtu);
     138                printf("Device %d already exists (mtu: %zu)\n", device->device_id,
     139                    device->mtu);
    174140                fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
    175141               
     
    192158       
    193159        device->device_id = device_id;
    194         device->service = service;
     160        device->handle = handle;
    195161        if (mtu > 0)
    196162                device->mtu = mtu;
    197163        else
    198164                device->mtu = NET_DEFAULT_MTU;
    199 
     165       
    200166        /* Bind the device driver */
    201         device->sess = netif_bind_service(device->service, device->device_id,
    202             SERVICE_ETHERNET, nildummy_receiver);
     167        device->sess = devman_device_connect(EXCHANGE_SERIALIZE, handle,
     168            IPC_FLAG_BLOCKING);
    203169        if (device->sess == NULL) {
    204170                fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
     
    207173        }
    208174       
     175        nic_connect_to_nil(device->sess, SERVICE_NILDUMMY, device_id);
     176       
    209177        /* Get hardware address */
    210         int rc = netif_get_addr_req(device->sess, device->device_id,
    211             &device->addr, &device->addr_data);
     178        int rc = nic_get_address(device->sess, &device->addr);
    212179        if (rc != EOK) {
    213180                fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
     
    215182                return rc;
    216183        }
     184       
     185        device->addr_len = ETH_ADDR;
    217186       
    218187        /* Add to the cache */
     
    221190        if (index < 0) {
    222191                fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
    223                 free(device->addr);
    224                 free(device->addr_data);
    225192                free(device);
    226193                return index;
    227194        }
    228195       
    229         printf("%s: Device registered (id: %d, service: %d, mtu: %zu)\n",
    230             NAME, device->device_id, device->service, device->mtu);
     196        printf("%s: Device registered (id: %d, mtu: %zu)\n", NAME,
     197            device->device_id, device->mtu);
    231198        fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
    232199        return EOK;
     
    243210 *
    244211 */
    245 static int nildummy_addr_message(device_id_t device_id,
    246     measured_string_t **address)
    247 {
    248         if (!address)
     212static int nildummy_addr_message(nic_device_id_t device_id, size_t *addrlen)
     213{
     214        if (!addrlen)
    249215                return EBADMEM;
    250216       
     
    258224        }
    259225       
    260         *address = device->addr;
     226        ipc_callid_t callid;
     227        size_t max_len;
     228        if (!async_data_read_receive(&callid, &max_len)) {
     229                fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
     230                return EREFUSED;
     231        }
     232       
     233        if (max_len < device->addr_len) {
     234                fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
     235                async_data_read_finalize(callid, NULL, 0);
     236                return ELIMIT;
     237        }
     238       
     239        int rc = async_data_read_finalize(callid,
     240            (uint8_t *) &device->addr.address, device->addr_len);
     241        if (rc != EOK) {
     242                fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
     243                return rc;
     244        }
     245       
     246        *addrlen = device->addr_len;
    261247       
    262248        fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
    263        
    264         return (*address) ? EOK : ENOENT;
     249        return EOK;
    265250}
    266251
     
    278263 *
    279264 */
    280 static int nildummy_packet_space_message(device_id_t device_id, size_t *addr_len,
    281     size_t *prefix, size_t *content, size_t *suffix)
     265static int nildummy_packet_space_message(nic_device_id_t device_id,
     266    size_t *addr_len, size_t *prefix, size_t *content, size_t *suffix)
    282267{
    283268        if ((!addr_len) || (!prefix) || (!content) || (!suffix))
     
    303288}
    304289
    305 int nil_received_msg_local(device_id_t device_id, packet_t *packet,
    306     services_t target)
     290int nil_received_msg_local(nic_device_id_t device_id, packet_t *packet)
    307291{
    308292        fibril_rwlock_read_lock(&nildummy_globals.protos_lock);
     
    340324        nildummy_globals.proto.sess = sess;
    341325       
    342         printf("%s: Protocol registered (service: %d)\n",
     326        printf("%s: Protocol registered (service: %#x)\n",
    343327            NAME, nildummy_globals.proto.service);
    344328       
     
    358342 *
    359343 */
    360 static int nildummy_send_message(device_id_t device_id, packet_t *packet,
     344static int nildummy_send_message(nic_device_id_t device_id, packet_t *packet,
    361345    services_t sender)
    362346{
     
    372356        /* Send packet queue */
    373357        if (packet)
    374                 netif_send_msg(device->sess, device_id, packet,
    375                     SERVICE_NILDUMMY);
     358                nic_send_message(device->sess, packet_get_id(packet));
    376359       
    377360        fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
     
    383366    ipc_call_t *answer, size_t *answer_count)
    384367{
    385         measured_string_t *address;
    386368        packet_t *packet;
    387369        size_t addrlen;
     
    404386        case NET_NIL_DEVICE:
    405387                return nildummy_device_message(IPC_GET_DEVICE(*call),
    406                     IPC_GET_SERVICE(*call), IPC_GET_MTU(*call));
     388                    IPC_GET_DEVICE_HANDLE(*call), IPC_GET_MTU(*call));
    407389       
    408390        case NET_NIL_SEND:
     
    427409       
    428410        case NET_NIL_ADDR:
    429                 rc = nildummy_addr_message(IPC_GET_DEVICE(*call), &address);
     411        case NET_NIL_BROADCAST_ADDR:
     412                rc = nildummy_addr_message(IPC_GET_DEVICE(*call), &addrlen);
    430413                if (rc != EOK)
    431414                        return rc;
    432                 return measured_strings_reply(address, 1);
    433        
    434         case NET_NIL_BROADCAST_ADDR:
    435                 rc = nildummy_addr_message(IPC_GET_DEVICE(*call), &address);
    436                 if (rc != EOK)
    437                         return rc;
    438                 return measured_strings_reply(address, 1);
     415               
     416                IPC_SET_ADDR(*answer, addrlen);
     417                *answer_count = 1;
     418                return rc;
     419        case NET_NIL_DEVICE_STATE:
     420                rc = nil_device_state_msg_local(IPC_GET_DEVICE(*call),
     421                    IPC_GET_STATE(*call));
     422                async_answer_0(callid, (sysarg_t) rc);
     423                return rc;
     424       
     425        case NET_NIL_RECEIVED:
     426                rc = packet_translate_remote(nildummy_globals.net_sess, &packet,
     427                    IPC_GET_ARG2(*call));
     428                if (rc == EOK)
     429                        rc = nil_received_msg_local(IPC_GET_ARG1(*call), packet);
     430               
     431                async_answer_0(callid, (sysarg_t) rc);
     432                return rc;
    439433        }
    440434       
Note: See TracChangeset for help on using the changeset viewer.