Changeset 8d7ec69d in mainline for uspace/srv/net


Ignore:
Timestamp:
2012-01-22T10:40:07Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c38e417, cf9cb36
Parents:
e98fe28c
Message:

NIC should talk to its client via a callback connection with NIC-defined
protocol (was using nil, was connecting via NS).

Location:
uspace/srv/net
Files:
3 edited

Legend:

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

    re98fe28c r8d7ec69d  
    22 * Copyright (c) 2009 Lukas Mejdrech
    33 * Copyright (c) 2011 Radim Vansa
     4 * Copyright (c) 2011 Jiri Svoboda
    45 * All rights reserved.
    56 *
     
    363364                break;
    364365        default:
     366                printf("%s: Unknown service\n", NAME);
    365367                return ENOENT;
    366368        }
  • uspace/srv/net/nil/eth/eth.c

    re98fe28c r8d7ec69d  
    170170INT_MAP_IMPLEMENT(eth_protos, eth_proto_t);
    171171
    172 int nil_device_state_msg_local(nic_device_id_t device_id, sysarg_t state)
     172static void eth_nic_cb_connection(ipc_callid_t iid, ipc_call_t *icall,
     173    void *arg);
     174
     175static int eth_device_state(nic_device_id_t device_id, sysarg_t state)
    173176{
    174177        int index;
     
    344347        }
    345348       
    346         nic_connect_to_nil(device->sess, SERVICE_ETHERNET, device_id);
     349        rc = nic_callback_create(device->sess, device_id,
     350            eth_nic_cb_connection, NULL);
     351        if (rc != EOK) {
     352                fibril_rwlock_write_unlock(&eth_globals.devices_lock);
     353                async_hangup(device->sess);
     354                free(device);
     355                return EIO;
     356        }
    347357       
    348358        /* Get hardware address */
     
    822832       
    823833        rc = async_data_write_accept(&data, false, 0, 0, 0, &size);
    824         if (rc != EOK)
     834        if (rc != EOK) {
     835                printf("%s: data_write_accept() failed\n", NAME);
    825836                return rc;
     837        }
    826838       
    827839        packet_t *packet = packet_get_1_remote(eth_globals.net_sess, size);
     
    943955               
    944956                return EOK;
    945         case NET_NIL_DEVICE_STATE:
    946                 nil_device_state_msg_local(IPC_GET_DEVICE(*call), IPC_GET_STATE(*call));
    947                 async_answer_0(callid, EOK);
    948                 return EOK;
    949         case NET_NIL_RECEIVED:
    950                 rc = eth_received(IPC_GET_ARG1(*call));
    951                 async_answer_0(callid, (sysarg_t) rc);
    952                 return rc;
    953         case NET_NIL_ADDR_CHANGED:
    954                 rc = eth_addr_changed(IPC_GET_DEVICE(*call));
    955                 async_answer_0(callid, (sysarg_t) rc);
    956                 return rc;
    957957        }
    958958       
    959959        return ENOTSUP;
     960}
     961
     962static void eth_nic_cb_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg)
     963{
     964        int rc;
     965       
     966        async_answer_0(iid, EOK);
     967       
     968        while (true) {
     969                ipc_call_t call;
     970                ipc_callid_t callid = async_get_call(&call);
     971               
     972                if (!IPC_GET_IMETHOD(call))
     973                        break;
     974               
     975                switch (IPC_GET_IMETHOD(call)) {
     976                case NIC_EV_DEVICE_STATE:
     977                        rc = eth_device_state(IPC_GET_ARG1(call),
     978                            IPC_GET_ARG2(call));
     979                        async_answer_0(callid, (sysarg_t) rc);
     980                        break;
     981                case NIC_EV_RECEIVED:
     982                        rc = eth_received(IPC_GET_ARG1(call));
     983                        async_answer_0(callid, (sysarg_t) rc);
     984                        break;
     985                case NIC_EV_ADDR_CHANGED:
     986                        rc = eth_addr_changed(IPC_GET_ARG1(call));
     987                        async_answer_0(callid, (sysarg_t) rc);
     988                        break;
     989                default:
     990                        async_answer_0(callid, ENOTSUP);
     991                }
     992        }
    960993}
    961994
  • uspace/srv/net/nil/nildummy/nildummy.c

    re98fe28c r8d7ec69d  
    22 * Copyright (c) 2009 Lukas Mejdrech
    33 * Copyright (c) 2011 Radim Vansa
     4 * Copyright (c) 2011 Jiri Svoboda
    45 * All rights reserved.
    56 *
     
    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
     
    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);
     
    445460                *answer_count = 1;
    446461                return rc;
    447         case NET_NIL_DEVICE_STATE:
    448                 rc = nil_device_state_msg_local(IPC_GET_DEVICE(*call),
    449                     IPC_GET_STATE(*call));
    450                 async_answer_0(callid, (sysarg_t) rc);
    451                 return rc;
    452        
    453         case NET_NIL_RECEIVED:
    454                 rc = nildummy_received(IPC_GET_ARG1(*call));
    455                 async_answer_0(callid, (sysarg_t) rc);
    456                 return rc;
    457462        }
    458463       
    459464        return ENOTSUP;
    460465}
     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
    461500
    462501int main(int argc, char *argv[])
Note: See TracChangeset for help on using the changeset viewer.