Ignore:
File:
1 edited

Legend:

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

    r49bd793b r6b82009  
    11/*
    22 * Copyright (c) 2009 Lukas Mejdrech
    3  * Copyright (c) 2011 Radim Vansa
    43 * All rights reserved.
    54 *
     
    3736 */
    3837
    39 #include <assert.h>
    4038#include <async.h>
    4139#include <malloc.h>
     
    5250#include <net/packet.h>
    5351#include <packet_remote.h>
    54 #include <packet_client.h>
    55 #include <devman.h>
    56 #include <device/nic.h>
     52#include <netif_remote.h>
    5753#include <nil_skel.h>
    5854#include "nildummy.h"
     
    6965DEVICE_MAP_IMPLEMENT(nildummy_devices, nildummy_device_t);
    7066
    71 int nil_device_state_msg_local(nic_device_id_t device_id, sysarg_t state)
     67int nil_device_state_msg_local(device_id_t device_id, sysarg_t state)
    7268{
    7369        fibril_rwlock_read_lock(&nildummy_globals.protos_lock);
     
    9591       
    9692        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 */
     102static 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        }
    97131}
    98132
     
    114148 *
    115149 */
    116 static int nildummy_device_message(nic_device_id_t device_id,
    117     devman_handle_t handle, size_t mtu)
     150static int nildummy_device_message(device_id_t device_id, services_t service,
     151    size_t mtu)
    118152{
    119153        fibril_rwlock_write_lock(&nildummy_globals.devices_lock);
     
    123157            nildummy_devices_find(&nildummy_globals.devices, device_id);
    124158        if (device) {
    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);
     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);
    129163                        return EEXIST;
    130164                }
     
    136170                        device->mtu = NET_DEFAULT_MTU;
    137171               
    138                 printf("Device %d already exists (mtu: %zu)\n", device->device_id,
    139                     device->mtu);
     172                printf("Device %d already exists:\tMTU\t= %zu\n",
     173                    device->device_id, device->mtu);
    140174                fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
    141175               
     
    158192       
    159193        device->device_id = device_id;
    160         device->handle = handle;
     194        device->service = service;
    161195        if (mtu > 0)
    162196                device->mtu = mtu;
    163197        else
    164198                device->mtu = NET_DEFAULT_MTU;
    165        
     199
    166200        /* Bind the device driver */
    167         device->sess = devman_device_connect(EXCHANGE_SERIALIZE, handle,
    168             IPC_FLAG_BLOCKING);
     201        device->sess = netif_bind_service(device->service, device->device_id,
     202            SERVICE_ETHERNET, nildummy_receiver);
    169203        if (device->sess == NULL) {
    170204                fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
     
    173207        }
    174208       
    175         nic_connect_to_nil(device->sess, SERVICE_NILDUMMY, device_id);
    176        
    177209        /* Get hardware address */
    178         int rc = nic_get_address(device->sess, &device->addr);
     210        int rc = netif_get_addr_req(device->sess, device->device_id,
     211            &device->addr, &device->addr_data);
    179212        if (rc != EOK) {
    180213                fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
     
    182215                return rc;
    183216        }
    184        
    185         device->addr_len = ETH_ADDR;
    186217       
    187218        /* Add to the cache */
     
    190221        if (index < 0) {
    191222                fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
     223                free(device->addr);
     224                free(device->addr_data);
    192225                free(device);
    193226                return index;
    194227        }
    195228       
    196         printf("%s: Device registered (id: %d, mtu: %zu)\n", NAME,
    197             device->device_id, device->mtu);
     229        printf("%s: Device registered (id: %d, service: %d, mtu: %zu)\n",
     230            NAME, device->device_id, device->service, device->mtu);
    198231        fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
    199232        return EOK;
     
    210243 *
    211244 */
    212 static int nildummy_addr_message(nic_device_id_t device_id, size_t *addrlen)
    213 {
    214         if (!addrlen)
     245static int nildummy_addr_message(device_id_t device_id,
     246    measured_string_t **address)
     247{
     248        if (!address)
    215249                return EBADMEM;
    216250       
     
    224258        }
    225259       
    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;
     260        *address = device->addr;
    247261       
    248262        fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
    249         return EOK;
     263       
     264        return (*address) ? EOK : ENOENT;
    250265}
    251266
     
    263278 *
    264279 */
    265 static 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)
     280static int nildummy_packet_space_message(device_id_t device_id, size_t *addr_len,
     281    size_t *prefix, size_t *content, size_t *suffix)
    267282{
    268283        if ((!addr_len) || (!prefix) || (!content) || (!suffix))
     
    288303}
    289304
    290 int nil_received_msg_local(nic_device_id_t device_id, packet_t *packet)
     305int nil_received_msg_local(device_id_t device_id, packet_t *packet,
     306    services_t target)
    291307{
    292308        fibril_rwlock_read_lock(&nildummy_globals.protos_lock);
     
    324340        nildummy_globals.proto.sess = sess;
    325341       
    326         printf("%s: Protocol registered (service: %#x)\n",
     342        printf("%s: Protocol registered (service: %d)\n",
    327343            NAME, nildummy_globals.proto.service);
    328344       
     
    342358 *
    343359 */
    344 static int nildummy_send_message(nic_device_id_t device_id, packet_t *packet,
     360static int nildummy_send_message(device_id_t device_id, packet_t *packet,
    345361    services_t sender)
    346362{
     
    356372        /* Send packet queue */
    357373        if (packet)
    358                 nic_send_message(device->sess, packet_get_id(packet));
     374                netif_send_msg(device->sess, device_id, packet,
     375                    SERVICE_NILDUMMY);
    359376       
    360377        fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
     
    366383    ipc_call_t *answer, size_t *answer_count)
    367384{
     385        measured_string_t *address;
    368386        packet_t *packet;
    369387        size_t addrlen;
     
    386404        case NET_NIL_DEVICE:
    387405                return nildummy_device_message(IPC_GET_DEVICE(*call),
    388                     IPC_GET_DEVICE_HANDLE(*call), IPC_GET_MTU(*call));
     406                    IPC_GET_SERVICE(*call), IPC_GET_MTU(*call));
    389407       
    390408        case NET_NIL_SEND:
     
    409427       
    410428        case NET_NIL_ADDR:
    411         case NET_NIL_BROADCAST_ADDR:
    412                 rc = nildummy_addr_message(IPC_GET_DEVICE(*call), &addrlen);
     429                rc = nildummy_addr_message(IPC_GET_DEVICE(*call), &address);
    413430                if (rc != EOK)
    414431                        return rc;
    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;
     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);
    433439        }
    434440       
Note: See TracChangeset for help on using the changeset viewer.