Ignore:
Timestamp:
2012-01-24T02:27:43Z (12 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
230385c
Parents:
8afeb04 (diff), 2df6f6fe (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:

Mainline changes.

File:
1 edited

Legend:

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

    r8afeb04 r948911d  
    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(nic_device_id_t device_id, sysarg_t state)
    7276{
    7377        fibril_rwlock_read_lock(&nildummy_globals.protos_lock);
     
    7882       
    7983        return EOK;
     84}
     85
     86static int nildummy_addr_changed(nic_device_id_t device_id)
     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, device_id,
     185            nildummy_nic_cb_conn, NULL);
     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{
     362        packet_t *p;
     363       
    347364        fibril_rwlock_read_lock(&nildummy_globals.devices_lock);
    348365       
     
    354371        }
    355372       
    356         /* Send packet queue */
    357         if (packet)
    358                 nic_send_message(device->sess, packet_get_id(packet));
     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));
    359381       
    360382        fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
    361383       
    362384        return EOK;
     385}
     386
     387static 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);
    363406}
    364407
     
    417460                *answer_count = 1;
    418461                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;
    433462        }
    434463       
    435464        return ENOTSUP;
    436465}
     466
     467static 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
    437500
    438501int main(int argc, char *argv[])
Note: See TracChangeset for help on using the changeset viewer.