Ignore:
Timestamp:
2012-02-14T22:06:15Z (12 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a31aad1
Parents:
199112e4 (diff), e10d41a (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 mainline changes.

File:
1 edited

Legend:

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

    r199112e4 rcfb79747  
    22 * Copyright (c) 2009 Lukas Mejdrech
    33 * Copyright (c) 2011 Radim Vansa
     4 * Copyright (c) 2011 Jiri Svoboda
    45 * All rights reserved.
    56 *
     
    5354#include <packet_remote.h>
    5455#include <packet_client.h>
    55 #include <devman.h>
    5656#include <device/nic.h>
     57#include <loc.h>
    5758#include <nil_skel.h>
    5859#include "nildummy.h"
     
    6970DEVICE_MAP_IMPLEMENT(nildummy_devices, nildummy_device_t);
    7071
    71 int nil_device_state_msg_local(nic_device_id_t device_id, sysarg_t state)
     72static void nildummy_nic_cb_conn(ipc_callid_t iid, ipc_call_t *icall,
     73    void *arg);
     74
     75static int nildummy_device_state(nildummy_device_t *device, sysarg_t state)
    7276{
    7377        fibril_rwlock_read_lock(&nildummy_globals.protos_lock);
    7478        if (nildummy_globals.proto.sess)
    75                 il_device_state_msg(nildummy_globals.proto.sess, device_id,
    76                     state, nildummy_globals.proto.service);
     79                il_device_state_msg(nildummy_globals.proto.sess,
     80                    device->device_id, state, nildummy_globals.proto.service);
    7781        fibril_rwlock_read_unlock(&nildummy_globals.protos_lock);
    7882       
    7983        return EOK;
     84}
     85
     86static int nildummy_addr_changed(nildummy_device_t *device)
     87{
     88        return ENOTSUP;
    8089}
    8190
     
    115124 */
    116125static int nildummy_device_message(nic_device_id_t device_id,
    117     devman_handle_t handle, size_t mtu)
     126    service_id_t sid, size_t mtu)
    118127{
    119128        fibril_rwlock_write_lock(&nildummy_globals.devices_lock);
     
    123132            nildummy_devices_find(&nildummy_globals.devices, device_id);
    124133        if (device) {
    125                 if (device->handle != handle) {
     134                if (device->sid != sid) {
    126135                        printf("Device %d exists, handles do not match\n",
    127136                            device->device_id);
     
    158167       
    159168        device->device_id = device_id;
    160         device->handle = handle;
     169        device->sid = sid;
    161170        if (mtu > 0)
    162171                device->mtu = mtu;
     
    165174       
    166175        /* Bind the device driver */
    167         device->sess = devman_device_connect(EXCHANGE_SERIALIZE, handle,
     176        device->sess = loc_service_connect(EXCHANGE_SERIALIZE, sid,
    168177            IPC_FLAG_BLOCKING);
    169178        if (device->sess == NULL) {
     
    173182        }
    174183       
    175         nic_connect_to_nil(device->sess, SERVICE_NILDUMMY, device_id);
     184        int rc = nic_callback_create(device->sess, nildummy_nic_cb_conn,
     185            device);
     186        if (rc != EOK) {
     187                async_hangup(device->sess);
     188               
     189                return ENOENT;
     190        }
    176191       
    177192        /* Get hardware address */
    178         int rc = nic_get_address(device->sess, &device->addr);
     193        rc = nic_get_address(device->sess, &device->addr);
    179194        if (rc != EOK) {
    180195                fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
     
    345360    services_t sender)
    346361{
    347         packet_t *p;
    348        
    349362        fibril_rwlock_read_lock(&nildummy_globals.devices_lock);
    350363       
     
    356369        }
    357370       
    358         p = packet;
     371        packet_t *p = packet;
    359372        do {
    360373                nic_send_frame(device->sess, packet_get_data(p),
     
    368381       
    369382        return EOK;
     383}
     384
     385static int nildummy_received(nildummy_device_t *device)
     386{
     387        void *data;
     388        size_t size;
     389        int rc;
     390
     391        rc = async_data_write_accept(&data, false, 0, 0, 0, &size);
     392        if (rc != EOK)
     393                return rc;
     394
     395        packet_t *packet = packet_get_1_remote(nildummy_globals.net_sess, size);
     396        if (packet == NULL)
     397                return ENOMEM;
     398
     399        void *pdata = packet_suffix(packet, size);
     400        memcpy(pdata, data, size);
     401        free(pdata);
     402
     403        return nil_received_msg_local(device->device_id, packet);
    370404}
    371405
     
    424458                *answer_count = 1;
    425459                return rc;
    426         case NET_NIL_DEVICE_STATE:
    427                 rc = nil_device_state_msg_local(IPC_GET_DEVICE(*call),
    428                     IPC_GET_STATE(*call));
    429                 async_answer_0(callid, (sysarg_t) rc);
    430                 return rc;
    431        
    432         case NET_NIL_RECEIVED:
    433                 rc = packet_translate_remote(nildummy_globals.net_sess, &packet,
    434                     IPC_GET_ARG2(*call));
    435                 if (rc == EOK)
    436                         rc = nil_received_msg_local(IPC_GET_ARG1(*call), packet);
    437                
    438                 async_answer_0(callid, (sysarg_t) rc);
    439                 return rc;
    440460        }
    441461       
    442462        return ENOTSUP;
    443463}
     464
     465static void nildummy_nic_cb_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
     466{
     467        nildummy_device_t *device = (nildummy_device_t *)arg;
     468        int rc;
     469       
     470        async_answer_0(iid, EOK);
     471       
     472        while (true) {
     473                ipc_call_t call;
     474                ipc_callid_t callid = async_get_call(&call);
     475               
     476                if (!IPC_GET_IMETHOD(call))
     477                        break;
     478               
     479                switch (IPC_GET_IMETHOD(call)) {
     480                case NIC_EV_DEVICE_STATE:
     481                        rc = nildummy_device_state(device, IPC_GET_ARG1(call));
     482                        async_answer_0(callid, (sysarg_t) rc);
     483                        break;
     484                case NIC_EV_RECEIVED:
     485                        rc = nildummy_received(device);
     486                        async_answer_0(callid, (sysarg_t) rc);
     487                        break;
     488                case NIC_EV_ADDR_CHANGED:
     489                        rc = nildummy_addr_changed(device);
     490                        async_answer_0(callid, (sysarg_t) rc);
     491                        break;
     492                default:
     493                        async_answer_0(callid, ENOTSUP);
     494                }
     495        }
     496}
     497
    444498
    445499int main(int argc, char *argv[])
Note: See TracChangeset for help on using the changeset viewer.