Ignore:
Timestamp:
2012-02-09T20:35:12Z (12 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
591762c6
Parents:
7cede12c (diff), 3d4750f (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

    r7cede12c rb7068da  
    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);
     
    354369        }
    355370       
    356         /* Send packet queue */
    357         if (packet)
    358                 nic_send_message(device->sess, packet_get_id(packet));
     371        packet_t *p = packet;
     372        do {
     373                nic_send_frame(device->sess, packet_get_data(p),
     374                    packet_get_data_length(p));
     375                p = pq_next(p);
     376        } while (p != NULL);
     377       
     378        pq_release_remote(nildummy_globals.net_sess, packet_get_id(packet));
    359379       
    360380        fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
    361381       
    362382        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);
    363404}
    364405
     
    417458                *answer_count = 1;
    418459                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;
    433460        }
    434461       
    435462        return ENOTSUP;
    436463}
     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
    437498
    438499int main(int argc, char *argv[])
Note: See TracChangeset for help on using the changeset viewer.