Ignore:
File:
1 edited

Legend:

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

    r28a3e74 r0a3fbc7  
    4242#include <byteorder.h>
    4343#include <str.h>
    44 #include <errno.h>
    45 #include <ipc/nil.h>
     44#include <err.h>
     45
     46#include <ipc/ipc.h>
    4647#include <ipc/net.h>
    4748#include <ipc/services.h>
     49
    4850#include <net/modules.h>
    4951#include <net_checksum.h>
     
    5254#include <protocol_map.h>
    5355#include <net/device.h>
    54 #include <netif_remote.h>
     56#include <netif_interface.h>
    5557#include <net_interface.h>
    56 #include <il_remote.h>
     58#include <nil_interface.h>
     59#include <il_interface.h>
    5760#include <adt/measured_strings.h>
    5861#include <packet_client.h>
    5962#include <packet_remote.h>
    60 #include <nil_skel.h>
     63#include <nil_local.h>
    6164
    6265#include "eth.h"
     66#include "eth_header.h"
    6367
    6468/** The module name. */
     
    6872#define ETH_PREFIX \
    6973        (sizeof(eth_header_t) + sizeof(eth_header_lsap_t) + \
    70             sizeof(eth_header_snap_t))
     74        sizeof(eth_header_snap_t))
    7175
    7276/** Reserved packet suffix length. */
    73 #define ETH_SUFFIX  (sizeof(eth_fcs_t))
     77#define ETH_SUFFIX \
     78        sizeof(eth_fcs_t)
    7479
    7580/** Maximum packet content length. */
    76 #define ETH_MAX_CONTENT  1500u
     81#define ETH_MAX_CONTENT 1500u
    7782
    7883/** Minimum packet content length. */
    79 #define ETH_MIN_CONTENT  46u
     84#define ETH_MIN_CONTENT 46u
    8085
    8186/** Maximum tagged packet content length. */
    8287#define ETH_MAX_TAGGED_CONTENT(flags) \
    8388        (ETH_MAX_CONTENT - \
    84             ((IS_8023_2_LSAP(flags) || IS_8023_2_SNAP(flags)) ? \
    85             sizeof(eth_header_lsap_t) : 0) - \
    86             (IS_8023_2_SNAP(flags) ? sizeof(eth_header_snap_t) : 0))
     89        ((IS_8023_2_LSAP(flags) || IS_8023_2_SNAP(flags)) ? \
     90        sizeof(eth_header_lsap_t) : 0) - \
     91        (IS_8023_2_SNAP(flags) ? sizeof(eth_header_snap_t) : 0))
    8792
    8893/** Minimum tagged packet content length. */
    8994#define ETH_MIN_TAGGED_CONTENT(flags) \
    9095        (ETH_MIN_CONTENT - \
    91             ((IS_8023_2_LSAP(flags) || IS_8023_2_SNAP(flags)) ? \
    92             sizeof(eth_header_lsap_t) : 0) - \
    93             (IS_8023_2_SNAP(flags) ? sizeof(eth_header_snap_t) : 0))
     96        ((IS_8023_2_LSAP(flags) || IS_8023_2_SNAP(flags)) ? \
     97        sizeof(eth_header_lsap_t) : 0) - \
     98        (IS_8023_2_SNAP(flags) ? sizeof(eth_header_snap_t) : 0))
    9499
    95100/** Dummy flag shift value. */
    96 #define ETH_DUMMY_SHIFT  0
     101#define ETH_DUMMY_SHIFT 0
    97102
    98103/** Mode flag shift value. */
    99 #define ETH_MODE_SHIFT  1
     104#define ETH_MODE_SHIFT  1
    100105
    101106/** Dummy device flag.
    102107 * Preamble and FCS are mandatory part of the packets.
    103108 */
    104 #define ETH_DUMMY  (1 << ETH_DUMMY_SHIFT)
     109#define ETH_DUMMY               (1 << ETH_DUMMY_SHIFT)
    105110
    106111/** Returns the dummy flag.
    107112 * @see ETH_DUMMY
    108113 */
    109 #define IS_DUMMY(flags)  ((flags) & ETH_DUMMY)
     114#define IS_DUMMY(flags)         ((flags) & ETH_DUMMY)
    110115
    111116/** Device mode flags.
     
    114119 * @see ETH_8023_2_SNAP
    115120 */
    116 #define ETH_MODE_MASK  (3 << ETH_MODE_SHIFT)
     121#define ETH_MODE_MASK           (3 << ETH_MODE_SHIFT)
    117122
    118123/** DIX Ethernet mode flag. */
    119 #define ETH_DIX  (1 << ETH_MODE_SHIFT)
    120 
    121 /** Return whether the DIX Ethernet mode flag is set.
    122  *
    123  * @param[in] flags Ethernet flags.
     124#define ETH_DIX                 (1 << ETH_MODE_SHIFT)
     125
     126/** Returns whether the DIX Ethernet mode flag is set.
     127 *
     128 * @param[in] flags     The ethernet flags.
    124129 * @see ETH_DIX
    125  *
    126  */
    127 #define IS_DIX(flags)  (((flags) & ETH_MODE_MASK) == ETH_DIX)
     130 */
     131#define IS_DIX(flags)           (((flags) & ETH_MODE_MASK) == ETH_DIX)
    128132
    129133/** 802.3 + 802.2 + LSAP mode flag. */
    130 #define ETH_8023_2_LSAP  (2 << ETH_MODE_SHIFT)
    131 
    132 /** Return whether the 802.3 + 802.2 + LSAP mode flag is set.
    133  *
    134  * @param[in] flags Ethernet flags.
     134#define ETH_8023_2_LSAP         (2 << ETH_MODE_SHIFT)
     135
     136/** Returns whether the 802.3 + 802.2 + LSAP mode flag is set.
     137 *
     138 * @param[in] flags     The ethernet flags.
    135139 * @see ETH_8023_2_LSAP
    136  *
    137  */
    138 #define IS_8023_2_LSAP(flags)  (((flags) & ETH_MODE_MASK) == ETH_8023_2_LSAP)
     140 */
     141#define IS_8023_2_LSAP(flags)   (((flags) & ETH_MODE_MASK) == ETH_8023_2_LSAP)
    139142
    140143/** 802.3 + 802.2 + LSAP + SNAP mode flag. */
    141 #define ETH_8023_2_SNAP  (3 << ETH_MODE_SHIFT)
    142 
    143 /** Return whether the 802.3 + 802.2 + LSAP + SNAP mode flag is set.
    144  *
    145  * @param[in] flags Ethernet flags.
     144#define ETH_8023_2_SNAP         (3 << ETH_MODE_SHIFT)
     145
     146/** Returns whether the 802.3 + 802.2 + LSAP + SNAP mode flag is set.
     147 *
     148 * @param[in] flags     The ethernet flags.
    146149 * @see ETH_8023_2_SNAP
    147  *
    148  */
    149 #define IS_8023_2_SNAP(flags)  (((flags) & ETH_MODE_MASK) == ETH_8023_2_SNAP)
     150 */
     151#define IS_8023_2_SNAP(flags)   (((flags) & ETH_MODE_MASK) == ETH_8023_2_SNAP)
    150152
    151153/** Type definition of the ethernet address type.
     
    153155 */
    154156typedef enum eth_addr_type eth_addr_type_t;
     157
     158/** Type definition of the ethernet address type pointer.
     159 * @see eth_addr_type
     160 */
     161typedef eth_addr_type_t *eth_addr_type_ref;
    155162
    156163/** Ethernet address type. */
     
    171178{
    172179        int index;
    173         eth_proto_t *proto;
     180        eth_proto_ref proto;
    174181
    175182        fibril_rwlock_read_lock(&eth_globals.protos_lock);
     
    189196int nil_initialize(int net_phone)
    190197{
    191         int rc;
     198        ERROR_DECLARE;
    192199
    193200        fibril_rwlock_initialize(&eth_globals.devices_lock);
     
    197204        fibril_rwlock_write_lock(&eth_globals.protos_lock);
    198205        eth_globals.net_phone = net_phone;
    199 
    200206        eth_globals.broadcast_addr =
    201             measured_string_create_bulk((uint8_t *) "\xFF\xFF\xFF\xFF\xFF\xFF", ETH_ADDR);
     207            measured_string_create_bulk("\xFF\xFF\xFF\xFF\xFF\xFF",
     208            CONVERT_SIZE(uint8_t, char, ETH_ADDR));
    202209        if (!eth_globals.broadcast_addr) {
    203                 rc = ENOMEM;
     210                ERROR_CODE = ENOMEM;
    204211                goto out;
    205212        }
    206 
    207         rc = eth_devices_initialize(&eth_globals.devices);
    208         if (rc != EOK) {
     213        if (ERROR_OCCURRED(eth_devices_initialize(&eth_globals.devices))) {
    209214                free(eth_globals.broadcast_addr);
    210215                goto out;
    211216        }
    212 
    213         rc = eth_protos_initialize(&eth_globals.protos);
    214         if (rc != EOK) {
     217        if (ERROR_OCCURRED(eth_protos_initialize(&eth_globals.protos))) {
    215218                free(eth_globals.broadcast_addr);
    216                 eth_devices_destroy(&eth_globals.devices, free);
     219                eth_devices_destroy(&eth_globals.devices);
    217220        }
    218221out:
     
    220223        fibril_rwlock_write_unlock(&eth_globals.devices_lock);
    221224       
    222         return rc;
     225        return ERROR_CODE;
    223226}
    224227
     
    231234static void eth_receiver(ipc_callid_t iid, ipc_call_t *icall)
    232235{
    233         packet_t *packet;
    234         int rc;
     236        ERROR_DECLARE;
     237
     238        packet_t packet;
    235239
    236240        while (true) {
    237                 switch (IPC_GET_IMETHOD(*icall)) {
     241                switch (IPC_GET_METHOD(*icall)) {
    238242                case NET_NIL_DEVICE_STATE:
    239                         nil_device_state_msg_local(0, IPC_GET_DEVICE(*icall),
    240                             IPC_GET_STATE(*icall));
    241                         async_answer_0(iid, EOK);
     243                        nil_device_state_msg_local(0, IPC_GET_DEVICE(icall),
     244                            IPC_GET_STATE(icall));
     245                        ipc_answer_0(iid, EOK);
    242246                        break;
    243247                case NET_NIL_RECEIVED:
    244                         rc = packet_translate_remote(eth_globals.net_phone,
    245                             &packet, IPC_GET_PACKET(*icall));
    246                         if (rc == EOK)
    247                                 rc = nil_received_msg_local(0,
    248                                     IPC_GET_DEVICE(*icall), packet, 0);
    249                        
    250                         async_answer_0(iid, (sysarg_t) rc);
     248                        if (ERROR_NONE(packet_translate_remote(
     249                            eth_globals.net_phone, &packet,
     250                            IPC_GET_PACKET(icall)))) {
     251                                ERROR_CODE = nil_received_msg_local(0,
     252                                    IPC_GET_DEVICE(icall), packet, 0);
     253                        }
     254                        ipc_answer_0(iid, (ipcarg_t) ERROR_CODE);
    251255                        break;
    252256                default:
    253                         async_answer_0(iid, (sysarg_t) ENOTSUP);
     257                        ipc_answer_0(iid, (ipcarg_t) ENOTSUP);
    254258                }
    255259               
     
    265269 * @param[in] service   The device driver service.
    266270 * @param[in] mtu       The device maximum transmission unit.
    267  * @return              EOK on success.
    268  * @return              EEXIST if the device with the different service exists.
    269  * @return              ENOMEM if there is not enough memory left.
    270  * @return              Other error codes as defined for the
     271 * @returns             EOK on success.
     272 * @returns             EEXIST if the device with the different service exists.
     273 * @returns             ENOMEM if there is not enough memory left.
     274 * @returns             Other error codes as defined for the
    271275 *                      net_get_device_conf_req() function.
    272  * @return              Other error codes as defined for the
     276 * @returns             Other error codes as defined for the
    273277 *                      netif_bind_service() function.
    274  * @return              Other error codes as defined for the
     278 * @returns             Other error codes as defined for the
    275279 *                      netif_get_addr_req() function.
    276280 */
    277 static int eth_device_message(device_id_t device_id, services_t service,
    278     size_t mtu)
    279 {
    280         eth_device_t *device;
     281static int
     282eth_device_message(device_id_t device_id, services_t service, size_t mtu)
     283{
     284        ERROR_DECLARE;
     285
     286        eth_device_ref device;
    281287        int index;
    282288        measured_string_t names[2] = {
    283289                {
    284                         (uint8_t *) "ETH_MODE",
     290                        (char *) "ETH_MODE",
    285291                        8
    286292                },
    287293                {
    288                         (uint8_t *) "ETH_DUMMY",
     294                        (char *) "ETH_DUMMY",
    289295                        9
    290296                }
    291297        };
    292         measured_string_t *configuration;
     298        measured_string_ref configuration;
    293299        size_t count = sizeof(names) / sizeof(measured_string_t);
    294         uint8_t *data;
    295         eth_proto_t *proto;
    296         int rc;
     300        char *data;
     301        eth_proto_ref proto;
    297302
    298303        fibril_rwlock_write_lock(&eth_globals.devices_lock);
    299         /* An existing device? */
     304        // an existing device?
    300305        device = eth_devices_find(&eth_globals.devices, device_id);
    301306        if (device) {
     
    306311                }
    307312               
    308                 /* Update mtu */
     313                // update mtu
    309314                if ((mtu > 0) && (mtu <= ETH_MAX_TAGGED_CONTENT(device->flags)))
    310315                        device->mtu = mtu;
     
    312317                        device->mtu = ETH_MAX_TAGGED_CONTENT(device->flags);
    313318               
    314                 printf("Device %d already exists:\tMTU\t= %zu\n",
     319                printf("Device %d already exists:\tMTU\t= %d\n",
    315320                    device->device_id, device->mtu);
    316321                fibril_rwlock_write_unlock(&eth_globals.devices_lock);
    317322               
    318                 /* Notify all upper layer modules */
     323                // notify all upper layer modules
    319324                fibril_rwlock_read_lock(&eth_globals.protos_lock);
    320325                for (index = 0; index < eth_protos_count(&eth_globals.protos);
     
    328333                        }
    329334                }
    330 
    331335                fibril_rwlock_read_unlock(&eth_globals.protos_lock);
    332336                return EOK;
    333337        }
    334338       
    335         /* Create a new device */
    336         device = (eth_device_t *) malloc(sizeof(eth_device_t));
     339        // create a new device
     340        device = (eth_device_ref) malloc(sizeof(eth_device_t));
    337341        if (!device)
    338342                return ENOMEM;
     
    347351
    348352        configuration = &names[0];
    349         rc = net_get_device_conf_req(eth_globals.net_phone, device->device_id,
    350             &configuration, count, &data);
    351         if (rc != EOK) {
     353        if (ERROR_OCCURRED(net_get_device_conf_req(eth_globals.net_phone,
     354            device->device_id, &configuration, count, &data))) {
    352355                fibril_rwlock_write_unlock(&eth_globals.devices_lock);
    353356                free(device);
    354                 return rc;
    355         }
    356 
     357                return ERROR_CODE;
     358        }
    357359        if (configuration) {
    358                 if (!str_lcmp((char *) configuration[0].value, "DIX",
     360                if (!str_lcmp(configuration[0].value, "DIX",
    359361                    configuration[0].length)) {
    360362                        device->flags |= ETH_DIX;
    361                 } else if(!str_lcmp((char *) configuration[0].value, "8023_2_LSAP",
     363                } else if(!str_lcmp(configuration[0].value, "8023_2_LSAP",
    362364                    configuration[0].length)) {
    363365                        device->flags |= ETH_8023_2_LSAP;
     
    375377        }
    376378       
    377         /* Bind the device driver */
     379        // bind the device driver
    378380        device->phone = netif_bind_service(device->service, device->device_id,
    379381            SERVICE_ETHERNET, eth_receiver);
     
    384386        }
    385387       
    386         /* Get hardware address */
    387         rc = netif_get_addr_req(device->phone, device->device_id, &device->addr,
    388             &device->addr_data);
    389         if (rc != EOK) {
     388        // get hardware address
     389        if (ERROR_OCCURRED(netif_get_addr_req(device->phone, device->device_id,
     390            &device->addr, &device->addr_data))) {
    390391                fibril_rwlock_write_unlock(&eth_globals.devices_lock);
    391392                free(device);
    392                 return rc;
    393         }
    394        
    395         /* Add to the cache */
     393                return ERROR_CODE;
     394        }
     395       
     396        // add to the cache
    396397        index = eth_devices_add(&eth_globals.devices, device->device_id,
    397398            device);
     
    404405        }
    405406       
    406         printf("%s: Device registered (id: %d, service: %d: mtu: %zu, "
    407             "mac: %02x:%02x:%02x:%02x:%02x:%02x, flags: 0x%x)\n",
     407        printf("%s: Device registered (id: %d, service: %d: mtu: %d, "
     408            "mac: %x:%x:%x:%x:%x:%x, flags: 0x%x)\n",
    408409            NAME, device->device_id, device->service, device->mtu,
    409410            device->addr_data[0], device->addr_data[1],
     
    419420 * @param[in] flags     The device flags.
    420421 * @param[in] packet    The packet.
    421  * @return              The target registered module.
    422  * @return              NULL if the packet is not long enough.
    423  * @return              NULL if the packet is too long.
    424  * @return              NULL if the raw ethernet protocol is used.
    425  * @return              NULL if the dummy device FCS checksum is invalid.
    426  * @return              NULL if the packet address length is not big enough.
    427  */
    428 static eth_proto_t *eth_process_packet(int flags, packet_t *packet)
    429 {
    430         eth_header_snap_t *header;
     422 * @returns             The target registered module.
     423 * @returns             NULL if the packet is not long enough.
     424 * @returns             NULL if the packet is too long.
     425 * @returns             NULL if the raw ethernet protocol is used.
     426 * @returns             NULL if the dummy device FCS checksum is invalid.
     427 * @returns             NULL if the packet address length is not big enough.
     428 */
     429static eth_proto_ref eth_process_packet(int flags, packet_t packet)
     430{
     431        ERROR_DECLARE;
     432
     433        eth_header_snap_ref header;
    431434        size_t length;
    432435        eth_type_t type;
    433436        size_t prefix;
    434437        size_t suffix;
    435         eth_fcs_t *fcs;
    436         uint8_t *data;
    437         int rc;
     438        eth_fcs_ref fcs;
     439        uint8_t * data;
    438440
    439441        length = packet_get_data_length(packet);
     
    446448       
    447449        data = packet_get_data(packet);
    448         header = (eth_header_snap_t *) data;
     450        header = (eth_header_snap_ref) data;
    449451        type = ntohs(header->header.ethertype);
    450452       
    451453        if (type >= ETH_MIN_PROTO) {
    452                 /* DIX Ethernet */
     454                // DIX Ethernet
    453455                prefix = sizeof(eth_header_t);
    454456                suffix = 0;
    455                 fcs = (eth_fcs_t *) data + length - sizeof(eth_fcs_t);
     457                fcs = (eth_fcs_ref) data + length - sizeof(eth_fcs_t);
    456458                length -= sizeof(eth_fcs_t);
    457459        } else if(type <= ETH_MAX_CONTENT) {
    458                 /* Translate "LSAP" values */
     460                // translate "LSAP" values
    459461                if ((header->lsap.dsap == ETH_LSAP_GLSAP) &&
    460462                    (header->lsap.ssap == ETH_LSAP_GLSAP)) {
    461                         /* Raw packet -- discard */
     463                        // raw packet
     464                        // discard
    462465                        return NULL;
    463466                } else if((header->lsap.dsap == ETH_LSAP_SNAP) &&
    464467                    (header->lsap.ssap == ETH_LSAP_SNAP)) {
    465                         /*
    466                          * IEEE 802.3 + 802.2 + LSAP + SNAP
    467                          * organization code not supported
    468                          */
     468                        // IEEE 802.3 + 802.2 + LSAP + SNAP
     469                        // organization code not supported
    469470                        type = ntohs(header->snap.ethertype);
    470471                        prefix = sizeof(eth_header_t) +
     
    472473                            sizeof(eth_header_snap_t);
    473474                } else {
    474                         /* IEEE 802.3 + 802.2 LSAP */
     475                        // IEEE 802.3 + 802.2 LSAP
    475476                        type = lsap_map(header->lsap.dsap);
    476477                        prefix = sizeof(eth_header_t) +
    477478                            sizeof(eth_header_lsap_t);
    478479                }
    479 
    480480                suffix = (type < ETH_MIN_CONTENT) ? ETH_MIN_CONTENT - type : 0U;
    481                 fcs = (eth_fcs_t *) data + prefix + type + suffix;
     481                fcs = (eth_fcs_ref) data + prefix + type + suffix;
    482482                suffix += length - prefix - type;
    483483                length = prefix + type + suffix;
    484484        } else {
    485                 /* Invalid length/type, should not occur */
     485                // invalid length/type, should not occurr
    486486                return NULL;
    487487        }
    488488       
    489489        if (IS_DUMMY(flags)) {
    490                 if (~compute_crc32(~0U, data, length * 8) != ntohl(*fcs))
     490                if ((~compute_crc32(~0U, data, length * 8)) != ntohl(*fcs))
    491491                        return NULL;
    492492                suffix += sizeof(eth_fcs_t);
    493493        }
    494494       
    495         rc = packet_set_addr(packet, header->header.source_address,
    496             header->header.destination_address, ETH_ADDR);
    497         if (rc != EOK)
     495        if (ERROR_OCCURRED(packet_set_addr(packet,
     496            header->header.source_address, header->header.destination_address,
     497            ETH_ADDR)) || ERROR_OCCURRED(packet_trim(packet, prefix, suffix))) {
    498498                return NULL;
    499 
    500         rc = packet_trim(packet, prefix, suffix);
    501         if (rc != EOK)
    502                 return NULL;
     499        }
    503500       
    504501        return eth_protos_find(&eth_globals.protos, type);
    505502}
    506503
    507 int nil_received_msg_local(int nil_phone, device_id_t device_id,
    508     packet_t *packet, services_t target)
    509 {
    510         eth_proto_t *proto;
    511         packet_t *next;
    512         eth_device_t *device;
     504int
     505nil_received_msg_local(int nil_phone, device_id_t device_id, packet_t packet,
     506    services_t target)
     507{
     508        eth_proto_ref proto;
     509        packet_t next;
     510        eth_device_ref device;
    513511        int flags;
    514512
     
    519517                return ENOENT;
    520518        }
    521 
    522519        flags = device->flags;
    523520        fibril_rwlock_read_unlock(&eth_globals.devices_lock);
     
    531528                            proto->service);
    532529                } else {
    533                         /* Drop invalid/unknown */
     530                        // drop invalid/unknown
    534531                        pq_release_remote(eth_globals.net_phone,
    535532                            packet_get_id(packet));
     
    537534                packet = next;
    538535        } while(packet);
    539 
    540536        fibril_rwlock_read_unlock(&eth_globals.protos_lock);
     537       
    541538        return EOK;
    542539}
     
    549546 * @param[out] content  The maximum content size.
    550547 * @param[out] suffix   The minimum reserved suffix size.
    551  * @return              EOK on success.
    552  * @return              EBADMEM if either one of the parameters is NULL.
    553  * @return              ENOENT if there is no such device.
    554  */
    555 static int eth_packet_space_message(device_id_t device_id, size_t *addr_len,
     548 * @returns             EOK on success.
     549 * @returns             EBADMEM if either one of the parameters is NULL.
     550 * @returns             ENOENT if there is no such device.
     551 */
     552static int
     553eth_packet_space_message(device_id_t device_id, size_t *addr_len,
    556554    size_t *prefix, size_t *content, size_t *suffix)
    557555{
    558         eth_device_t *device;
     556        eth_device_ref device;
    559557
    560558        if (!addr_len || !prefix || !content || !suffix)
     
    567565                return ENOENT;
    568566        }
    569 
    570567        *content = device->mtu;
    571568        fibril_rwlock_read_unlock(&eth_globals.devices_lock);
     
    574571        *prefix = ETH_PREFIX;
    575572        *suffix = ETH_MIN_CONTENT + ETH_SUFFIX;
    576 
    577573        return EOK;
    578574}
     
    583579 * @param[in] type      Type of the desired address.
    584580 * @param[out] address  The device hardware address.
    585  * @return              EOK on success.
    586  * @return              EBADMEM if the address parameter is NULL.
    587  * @return              ENOENT if there no such device.
    588  */
    589 static int eth_addr_message(device_id_t device_id, eth_addr_type_t type,
    590     measured_string_t **address)
    591 {
    592         eth_device_t *device;
     581 * @returns             EOK on success.
     582 * @returns             EBADMEM if the address parameter is NULL.
     583 * @returns             ENOENT if there no such device.
     584 */
     585static int
     586eth_addr_message(device_id_t device_id, eth_addr_type_t type,
     587    measured_string_ref *address)
     588{
     589        eth_device_ref device;
    593590
    594591        if (!address)
     
    617614 * @param[in] service   The module service.
    618615 * @param[in] phone     The service phone.
    619  * @return              EOK on success.
    620  * @return              ENOENT if the service is not known.
    621  * @return              ENOMEM if there is not enough memory left.
     616 * @returns             EOK on success.
     617 * @returns             ENOENT if the service is not known.
     618 * @returns             ENOMEM if there is not enough memory left.
    622619 */
    623620static int eth_register_message(services_t service, int phone)
    624621{
    625         eth_proto_t *proto;
     622        eth_proto_ref proto;
    626623        int protocol;
    627624        int index;
     
    638635                return EOK;
    639636        } else {
    640                 proto = (eth_proto_t *) malloc(sizeof(eth_proto_t));
     637                proto = (eth_proto_ref) malloc(sizeof(eth_proto_t));
    641638                if (!proto) {
    642639                        fibril_rwlock_write_unlock(&eth_globals.protos_lock);
    643640                        return ENOMEM;
    644641                }
    645 
    646642                proto->service = service;
    647643                proto->protocol = protocol;
    648644                proto->phone = phone;
    649 
    650645                index = eth_protos_add(&eth_globals.protos, protocol, proto);
    651646                if (index < 0) {
     
    670665 * @param[in] ethertype The ethernet protocol type.
    671666 * @param[in] mtu       The device maximum transmission unit.
    672  * @return              EOK on success.
    673  * @return              EINVAL if the packet addresses length is not long
     667 * @returns             EOK on success.
     668 * @returns             EINVAL if the packet addresses length is not long
    674669 *                      enough.
    675  * @return              EINVAL if the packet is bigger than the device MTU.
    676  * @return              ENOMEM if there is not enough memory in the packet.
     670 * @returns             EINVAL if the packet is bigger than the device MTU.
     671 * @returns             ENOMEM if there is not enough memory in the packet.
    677672 */
    678673static int
    679 eth_prepare_packet(int flags, packet_t *packet, uint8_t *src_addr, int ethertype,
     674eth_prepare_packet(int flags, packet_t packet, uint8_t *src_addr, int ethertype,
    680675    size_t mtu)
    681676{
    682         eth_header_snap_t *header;
    683         eth_header_lsap_t *header_lsap;
    684         eth_header_t *header_dix;
    685         eth_fcs_t *fcs;
     677        eth_header_snap_ref header;
     678        eth_header_lsap_ref header_lsap;
     679        eth_header_ref header_dix;
     680        eth_fcs_ref fcs;
    686681        uint8_t *src;
    687682        uint8_t *dest;
     
    689684        int i;
    690685        void *padding;
    691         eth_preamble_t *preamble;
     686        eth_preamble_ref preamble;
    692687
    693688        i = packet_get_addr(packet, &src, &dest);
     
    706701                if (!padding)
    707702                        return ENOMEM;
    708 
    709703                bzero(padding, ETH_MIN_TAGGED_CONTENT(flags) - length);
    710704        }
     
    780774 * @param[in] packet    The packet queue.
    781775 * @param[in] sender    The sending module service.
    782  * @return              EOK on success.
    783  * @return              ENOENT if there no such device.
    784  * @return              EINVAL if the service parameter is not known.
    785  */
    786 static int eth_send_message(device_id_t device_id, packet_t *packet,
    787     services_t sender)
    788 {
    789         eth_device_t *device;
    790         packet_t *next;
    791         packet_t *tmp;
     776 * @returns             EOK on success.
     777 * @returns             ENOENT if there no such device.
     778 * @returns             EINVAL if the service parameter is not known.
     779 */
     780static int
     781eth_send_message(device_id_t device_id, packet_t packet, services_t sender)
     782{
     783        ERROR_DECLARE;
     784
     785        eth_device_ref device;
     786        packet_t next;
     787        packet_t tmp;
    792788        int ethertype;
    793         int rc;
    794789
    795790        ethertype = htons(protocol_map(SERVICE_ETHERNET, sender));
     
    806801        }
    807802       
    808         /* Process packet queue */
     803        // process packet queue
    809804        next = packet;
    810805        do {
    811                 rc = eth_prepare_packet(device->flags, next,
    812                     (uint8_t *) device->addr->value, ethertype, device->mtu);
    813                 if (rc != EOK) {
    814                         /* Release invalid packet */
     806                if (ERROR_OCCURRED(eth_prepare_packet(device->flags, next,
     807                    (uint8_t *) device->addr->value, ethertype, device->mtu))) {
     808                        // release invalid packet
    815809                        tmp = pq_detach(next);
    816810                        if (next == packet)
     
    824818        } while(next);
    825819       
    826         /* Send packet queue */
     820        // send packet queue
    827821        if (packet) {
    828822                netif_send_msg(device->phone, device_id, packet,
    829823                    SERVICE_ETHERNET);
    830824        }
    831 
    832825        fibril_rwlock_read_unlock(&eth_globals.devices_lock);
     826       
    833827        return EOK;
    834828}
    835829
    836 int nil_module_message(ipc_callid_t callid, ipc_call_t *call,
    837     ipc_call_t *answer, size_t *answer_count)
    838 {
    839         measured_string_t *address;
    840         packet_t *packet;
     830int
     831nil_message_standalone(const char *name, ipc_callid_t callid, ipc_call_t *call,
     832    ipc_call_t *answer, int *answer_count)
     833{
     834        ERROR_DECLARE;
     835       
     836        measured_string_ref address;
     837        packet_t packet;
    841838        size_t addrlen;
    842839        size_t prefix;
    843840        size_t suffix;
    844841        size_t content;
    845         int rc;
    846842       
    847843        *answer_count = 0;
    848         switch (IPC_GET_IMETHOD(*call)) {
     844        switch (IPC_GET_METHOD(*call)) {
    849845        case IPC_M_PHONE_HUNGUP:
    850846                return EOK;
    851847       
    852848        case NET_NIL_DEVICE:
    853                 return eth_device_message(IPC_GET_DEVICE(*call),
    854                     IPC_GET_SERVICE(*call), IPC_GET_MTU(*call));
     849                return eth_device_message(IPC_GET_DEVICE(call),
     850                    IPC_GET_SERVICE(call), IPC_GET_MTU(call));
    855851        case NET_NIL_SEND:
    856                 rc = packet_translate_remote(eth_globals.net_phone, &packet,
    857                     IPC_GET_PACKET(*call));
    858                 if (rc != EOK)
    859                         return rc;
    860                 return eth_send_message(IPC_GET_DEVICE(*call), packet,
    861                     IPC_GET_SERVICE(*call));
     852                ERROR_PROPAGATE(packet_translate_remote(eth_globals.net_phone,
     853                    &packet, IPC_GET_PACKET(call)));
     854                return eth_send_message(IPC_GET_DEVICE(call), packet,
     855                    IPC_GET_SERVICE(call));
    862856        case NET_NIL_PACKET_SPACE:
    863                 rc = eth_packet_space_message(IPC_GET_DEVICE(*call), &addrlen,
    864                     &prefix, &content, &suffix);
    865                 if (rc != EOK)
    866                         return rc;
    867                 IPC_SET_ADDR(*answer, addrlen);
    868                 IPC_SET_PREFIX(*answer, prefix);
    869                 IPC_SET_CONTENT(*answer, content);
    870                 IPC_SET_SUFFIX(*answer, suffix);
     857                ERROR_PROPAGATE(eth_packet_space_message(IPC_GET_DEVICE(call),
     858                    &addrlen, &prefix, &content, &suffix));
     859                IPC_SET_ADDR(answer, addrlen);
     860                IPC_SET_PREFIX(answer, prefix);
     861                IPC_SET_CONTENT(answer, content);
     862                IPC_SET_SUFFIX(answer, suffix);
    871863                *answer_count = 4;
    872864                return EOK;
    873865        case NET_NIL_ADDR:
    874                 rc = eth_addr_message(IPC_GET_DEVICE(*call), ETH_LOCAL_ADDR,
    875                     &address);
    876                 if (rc != EOK)
    877                         return rc;
     866                ERROR_PROPAGATE(eth_addr_message(IPC_GET_DEVICE(call),
     867                    ETH_LOCAL_ADDR, &address));
    878868                return measured_strings_reply(address, 1);
    879869        case NET_NIL_BROADCAST_ADDR:
    880                 rc = eth_addr_message(IPC_GET_DEVICE(*call), ETH_BROADCAST_ADDR,
    881                     &address);
    882                 if (rc != EOK)
    883                         return EOK;
     870                ERROR_PROPAGATE(eth_addr_message(IPC_GET_DEVICE(call),
     871                    ETH_BROADCAST_ADDR, &address));
    884872                return measured_strings_reply(address, 1);
    885873        case IPC_M_CONNECT_TO_ME:
    886                 return eth_register_message(NIL_GET_PROTO(*call),
    887                     IPC_GET_PHONE(*call));
     874                return eth_register_message(NIL_GET_PROTO(call),
     875                    IPC_GET_PHONE(call));
    888876        }
    889877       
     
    891879}
    892880
     881/** Default thread for new connections.
     882 *
     883 * @param[in] iid       The initial message identifier.
     884 * @param[in] icall     The initial message call structure.
     885 *
     886 */
     887static void nil_client_connection(ipc_callid_t iid, ipc_call_t *icall)
     888{
     889        /*
     890         * Accept the connection
     891         *  - Answer the first IPC_M_CONNECT_ME_TO call.
     892         */
     893        ipc_answer_0(iid, EOK);
     894       
     895        while (true) {
     896                ipc_call_t answer;
     897                int answer_count;
     898               
     899                /* Clear the answer structure */
     900                refresh_answer(&answer, &answer_count);
     901               
     902                /* Fetch the next message */
     903                ipc_call_t call;
     904                ipc_callid_t callid = async_get_call(&call);
     905               
     906                /* Process the message */
     907                int res = nil_module_message_standalone(NAME, callid, &call,
     908                    &answer, &answer_count);
     909               
     910                /*
     911                 * End if told to either by the message or the processing
     912                 * result.
     913                 */
     914                if ((IPC_GET_METHOD(call) == IPC_M_PHONE_HUNGUP) ||
     915                    (res == EHANGUP))
     916                        return;
     917               
     918                /* Answer the message */
     919                answer_call(callid, res, &answer, answer_count);
     920        }
     921}
     922
    893923int main(int argc, char *argv[])
    894924{
     925        ERROR_DECLARE;
     926       
    895927        /* Start the module */
    896         return nil_module_start(SERVICE_ETHERNET);
     928        ERROR_PROPAGATE(nil_module_start_standalone(nil_client_connection));
     929        return EOK;
    897930}
    898931
Note: See TracChangeset for help on using the changeset viewer.