Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/net/netif/netif_local.c

    r46d4d9f r14f1db0  
    2727 */
    2828
    29 /** @addtogroup libnet
     29/** @addtogroup netif
    3030 * @{
    3131 */
     
    4242#include <ipc/ipc.h>
    4343#include <ipc/services.h>
    44 #include <ipc/netif.h>
    45 #include <errno.h>
    46 
    47 #include <generic.h>
    48 #include <net/modules.h>
    49 #include <net/packet.h>
    50 #include <packet_client.h>
     44
     45#include <net_err.h>
     46#include <net_messages.h>
     47#include <net_modules.h>
     48#include <packet/packet.h>
     49#include <packet/packet_client.h>
     50#include <packet/packet_server.h>
    5151#include <packet_remote.h>
    5252#include <adt/measured_strings.h>
    53 #include <net/device.h>
     53#include <net_device.h>
    5454#include <nil_interface.h>
    5555#include <netif_local.h>
     56#include <netif_messages.h>
    5657#include <netif_interface.h>
    5758
    5859DEVICE_MAP_IMPLEMENT(netif_device_map, netif_device_t);
    5960
    60 /** Network interface global data. */
     61/** Network interface global data.
     62 */
    6163netif_globals_t netif_globals;
    6264
     
    6466 *
    6567 * @param[in] netif_phone The network interface phone.
    66  * @param[in] device_id The device identifier.
    67  * @param[in] irq       The device interrupt number.
    68  * @param[in] io        The device input/output address.
    69  * @return              EOK on success.
    70  * @return              Other error codes as defined for the
    71  *                      netif_probe_message().
    72  */
    73 int
    74 netif_probe_req_local(int netif_phone, device_id_t device_id, int irq, int io)
     68 * @param[in] device_id   The device identifier.
     69 * @param[in] irq         The device interrupt number.
     70 * @param[in] io          The device input/output address.
     71 *
     72 * @return EOK on success.
     73 * @return Other errro codes as defined for the netif_probe_message().
     74 *
     75 */
     76int netif_probe_req_local(int netif_phone, device_id_t device_id, int irq, int io)
    7577{
    7678        fibril_rwlock_write_lock(&netif_globals.lock);
     
    8486 *
    8587 * @param[in] netif_phone The network interface phone.
    86  * @param[in] device_id The device identifier.
    87  * @param[in] packet    The packet queue.
    88  * @param[in] sender    The sending module service.
    89  * @return              EOK on success.
    90  * @return              Other error codes as defined for the generic_send_msg()
    91  *                      function.
     88 * @param[in] device_id   The device identifier.
     89 * @param[in] packet      The packet queue.
     90 * @param[in] sender      The sending module service.
     91 *
     92 * @return EOK on success.
     93 * @return Other error codes as defined for the generic_send_msg() function.
     94 *
    9295 */
    9396int netif_send_msg_local(int netif_phone, device_id_t device_id,
    94     packet_t *packet, services_t sender)
     97    packet_t packet, services_t sender)
    9598{
    9699        fibril_rwlock_write_lock(&netif_globals.lock);
     
    104107 *
    105108 * @param[in] netif_phone The network interface phone.
    106  * @param[in] device_id The device identifier.
    107  * @return              EOK on success.
    108  * @return              Other error codes as defined for the find_device()
    109  *                      function.
    110  * @return              Other error codes as defined for the
    111  *                      netif_start_message() function.
     109 * @param[in] device_id   The device identifier.
     110 *
     111 * @return EOK on success.
     112 * @return Other error codes as defined for the find_device() function.
     113 * @return Other error codes as defined for the netif_start_message() function.
     114 *
    112115 */
    113116int netif_start_req_local(int netif_phone, device_id_t device_id)
    114117{
    115         int rc;
     118        ERROR_DECLARE;
    116119       
    117120        fibril_rwlock_write_lock(&netif_globals.lock);
    118121       
    119122        netif_device_t *device;
    120         rc = find_device(device_id, &device);
    121         if (rc != EOK) {
     123        if (ERROR_OCCURRED(find_device(device_id, &device))) {
    122124                fibril_rwlock_write_unlock(&netif_globals.lock);
    123                 return rc;
     125                return ERROR_CODE;
    124126        }
    125127       
     
    140142 *
    141143 * @param[in] netif_phone The network interface phone.
    142  * @param[in] device_id The device identifier.
    143  * @return              EOK on success.
    144  * @return              Other error codes as defined for the find_device()
    145  *                      function.
    146  * @return              Other error codes as defined for the
    147  *                      netif_stop_message() function.
     144 * @param[in] device_id   The device identifier.
     145 *
     146 * @return EOK on success.
     147 * @return Other error codes as defined for the find_device() function.
     148 * @return Other error codes as defined for the netif_stop_message() function.
     149 *
    148150 */
    149151int netif_stop_req_local(int netif_phone, device_id_t device_id)
    150152{
    151         int rc;
     153        ERROR_DECLARE;
    152154       
    153155        fibril_rwlock_write_lock(&netif_globals.lock);
    154156       
    155157        netif_device_t *device;
    156         rc = find_device(device_id, &device);
    157         if (rc != EOK) {
     158        if (ERROR_OCCURRED(find_device(device_id, &device))) {
    158159                fibril_rwlock_write_unlock(&netif_globals.lock);
    159                 return rc;
     160                return ERROR_CODE;
    160161        }
    161162       
     
    175176/** Return the device usage statistics.
    176177 *
    177  * @param[in] netif_phone The network interface phone.
    178  * @param[in] device_id The device identifier.
    179  * @param[out] stats    The device usage statistics.
    180  * @return EOK on success.
     178 * @param[in]  netif_phone The network interface phone.
     179 * @param[in]  device_id   The device identifier.
     180 * @param[out] stats       The device usage statistics.
     181 *
     182 * @return EOK on success.
     183 *
    181184 */
    182185int netif_stats_req_local(int netif_phone, device_id_t device_id,
    183     device_stats_t *stats)
     186    device_stats_ref stats)
    184187{
    185188        fibril_rwlock_read_lock(&netif_globals.lock);
     
    192195/** Return the device local hardware address.
    193196 *
    194  * @param[in] netif_phone The network interface phone.
    195  * @param[in] device_id The device identifier.
    196  * @param[out] address  The device local hardware address.
    197  * @param[out] data     The address data.
    198  * @return              EOK on success.
    199  * @return              EBADMEM if the address parameter is NULL.
    200  * @return              ENOENT if there no such device.
    201  * @return              Other error codes as defined for the
    202  *                      netif_get_addr_message() function.
     197 * @param[in]  netif_phone The network interface phone.
     198 * @param[in]  device_id   The device identifier.
     199 * @param[out] address     The device local hardware address.
     200 * @param[out] data        The address data.
     201 *
     202 * @return EOK on success.
     203 * @return EBADMEM if the address parameter is NULL.
     204 * @return ENOENT if there no such device.
     205 * @return Other error codes as defined for the netif_get_addr_message()
     206 *         function.
     207 *
    203208 */
    204209int netif_get_addr_req_local(int netif_phone, device_id_t device_id,
    205     measured_string_t **address, char **data)
    206 {
    207         int rc;
    208        
    209         if (!address || !data)
     210    measured_string_ref *address, char **data)
     211{
     212        ERROR_DECLARE;
     213       
     214        if ((!address) || (!data))
    210215                return EBADMEM;
    211216       
     
    213218       
    214219        measured_string_t translation;
    215         rc = netif_get_addr_message(device_id, &translation);
    216         if (rc == EOK) {
     220        if (!ERROR_OCCURRED(netif_get_addr_message(device_id, &translation))) {
    217221                *address = measured_string_copy(&translation);
    218                 rc = (*address) ? EOK : ENOMEM;
     222                ERROR_CODE = (*address) ? EOK : ENOMEM;
    219223        }
    220224       
     
    223227        *data = (**address).value;
    224228       
    225         return rc;
     229        return ERROR_CODE;
     230}
     231
     232/** Create bidirectional connection with the network interface module and registers the message receiver.
     233 *
     234 * @param[in] service   The network interface module service.
     235 * @param[in] device_id The device identifier.
     236 * @param[in] me        The requesting module service.
     237 * @param[in] receiver  The message receiver.
     238 *
     239 * @return The phone of the needed service.
     240 * @return EOK on success.
     241 * @return Other error codes as defined for the bind_service() function.
     242 *
     243 */
     244int netif_bind_service_local(services_t service, device_id_t device_id,
     245    services_t me, async_client_conn_t receiver)
     246{
     247        return EOK;
    226248}
    227249
    228250/** Find the device specific data.
    229251 *
    230  * @param[in] device_id The device identifier.
    231  * @param[out] device   The device specific data.
    232  * @return              EOK on success.
    233  * @return              ENOENT if device is not found.
    234  * @return              EPERM if the device is not initialized.
     252 * @param[in]  device_id The device identifier.
     253 * @param[out] device    The device specific data.
     254 *
     255 * @return EOK on success.
     256 * @return ENOENT if device is not found.
     257 * @return EPERM if the device is not initialized.
     258 *
    235259 */
    236260int find_device(device_id_t device_id, netif_device_t **device)
     
    251275/** Clear the usage statistics.
    252276 *
    253  * @param[in] stats     The usage statistics.
    254  */
    255 void null_device_stats(device_stats_t *stats)
     277 * @param[in] stats The usage statistics.
     278 *
     279 */
     280void null_device_stats(device_stats_ref stats)
    256281{
    257282        bzero(stats, sizeof(device_stats_t));
     
    260285/** Initialize the netif module.
    261286 *
    262  * @param[in] client_connection The client connection functio to be registered.
    263  * @return              EOK on success.
    264  * @return              Other error codes as defined for each specific module
    265  *                      message function.
     287 *  @param[in] client_connection The client connection functio to be
     288 *                               registered.
     289 *
     290 *  @return EOK on success.
     291 *  @return Other error codes as defined for each specific module
     292 *          message function.
     293 *
    266294 */
    267295int netif_init_module(async_client_conn_t client_connection)
    268296{
    269         int rc;
     297        ERROR_DECLARE;
    270298       
    271299        async_set_client_connection(client_connection);
     
    274302        netif_device_map_initialize(&netif_globals.device_map);
    275303       
    276         rc = pm_init();
    277         if (rc != EOK)
    278                 return rc;
     304        ERROR_PROPAGATE(pm_init());
    279305       
    280306        fibril_rwlock_initialize(&netif_globals.lock);
    281        
    282         rc = netif_initialize();
    283         if (rc != EOK) {
     307        if (ERROR_OCCURRED(netif_initialize())) {
    284308                pm_destroy();
    285                 return rc;
     309                return ERROR_CODE;
    286310        }
    287311       
     
    293317 * Prepared for future optimization.
    294318 *
    295  * @param[in] packet_id The packet identifier.
     319 * @param[in] packet_id The packet identifier.
     320 *
    296321 */
    297322void netif_pq_release(packet_id_t packet_id)
     
    302327/** Allocate new packet to handle the given content size.
    303328 *
    304  * @param[in] content   The minimum content size.
    305  * @return              The allocated packet.
    306  * @return              NULL if there is an error.
    307  *
    308  */
    309 packet_t *netif_packet_get_1(size_t content)
     329 * @param[in] content The minimum content size.
     330 *
     331 * @return The allocated packet.
     332 * @return NULL if there is an error.
     333 *
     334 */
     335packet_t netif_packet_get_1(size_t content)
    310336{
    311337        return packet_get_1_remote(netif_globals.net_phone, content);
    312338}
    313339
    314 /** Register the device notification receiver, the network interface layer
    315  * module.
    316  *
    317  * @param[in] name      Module name.
    318  * @param[in] device_id The device identifier.
    319  * @param[in] phone     The network interface layer module phone.
    320  * @return              EOK on success.
    321  * @return              ENOENT if there is no such device.
    322  * @return              ELIMIT if there is another module registered.
     340/** Register the device notification receiver, the network interface layer module.
     341 *
     342 * @param[in] name      Module name.
     343 * @param[in] device_id The device identifier.
     344 * @param[in] phone     The network interface layer module phone.
     345 *
     346 * @return EOK on success.
     347 * @return ENOENT if there is no such device.
     348 * @return ELIMIT if there is another module registered.
     349 *
    323350 */
    324351static int register_message(const char *name, device_id_t device_id, int phone)
    325352{
     353        ERROR_DECLARE;
     354       
    326355        netif_device_t *device;
    327         int rc;
    328        
    329         rc = find_device(device_id, &device);
    330         if (rc != EOK)
    331                 return rc;
    332        
    333         if (device->nil_phone > 0)
     356        ERROR_PROPAGATE(find_device(device_id, &device));
     357        if(device->nil_phone > 0)
    334358                return ELIMIT;
    335359       
     
    342366/** Process the netif module messages.
    343367 *
    344  * @param[in] name      Module name.
    345  * @param[in] callid    The message identifier.
    346  * @param[in] call      The message parameters.
    347  * @param[out] answer   The message answer parameters.
    348  * @param[out] answer_count The last parameter for the actual answer in the
    349  *                      answer parameter.
    350  * @return              EOK on success.
    351  * @return              ENOTSUP if the message is not known.
    352  * @return              Other error codes as defined for each specific module
    353  *                      message function.
     368 * @param[in]  name         Module name.
     369 * @param[in]  callid       The message identifier.
     370 * @param[in]  call         The message parameters.
     371 * @param[out] answer       The message answer parameters.
     372 * @param[out] answer_count The last parameter for the actual answer
     373 *                          in the answer parameter.
     374 *
     375 * @return EOK on success.
     376 * @return ENOTSUP if the message is not known.
     377 * @return Other error codes as defined for each specific module message function.
    354378 *
    355379 * @see IS_NET_NETIF_MESSAGE()
     
    359383    ipc_call_t *call, ipc_call_t *answer, int *answer_count)
    360384{
     385        ERROR_DECLARE;
     386       
    361387        size_t length;
    362388        device_stats_t stats;
    363         packet_t *packet;
     389        packet_t packet;
    364390        measured_string_t address;
    365         int rc;
    366391       
    367392        *answer_count = 0;
    368393        switch (IPC_GET_METHOD(*call)) {
    369         case IPC_M_PHONE_HUNGUP:
    370                 return EOK;
    371        
    372         case NET_NETIF_PROBE:
    373                 return netif_probe_req_local(0, IPC_GET_DEVICE(call),
    374                     NETIF_GET_IRQ(call), NETIF_GET_IO(call));
    375                    
    376         case IPC_M_CONNECT_TO_ME:
    377                 fibril_rwlock_write_lock(&netif_globals.lock);
    378                 rc = register_message(name, IPC_GET_DEVICE(call),
    379                     IPC_GET_PHONE(call));
    380                 fibril_rwlock_write_unlock(&netif_globals.lock);
    381                 return rc;
    382                
    383         case NET_NETIF_SEND:
    384                 rc = packet_translate_remote(netif_globals.net_phone, &packet,
    385                     IPC_GET_PACKET(call));
    386                 if (rc != EOK)
    387                         return rc;
    388                 return netif_send_msg_local(0, IPC_GET_DEVICE(call), packet,
    389                     IPC_GET_SENDER(call));
    390                
    391         case NET_NETIF_START:
    392                 return netif_start_req_local(0, IPC_GET_DEVICE(call));
    393                
    394         case NET_NETIF_STATS:
    395                 fibril_rwlock_read_lock(&netif_globals.lock);
    396 
    397                 rc = async_data_read_receive(&callid, &length);
    398                 if (rc != EOK) {
     394                case IPC_M_PHONE_HUNGUP:
     395                        return EOK;
     396                case NET_NETIF_PROBE:
     397                        return netif_probe_req_local(0, IPC_GET_DEVICE(call),
     398                            NETIF_GET_IRQ(call), NETIF_GET_IO(call));
     399                case IPC_M_CONNECT_TO_ME:
     400                        fibril_rwlock_write_lock(&netif_globals.lock);
     401                        ERROR_CODE = register_message(name, IPC_GET_DEVICE(call),
     402                            IPC_GET_PHONE(call));
     403                        fibril_rwlock_write_unlock(&netif_globals.lock);
     404                        return ERROR_CODE;
     405                case NET_NETIF_SEND:
     406                        ERROR_PROPAGATE(packet_translate_remote(netif_globals.net_phone,
     407                            &packet, IPC_GET_PACKET(call)));
     408                        return netif_send_msg_local(0, IPC_GET_DEVICE(call), packet,
     409                            IPC_GET_SENDER(call));
     410                case NET_NETIF_START:
     411                        return netif_start_req_local(0, IPC_GET_DEVICE(call));
     412                case NET_NETIF_STATS:
     413                        fibril_rwlock_read_lock(&netif_globals.lock);
     414                        if (!ERROR_OCCURRED(async_data_read_receive(&callid, &length))) {
     415                                if (length < sizeof(device_stats_t))
     416                                        ERROR_CODE = EOVERFLOW;
     417                                else {
     418                                        if (!ERROR_OCCURRED(netif_get_device_stats(
     419                                            IPC_GET_DEVICE(call), &stats)))
     420                                                ERROR_CODE = async_data_read_finalize(callid, &stats,
     421                                                    sizeof(device_stats_t));
     422                                }
     423                        }
    399424                        fibril_rwlock_read_unlock(&netif_globals.lock);
    400                         return rc;
    401                 }
    402                 if (length < sizeof(device_stats_t)) {
     425                        return ERROR_CODE;
     426                case NET_NETIF_STOP:
     427                        return netif_stop_req_local(0, IPC_GET_DEVICE(call));
     428                case NET_NETIF_GET_ADDR:
     429                        fibril_rwlock_read_lock(&netif_globals.lock);
     430                        if (!ERROR_OCCURRED(netif_get_addr_message(IPC_GET_DEVICE(call),
     431                            &address)))
     432                                ERROR_CODE = measured_strings_reply(&address, 1);
    403433                        fibril_rwlock_read_unlock(&netif_globals.lock);
    404                         return EOVERFLOW;
    405                 }
    406 
    407                 rc = netif_get_device_stats(IPC_GET_DEVICE(call), &stats);
    408                 if (rc == EOK) {
    409                         rc = async_data_read_finalize(callid, &stats,
    410                             sizeof(device_stats_t));
    411                 }
    412 
    413                 fibril_rwlock_read_unlock(&netif_globals.lock);
    414                 return rc;
    415 
    416         case NET_NETIF_STOP:
    417                 return netif_stop_req_local(0, IPC_GET_DEVICE(call));
    418                
    419         case NET_NETIF_GET_ADDR:
    420                 fibril_rwlock_read_lock(&netif_globals.lock);
    421                 rc = netif_get_addr_message(IPC_GET_DEVICE(call), &address);
    422                 if (rc == EOK)
    423                         rc = measured_strings_reply(&address, 1);
    424                 fibril_rwlock_read_unlock(&netif_globals.lock);
    425                 return rc;
     434                        return ERROR_CODE;
    426435        }
    427436       
     
    431440/** Start the network interface module.
    432441 *
    433  * Initialize the client connection serving function, initialize the module,
    434  * registers the module service and start the async manager, processing IPC
    435  * messages in an infinite loop.
    436  *
    437  * @param[in] client_connection The client connection processing function.
    438  *                      The module skeleton propagates its own one.
    439  * @return              EOK on success.
    440  * @return              Other error codes as defined for each specific module
    441  *                      message function.
     442 * Initialize the client connection serving function, initialize
     443 * the module, registers the module service and start the async
     444 * manager, processing IPC messages in an infinite loop.
     445 *
     446 * @param[in] client_connection The client connection processing
     447 *                              function. The module skeleton propagates
     448 *                              its own one.
     449 *
     450 * @return EOK on success.
     451 * @return Other error codes as defined for each specific module message
     452 *         function.
     453 *
    442454 */
    443455int netif_module_start_standalone(async_client_conn_t client_connection)
    444456{
    445         int rc;
    446        
    447         rc = netif_init_module(client_connection);
    448         if (rc != EOK)
    449                 return rc;
     457        ERROR_DECLARE;
     458       
     459        ERROR_PROPAGATE(netif_init_module(client_connection));
    450460       
    451461        async_manager();
Note: See TracChangeset for help on using the changeset viewer.