Ignore:
File:
1 edited

Legend:

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

    r3cd95ef rffa2c8ef  
    4141#include <stdio.h>
    4242#include <str.h>
    43 #include <err.h>
    44 #include <ipc/ipc.h>
     43#include <ipc/nil.h>
    4544#include <ipc/net.h>
    4645#include <ipc/services.h>
     
    4847#include <net/modules.h>
    4948#include <net/device.h>
    50 #include <netif_interface.h>
    51 #include <nil_interface.h>
    52 #include <il_interface.h>
     49#include <il_remote.h>
    5350#include <adt/measured_strings.h>
    5451#include <net/packet.h>
    5552#include <packet_remote.h>
    56 #include <nil_local.h>
     53#include <netif_remote.h>
     54#include <nil_skel.h>
    5755
    5856#include "nildummy.h"
     
    8280int nil_initialize(int net_phone)
    8381{
    84         ERROR_DECLARE;
    85        
    8682        fibril_rwlock_initialize(&nildummy_globals.devices_lock);
    8783        fibril_rwlock_initialize(&nildummy_globals.protos_lock);
     
    9187        nildummy_globals.net_phone = net_phone;
    9288        nildummy_globals.proto.phone = 0;
    93         ERROR_CODE = nildummy_devices_initialize(&nildummy_globals.devices);
     89        int rc = nildummy_devices_initialize(&nildummy_globals.devices);
    9490       
    9591        fibril_rwlock_write_unlock(&nildummy_globals.protos_lock);
    9692        fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
    9793       
    98         return ERROR_CODE;
    99 }
    100 
    101 /** Process IPC messages from the registered device driver modules in an
    102  * infinite loop.
    103  *
    104  * @param[in] iid       The message identifier.
    105  * @param[in,out]       icall The message parameters.
     94        return rc;
     95}
     96
     97/** Process IPC messages from the registered device driver modules
     98 *
     99 * @param[in]     iid   Message identifier.
     100 * @param[in,out] icall Message parameters.
     101 *
    106102 */
    107103static void nildummy_receiver(ipc_callid_t iid, ipc_call_t *icall)
    108104{
    109         ERROR_DECLARE;
    110 
    111         packet_t packet;
    112 
     105        packet_t *packet;
     106        int rc;
     107       
    113108        while (true) {
    114                 switch (IPC_GET_METHOD(*icall)) {
     109                switch (IPC_GET_IMETHOD(*icall)) {
    115110                case NET_NIL_DEVICE_STATE:
    116                         ERROR_CODE = nil_device_state_msg_local(0,
    117                             IPC_GET_DEVICE(icall), IPC_GET_STATE(icall));
    118                         ipc_answer_0(iid, (ipcarg_t) ERROR_CODE);
     111                        rc = nil_device_state_msg_local(0,
     112                            IPC_GET_DEVICE(*icall), IPC_GET_STATE(*icall));
     113                        async_answer_0(iid, (sysarg_t) rc);
    119114                        break;
    120115               
    121116                case NET_NIL_RECEIVED:
    122                         if (ERROR_NONE(packet_translate_remote(
    123                             nildummy_globals.net_phone, &packet,
    124                             IPC_GET_PACKET(icall)))) {
    125                                 ERROR_CODE = nil_received_msg_local(0,
    126                                     IPC_GET_DEVICE(icall), packet, 0);
    127                         }
    128                         ipc_answer_0(iid, (ipcarg_t) ERROR_CODE);
     117                        rc = packet_translate_remote(nildummy_globals.net_phone,
     118                            &packet, IPC_GET_PACKET(*icall));
     119                        if (rc == EOK)
     120                                rc = nil_received_msg_local(0,
     121                                    IPC_GET_DEVICE(*icall), packet, 0);
     122                       
     123                        async_answer_0(iid, (sysarg_t) rc);
    129124                        break;
    130125               
    131126                default:
    132                         ipc_answer_0(iid, (ipcarg_t) ENOTSUP);
     127                        async_answer_0(iid, (sysarg_t) ENOTSUP);
    133128                }
    134129               
     
    141136 * Determine the device local hardware address.
    142137 *
    143  * @param[in] device_id The new device identifier.
    144  * @param[in] service   The device driver service.
    145  * @param[in] mtu       The device maximum transmission unit.
    146  * @returns             EOK on success.
    147  * @returns             EEXIST if the device with the different service exists.
    148  * @returns             ENOMEM if there is not enough memory left.
    149  * @returns             Other error codes as defined for the
    150  *                      netif_bind_service() function.
    151  * @returns             Other error codes as defined for the
    152  *                      netif_get_addr_req() function.
    153  */
    154 static int
    155 nildummy_device_message(device_id_t device_id, services_t service, size_t mtu)
    156 {
    157         ERROR_DECLARE;
    158 
    159         nildummy_device_ref device;
    160         int index;
    161 
     138 * @param[in] device_id New device identifier.
     139 * @param[in] service   Device driver service.
     140 * @param[in] mtu       Device maximum transmission unit.
     141 *
     142 * @return EOK on success.
     143 * @return EEXIST if the device with the different service exists.
     144 * @return ENOMEM if there is not enough memory left.
     145 * @return Other error codes as defined for the
     146 *         netif_bind_service() function.
     147 * @return Other error codes as defined for the
     148 *         netif_get_addr_req() function.
     149 *
     150 */
     151static int nildummy_device_message(device_id_t device_id, services_t service,
     152    size_t mtu)
     153{
    162154        fibril_rwlock_write_lock(&nildummy_globals.devices_lock);
    163 
    164         // an existing device?
    165         device = nildummy_devices_find(&nildummy_globals.devices, device_id);
     155       
     156        /* An existing device? */
     157        nildummy_device_t *device =
     158            nildummy_devices_find(&nildummy_globals.devices, device_id);
    166159        if (device) {
    167160                if (device->service != service) {
     
    172165                }
    173166               
    174                 // update mtu
     167                /* Update MTU */
    175168                if (mtu > 0)
    176169                        device->mtu = mtu;
     
    178171                        device->mtu = NET_DEFAULT_MTU;
    179172               
    180                 printf("Device %d already exists:\tMTU\t= %d\n",
     173                printf("Device %d already exists:\tMTU\t= %zu\n",
    181174                    device->device_id, device->mtu);
    182175                fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
    183176               
    184                 // notify the upper layer module
     177                /* Notify the upper layer module */
    185178                fibril_rwlock_read_lock(&nildummy_globals.protos_lock);
    186179                if (nildummy_globals.proto.phone) {
     
    194187        }
    195188       
    196         // create a new device
    197         device = (nildummy_device_ref) malloc(sizeof(nildummy_device_t));
     189        /* Create a new device */
     190        device = (nildummy_device_t *) malloc(sizeof(nildummy_device_t));
    198191        if (!device)
    199192                return ENOMEM;
     
    206199                device->mtu = NET_DEFAULT_MTU;
    207200
    208         // bind the device driver
     201        /* Bind the device driver */
    209202        device->phone = netif_bind_service(device->service, device->device_id,
    210203            SERVICE_ETHERNET, nildummy_receiver);
     
    215208        }
    216209       
    217         // get hardware address
    218         if (ERROR_OCCURRED(netif_get_addr_req(device->phone, device->device_id,
    219             &device->addr, &device->addr_data))) {
     210        /* Get hardware address */
     211        int rc = netif_get_addr_req(device->phone, device->device_id,
     212            &device->addr, &device->addr_data);
     213        if (rc != EOK) {
    220214                fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
    221215                free(device);
    222                 return ERROR_CODE;
    223         }
    224        
    225         // add to the cache
    226         index = nildummy_devices_add(&nildummy_globals.devices,
     216                return rc;
     217        }
     218       
     219        /* Add to the cache */
     220        int index = nildummy_devices_add(&nildummy_globals.devices,
    227221            device->device_id, device);
    228222        if (index < 0) {
     
    234228        }
    235229       
    236         printf("%s: Device registered (id: %d, service: %d, mtu: %d)\n",
     230        printf("%s: Device registered (id: %d, service: %d, mtu: %zu)\n",
    237231            NAME, device->device_id, device->service, device->mtu);
    238232        fibril_rwlock_write_unlock(&nildummy_globals.devices_lock);
     
    242236/** Return the device hardware address.
    243237 *
    244  * @param[in] device_id The device identifier.
    245  * @param[out] address  The device hardware address.
    246  * @return               EOK on success.
    247  * @return              EBADMEM if the address parameter is NULL.
    248  * @return              ENOENT if there no such device.
    249  *
    250  */
    251 static int
    252 nildummy_addr_message(device_id_t device_id, measured_string_ref *address)
    253 {
    254         nildummy_device_ref device;
    255 
     238 * @param[in]  device_id Device identifier.
     239 * @param[out] address   Device hardware address.
     240 *
     241 * @return EOK on success.
     242 * @return EBADMEM if the address parameter is NULL.
     243 * @return ENOENT if there no such device.
     244 *
     245 */
     246static int nildummy_addr_message(device_id_t device_id,
     247    measured_string_t **address)
     248{
    256249        if (!address)
    257250                return EBADMEM;
    258251       
    259252        fibril_rwlock_read_lock(&nildummy_globals.devices_lock);
    260         device = nildummy_devices_find(&nildummy_globals.devices, device_id);
     253       
     254        nildummy_device_t *device =
     255            nildummy_devices_find(&nildummy_globals.devices, device_id);
    261256        if (!device) {
    262257                fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
    263258                return ENOENT;
    264259        }
     260       
    265261        *address = device->addr;
     262       
    266263        fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
    267264       
     
    271268/** Return the device packet dimensions for sending.
    272269 *
    273  * @param[in] device_id The device identifier.
    274  * @param[out] addr_len The minimum reserved address length.
    275  * @param[out] prefix   The minimum reserved prefix size.
    276  * @param[out] content  The maximum content size.
    277  * @param[out] suffix   The minimum reserved suffix size.
    278  * @return              EOK on success.
    279  * @return              EBADMEM if either one of the parameters is NULL.
    280  * @return              ENOENT if there is no such device.
    281  *
    282  */
    283 static int
    284 nildummy_packet_space_message(device_id_t device_id, size_t *addr_len,
     270 * @param[in]  device_id Device identifier.
     271 * @param[out] addr_len  Minimum reserved address length.
     272 * @param[out] prefix    Minimum reserved prefix size.
     273 * @param[out] content   Maximum content size.
     274 * @param[out] suffix    Minimum reserved suffix size.
     275 *
     276 * @return EOK on success.
     277 * @return EBADMEM if either one of the parameters is NULL.
     278 * @return ENOENT if there is no such device.
     279 *
     280 */
     281static int nildummy_packet_space_message(device_id_t device_id, size_t *addr_len,
    285282    size_t *prefix, size_t *content, size_t *suffix)
    286283{
    287         nildummy_device_ref device;
    288 
    289         if (!addr_len || !prefix || !content || !suffix)
     284        if ((!addr_len) || (!prefix) || (!content) || (!suffix))
    290285                return EBADMEM;
    291286       
    292287        fibril_rwlock_read_lock(&nildummy_globals.devices_lock);
    293         device = nildummy_devices_find(&nildummy_globals.devices, device_id);
     288       
     289        nildummy_device_t *device =
     290            nildummy_devices_find(&nildummy_globals.devices, device_id);
    294291        if (!device) {
    295292                fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
    296293                return ENOENT;
    297294        }
     295       
    298296        *content = device->mtu;
     297       
    299298        fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
    300299       
     
    305304}
    306305
    307 int
    308 nil_received_msg_local(int nil_phone, device_id_t device_id, packet_t packet,
    309     services_t target)
    310 {
    311         packet_t next;
    312 
     306int nil_received_msg_local(int nil_phone, device_id_t device_id,
     307    packet_t *packet, services_t target)
     308{
    313309        fibril_rwlock_read_lock(&nildummy_globals.protos_lock);
     310       
    314311        if (nildummy_globals.proto.phone) {
    315312                do {
    316                         next = pq_detach(packet);
     313                        packet_t *next = pq_detach(packet);
    317314                        il_received_msg(nildummy_globals.proto.phone, device_id,
    318315                            packet, nildummy_globals.proto.service);
    319316                        packet = next;
    320                 } while(packet);
    321         }
     317                } while (packet);
     318        }
     319       
    322320        fibril_rwlock_read_unlock(&nildummy_globals.protos_lock);
    323321       
     
    329327 * Pass received packets for this service.
    330328 *
    331  * @param[in] service   The module service.
    332  * @param[in] phone     The service phone.
    333  * @return              EOK on success.
    334  * @return              ENOENT if the service is not known.
    335  * @return              ENOMEM if there is not enough memory left.
     329 * @param[in] service Module service.
     330 * @param[in] phone   Service phone.
     331 *
     332 * @return EOK on success.
     333 * @return ENOENT if the service is not known.
     334 * @return ENOMEM if there is not enough memory left.
     335 *
    336336 */
    337337static int nildummy_register_message(services_t service, int phone)
     
    350350/** Send the packet queue.
    351351 *
    352  * @param[in] device_id The device identifier.
    353  * @param[in] packet    The packet queue.
    354  * @param[in] sender    The sending module service.
    355  * @return              EOK on success.
    356  * @return              ENOENT if there no such device.
    357  * @return              EINVAL if the service parameter is not known.
    358  */
    359 static int
    360 nildummy_send_message(device_id_t device_id, packet_t packet, services_t sender)
    361 {
    362         nildummy_device_ref device;
    363 
     352 * @param[in] device_id Device identifier.
     353 * @param[in] packet    Packet queue.
     354 * @param[in] sender    Sending module service.
     355 *
     356 * @return EOK on success.
     357 * @return ENOENT if there no such device.
     358 * @return EINVAL if the service parameter is not known.
     359 *
     360 */
     361static int nildummy_send_message(device_id_t device_id, packet_t *packet,
     362    services_t sender)
     363{
    364364        fibril_rwlock_read_lock(&nildummy_globals.devices_lock);
    365         device = nildummy_devices_find(&nildummy_globals.devices, device_id);
     365       
     366        nildummy_device_t *device =
     367            nildummy_devices_find(&nildummy_globals.devices, device_id);
    366368        if (!device) {
    367369                fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
    368370                return ENOENT;
    369371        }
    370         // send packet queue
     372       
     373        /* Send packet queue */
    371374        if (packet)
    372375                netif_send_msg(device->phone, device_id, packet,
    373376                    SERVICE_NILDUMMY);
     377       
    374378        fibril_rwlock_read_unlock(&nildummy_globals.devices_lock);
    375         return EOK;
    376 }
    377 
    378 int
    379 nil_message_standalone(const char *name, ipc_callid_t callid, ipc_call_t *call,
    380     ipc_call_t *answer, int *answer_count)
    381 {
    382         ERROR_DECLARE;
    383        
    384         measured_string_ref address;
    385         packet_t packet;
     379       
     380        return EOK;
     381}
     382
     383int nil_module_message(ipc_callid_t callid, ipc_call_t *call,
     384    ipc_call_t *answer, size_t *answer_count)
     385{
     386        measured_string_t *address;
     387        packet_t *packet;
    386388        size_t addrlen;
    387389        size_t prefix;
    388390        size_t suffix;
    389391        size_t content;
     392        int rc;
    390393       
    391394        *answer_count = 0;
    392         switch (IPC_GET_METHOD(*call)) {
     395        switch (IPC_GET_IMETHOD(*call)) {
    393396        case IPC_M_PHONE_HUNGUP:
    394397                return EOK;
    395398       
    396399        case NET_NIL_DEVICE:
    397                 return nildummy_device_message(IPC_GET_DEVICE(call),
    398                     IPC_GET_SERVICE(call), IPC_GET_MTU(call));
     400                return nildummy_device_message(IPC_GET_DEVICE(*call),
     401                    IPC_GET_SERVICE(*call), IPC_GET_MTU(*call));
    399402       
    400403        case NET_NIL_SEND:
    401                 ERROR_PROPAGATE(packet_translate_remote(
    402                     nildummy_globals.net_phone, &packet, IPC_GET_PACKET(call)));
    403                 return nildummy_send_message(IPC_GET_DEVICE(call), packet,
    404                     IPC_GET_SERVICE(call));
     404                rc = packet_translate_remote(nildummy_globals.net_phone,
     405                    &packet, IPC_GET_PACKET(*call));
     406                if (rc != EOK)
     407                        return rc;
     408                return nildummy_send_message(IPC_GET_DEVICE(*call), packet,
     409                    IPC_GET_SERVICE(*call));
    405410       
    406411        case NET_NIL_PACKET_SPACE:
    407                 ERROR_PROPAGATE(nildummy_packet_space_message(
    408                     IPC_GET_DEVICE(call), &addrlen, &prefix, &content,
    409                     &suffix));
    410                 IPC_SET_ADDR(answer, addrlen);
    411                 IPC_SET_PREFIX(answer, prefix);
    412                 IPC_SET_CONTENT(answer, content);
    413                 IPC_SET_SUFFIX(answer, suffix);
     412                rc = nildummy_packet_space_message(IPC_GET_DEVICE(*call),
     413                    &addrlen, &prefix, &content, &suffix);
     414                if (rc != EOK)
     415                        return rc;
     416                IPC_SET_ADDR(*answer, addrlen);
     417                IPC_SET_PREFIX(*answer, prefix);
     418                IPC_SET_CONTENT(*answer, content);
     419                IPC_SET_SUFFIX(*answer, suffix);
    414420                *answer_count = 4;
    415421                return EOK;
    416422       
    417423        case NET_NIL_ADDR:
    418                 ERROR_PROPAGATE(nildummy_addr_message(IPC_GET_DEVICE(call),
    419                     &address));
     424                rc = nildummy_addr_message(IPC_GET_DEVICE(*call), &address);
     425                if (rc != EOK)
     426                        return rc;
    420427                return measured_strings_reply(address, 1);
    421428       
    422429        case NET_NIL_BROADCAST_ADDR:
    423                 ERROR_PROPAGATE(nildummy_addr_message(IPC_GET_DEVICE(call),
    424                     &address));
     430                rc = nildummy_addr_message(IPC_GET_DEVICE(*call), &address);
     431                if (rc != EOK)
     432                        return rc;
    425433                return measured_strings_reply(address, 1);
    426434       
    427435        case IPC_M_CONNECT_TO_ME:
    428                 return nildummy_register_message(NIL_GET_PROTO(call),
    429                     IPC_GET_PHONE(call));
     436                return nildummy_register_message(NIL_GET_PROTO(*call),
     437                    IPC_GET_PHONE(*call));
    430438        }
    431439       
     
    433441}
    434442
    435 /** Default thread for new connections.
    436  *
    437  * @param[in] iid       The initial message identifier.
    438  * @param[in] icall     The initial message call structure.
    439  */
    440 static void nil_client_connection(ipc_callid_t iid, ipc_call_t *icall)
    441 {
    442         /*
    443          * Accept the connection
    444          *  - Answer the first IPC_M_CONNECT_ME_TO call.
    445          */
    446         ipc_answer_0(iid, EOK);
    447        
    448         while (true) {
    449                 ipc_call_t answer;
    450                 int answer_count;
    451                
    452                 /* Clear the answer structure */
    453                 refresh_answer(&answer, &answer_count);
    454                
    455                 /* Fetch the next message */
    456                 ipc_call_t call;
    457                 ipc_callid_t callid = async_get_call(&call);
    458                
    459                 /* Process the message */
    460                 int res = nil_module_message_standalone(NAME, callid, &call,
    461                     &answer, &answer_count);
    462                
    463                 /*
    464                  * End if told to either by the message or the processing
    465                  * result.
    466                  */
    467                 if ((IPC_GET_METHOD(call) == IPC_M_PHONE_HUNGUP) ||
    468                     (res == EHANGUP))
    469                         return;
    470                
    471                 /* Answer the message */
    472                 answer_call(callid, res, &answer, answer_count);
    473         }
    474 }
    475 
    476443int main(int argc, char *argv[])
    477444{
    478         ERROR_DECLARE;
    479        
    480445        /* Start the module */
    481         ERROR_PROPAGATE(nil_module_start_standalone(nil_client_connection));
    482         return EOK;
     446        return nil_module_start(SERVICE_NILDUMMY);
    483447}
    484448
Note: See TracChangeset for help on using the changeset viewer.