Ignore:
File:
1 edited

Legend:

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

    r8d7ec69d r49bd793b  
    22 * Copyright (c) 2009 Lukas Mejdrech
    33 * Copyright (c) 2011 Radim Vansa
    4  * Copyright (c) 2011 Jiri Svoboda
    54 * All rights reserved.
    65 *
     
    5453#include <packet_remote.h>
    5554#include <packet_client.h>
     55#include <devman.h>
    5656#include <device/nic.h>
    57 #include <loc.h>
    5857#include <nil_skel.h>
    5958#include "nildummy.h"
     
    7069DEVICE_MAP_IMPLEMENT(nildummy_devices, nildummy_device_t);
    7170
    72 static void nildummy_nic_cb_conn(ipc_callid_t iid, ipc_call_t *icall,
    73     void *arg);
    74 
    75 static int nildummy_device_state(nic_device_id_t device_id, sysarg_t state)
     71int nil_device_state_msg_local(nic_device_id_t device_id, sysarg_t state)
    7672{
    7773        fibril_rwlock_read_lock(&nildummy_globals.protos_lock);
     
    8278       
    8379        return EOK;
    84 }
    85 
    86 static int nildummy_addr_changed(nic_device_id_t device_id)
    87 {
    88         return ENOTSUP;
    8980}
    9081
     
    124115 */
    125116static int nildummy_device_message(nic_device_id_t device_id,
    126     service_id_t sid, size_t mtu)
     117    devman_handle_t handle, size_t mtu)
    127118{
    128119        fibril_rwlock_write_lock(&nildummy_globals.devices_lock);
     
    132123            nildummy_devices_find(&nildummy_globals.devices, device_id);
    133124        if (device) {
    134                 if (device->sid != sid) {
     125                if (device->handle != handle) {
    135126                        printf("Device %d exists, handles do not match\n",
    136127                            device->device_id);
     
    167158       
    168159        device->device_id = device_id;
    169         device->sid = sid;
     160        device->handle = handle;
    170161        if (mtu > 0)
    171162                device->mtu = mtu;
     
    174165       
    175166        /* Bind the device driver */
    176         device->sess = loc_service_connect(EXCHANGE_SERIALIZE, sid,
     167        device->sess = devman_device_connect(EXCHANGE_SERIALIZE, handle,
    177168            IPC_FLAG_BLOCKING);
    178169        if (device->sess == NULL) {
     
    182173        }
    183174       
    184         int rc = nic_callback_create(device->sess, device_id,
    185             nildummy_nic_cb_conn, NULL);
    186         if (rc != EOK) {
    187                 async_hangup(device->sess);
    188                
    189                 return ENOENT;
    190         }
     175        nic_connect_to_nil(device->sess, SERVICE_NILDUMMY, device_id);
    191176       
    192177        /* Get hardware address */
    193         rc = nic_get_address(device->sess, &device->addr);
     178        int rc = nic_get_address(device->sess, &device->addr);
    194179        if (rc != EOK) {
    195180                fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
     
    360345    services_t sender)
    361346{
    362         packet_t *p;
    363        
    364347        fibril_rwlock_read_lock(&nildummy_globals.devices_lock);
    365348       
     
    371354        }
    372355       
    373         p = packet;
    374         do {
    375                 nic_send_frame(device->sess, packet_get_data(p),
    376                     packet_get_data_length(p));
    377                 p = pq_next(p);
    378         } while (p != NULL);
    379        
    380         pq_release_remote(nildummy_globals.net_sess, packet_get_id(packet));
     356        /* Send packet queue */
     357        if (packet)
     358                nic_send_message(device->sess, packet_get_id(packet));
    381359       
    382360        fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
    383361       
    384362        return EOK;
    385 }
    386 
    387 static int nildummy_received(nic_device_id_t device_id)
    388 {
    389         void *data;
    390         size_t size;
    391         int rc;
    392 
    393         rc = async_data_write_accept(&data, false, 0, 0, 0, &size);
    394         if (rc != EOK)
    395                 return rc;
    396 
    397         packet_t *packet = packet_get_1_remote(nildummy_globals.net_sess, size);
    398         if (packet == NULL)
    399                 return ENOMEM;
    400 
    401         void *pdata = packet_suffix(packet, size);
    402         memcpy(pdata, data, size);
    403         free(pdata);
    404 
    405         return nil_received_msg_local(device_id, packet);
    406363}
    407364
     
    460417                *answer_count = 1;
    461418                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;
    462433        }
    463434       
    464435        return ENOTSUP;
    465436}
    466 
    467 static void nildummy_nic_cb_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
    468 {
    469         int rc;
    470        
    471         async_answer_0(iid, EOK);
    472        
    473         while (true) {
    474                 ipc_call_t call;
    475                 ipc_callid_t callid = async_get_call(&call);
    476                
    477                 if (!IPC_GET_IMETHOD(call))
    478                         break;
    479                
    480                 switch (IPC_GET_IMETHOD(call)) {
    481                 case NIC_EV_DEVICE_STATE:
    482                         rc = nildummy_device_state(IPC_GET_ARG1(call),
    483                             IPC_GET_ARG2(call));
    484                         async_answer_0(callid, (sysarg_t) rc);
    485                         break;
    486                 case NIC_EV_RECEIVED:
    487                         rc = nildummy_received(IPC_GET_ARG1(call));
    488                         async_answer_0(callid, (sysarg_t) rc);
    489                         break;
    490                 case NIC_EV_ADDR_CHANGED:
    491                         rc = nildummy_addr_changed(IPC_GET_ARG1(call));
    492                         async_answer_0(callid, (sysarg_t) rc);
    493                         break;
    494                 default:
    495                         async_answer_0(callid, ENOTSUP);
    496                 }
    497         }
    498 }
    499 
    500437
    501438int main(int argc, char *argv[])
Note: See TracChangeset for help on using the changeset viewer.