Ignore:
File:
1 edited

Legend:

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

    rf5a3479 r2e236901  
    2828
    2929/** @addtogroup lo
    30  *  @{
     30 * @{
    3131 */
    3232
    3333/** @file
    34  *  Loopback network interface implementation.
     34 * Loopback network interface implementation.
    3535 */
    3636
    3737#include <async.h>
    3838#include <errno.h>
    39 #include <err.h>
    4039#include <stdio.h>
    4140#include <str.h>
     
    5352#include <netif_local.h>
    5453
    55 /** Default hardware address.
    56  */
     54/** Default hardware address. */
    5755#define DEFAULT_ADDR            "\0\0\0\0\0\0"
    5856
    59 /** Default address length.
    60  */
     57/** Default address length. */
    6158#define DEFAULT_ADDR_LEN        (sizeof(DEFAULT_ADDR) / sizeof(char))
    6259
    63 /** Loopback module name.
    64  */
     60/** Loopback module name. */
    6561#define NAME  "lo"
    6662
    67 /** Network interface global data.
    68  */
     63/** Network interface global data. */
    6964netif_globals_t netif_globals;
    7065
    71 /** Changes the loopback state.
    72  *  @param[in] device The device structure.
    73  *  @param[in] state The new device state.
    74  *  @returns The new state if changed.
    75  *  @returns EOK otherwise.
    76  */
    77 int change_state_message(netif_device_t * device, device_state_t state);
    78 
    79 /** Creates and returns the loopback network interface structure.
    80  *  @param[in] device_id The new devce identifier.
    81  *  @param[out] device The device structure.
    82  *  @returns EOK on success.
    83  *  @returns EXDEV if one loopback network interface already exists.
    84  *  @returns ENOMEM if there is not enough memory left.
    85  */
    86 int create(device_id_t device_id, netif_device_t * * device);
    87 
    88 int netif_specific_message(ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count){
     66int
     67netif_specific_message(ipc_callid_t callid, ipc_call_t *call,
     68    ipc_call_t *answer, int *answer_count)
     69{
    8970        return ENOTSUP;
    9071}
    9172
    92 int netif_get_addr_message(device_id_t device_id, measured_string_ref address){
    93         if(! address){
     73int netif_get_addr_message(device_id_t device_id, measured_string_ref address)
     74{
     75        if (!address)
    9476                return EBADMEM;
    95         }
    9677        address->value = str_dup(DEFAULT_ADDR);
    9778        address->length = DEFAULT_ADDR_LEN;
     
    9980}
    10081
    101 int netif_get_device_stats(device_id_t device_id, device_stats_ref stats){
    102         ERROR_DECLARE;
    103 
    104         netif_device_t * device;
    105 
    106         if(! stats){
     82int netif_get_device_stats(device_id_t device_id, device_stats_ref stats)
     83{
     84        netif_device_t *device;
     85        int rc;
     86
     87        if (!stats)
    10788                return EBADMEM;
    108         }
    109         ERROR_PROPAGATE(find_device(device_id, &device));
    110         memcpy(stats, (device_stats_ref) device->specific, sizeof(device_stats_t));
    111         return EOK;
    112 }
    113 
    114 int change_state_message(netif_device_t * device, device_state_t state)
     89        rc = find_device(device_id, &device);
     90        if (rc != EOK)
     91                return rc;
     92        memcpy(stats, (device_stats_ref) device->specific,
     93            sizeof(device_stats_t));
     94        return EOK;
     95}
     96
     97/** Changes the loopback state.
     98 *
     99 * @param[in] device    The device structure.
     100 * @param[in] state     The new device state.
     101 * @returns             The new state if changed.
     102 * @returns             EOK otherwise.
     103 */
     104static int change_state_message(netif_device_t *device, device_state_t state)
    115105{
    116106        if (device->state != state) {
     
    126116}
    127117
    128 int create(device_id_t device_id, netif_device_t * * device){
     118/** Creates and returns the loopback network interface structure.
     119 *
     120 * @param[in] device_id The new devce identifier.
     121 * @param[out] device   The device structure.
     122 * @returns             EOK on success.
     123 * @returns             EXDEV if one loopback network interface already exists.
     124 * @returns             ENOMEM if there is not enough memory left.
     125 */
     126static int create(device_id_t device_id, netif_device_t **device)
     127{
    129128        int index;
    130129
    131         if(netif_device_map_count(&netif_globals.device_map) > 0){
     130        if (netif_device_map_count(&netif_globals.device_map) > 0)
    132131                return EXDEV;
    133         }else{
    134                 *device = (netif_device_t *) malloc(sizeof(netif_device_t));
    135                 if(!(*device)){
    136                         return ENOMEM;
    137                 }
    138                 (** device).specific = malloc(sizeof(device_stats_t));
    139                 if(! (** device).specific){
    140                         free(*device);
    141                         return ENOMEM;
    142                 }
    143                 null_device_stats((device_stats_ref)(** device).specific);
    144                 (** device).device_id = device_id;
    145                 (** device).nil_phone = -1;
    146                 (** device).state = NETIF_STOPPED;
    147                 index = netif_device_map_add(&netif_globals.device_map, (** device).device_id, * device);
    148                 if(index < 0){
    149                         free(*device);
    150                         free((** device).specific);
    151                         *device = NULL;
    152                         return index;
    153                 }
    154         }
    155         return EOK;
    156 }
    157 
    158 int netif_initialize(void){
     132
     133        *device = (netif_device_t *) malloc(sizeof(netif_device_t));
     134        if (!*device)
     135                return ENOMEM;
     136        (*device)->specific = (device_stats_t *) malloc(sizeof(device_stats_t));
     137        if (!(*device)->specific) {
     138                free(*device);
     139                return ENOMEM;
     140        }
     141        null_device_stats((device_stats_ref) (*device)->specific);
     142        (*device)->device_id = device_id;
     143        (*device)->nil_phone = -1;
     144        (*device)->state = NETIF_STOPPED;
     145        index = netif_device_map_add(&netif_globals.device_map,
     146            (*device)->device_id, *device);
     147        if (index < 0) {
     148                free(*device);
     149                free((*device)->specific);
     150                *device = NULL;
     151                return index;
     152        }
     153       
     154        return EOK;
     155}
     156
     157int netif_initialize(void)
     158{
    159159        ipcarg_t phonehash;
    160160
     
    162162}
    163163
    164 int netif_probe_message(device_id_t device_id, int irq, uintptr_t io){
    165         ERROR_DECLARE;
    166 
    167         netif_device_t * device;
     164int netif_probe_message(device_id_t device_id, int irq, uintptr_t io)
     165{
     166        netif_device_t *device;
     167        int rc;
    168168
    169169        // create a new device
    170         ERROR_PROPAGATE(create(device_id, &device));
     170        rc = create(device_id, &device);
     171        if (rc != EOK)
     172                return rc;
    171173        // print the settings
    172174        printf("%s: Device created (id: %d)\n", NAME, device->device_id);
     
    174176}
    175177
    176 int netif_send_message(device_id_t device_id, packet_t packet, services_t sender){
    177         ERROR_DECLARE;
    178 
    179         netif_device_t * device;
     178int netif_send_message(device_id_t device_id, packet_t packet, services_t sender)
     179{
     180        netif_device_t *device;
    180181        size_t length;
    181182        packet_t next;
    182183        int phone;
    183 
    184         ERROR_PROPAGATE(find_device(device_id, &device));
    185         if(device->state != NETIF_ACTIVE){
     184        int rc;
     185
     186        rc = find_device(device_id, &device);
     187        if (rc != EOK)
     188                return EOK;
     189        if (device->state != NETIF_ACTIVE) {
    186190                netif_pq_release(packet_get_id(packet));
    187191                return EFORWARD;
    188192        }
    189193        next = packet;
    190         do{
    191                 ++ ((device_stats_ref) device->specific)->send_packets;
    192                 ++ ((device_stats_ref) device->specific)->receive_packets;
     194        do {
     195                ((device_stats_ref) device->specific)->send_packets++;
     196                ((device_stats_ref) device->specific)->receive_packets++;
    193197                length = packet_get_data_length(next);
    194198                ((device_stats_ref) device->specific)->send_bytes += length;
    195199                ((device_stats_ref) device->specific)->receive_bytes += length;
    196200                next = pq_next(next);
    197         }while(next);
     201        } while(next);
    198202        phone = device->nil_phone;
    199203        fibril_rwlock_write_unlock(&netif_globals.lock);
    200204        nil_received_msg(phone, device_id, packet, sender);
    201205        fibril_rwlock_write_lock(&netif_globals.lock);
    202         return EOK;
    203 }
    204 
    205 int netif_start_message(netif_device_t * device){
     206       
     207        return EOK;
     208}
     209
     210int netif_start_message(netif_device_t *device)
     211{
    206212        return change_state_message(device, NETIF_ACTIVE);
    207213}
    208214
    209 int netif_stop_message(netif_device_t * device){
     215int netif_stop_message(netif_device_t *device)
     216{
    210217        return change_state_message(device, NETIF_STOPPED);
    211218}
     
    213220/** Default thread for new connections.
    214221 *
    215  * @param[in] iid The initial message identifier.
    216  * @param[in] icall The initial message call structure.
    217  *
     222 * @param[in] iid       The initial message identifier.
     223 * @param[in] icall     The initial message call structure.
    218224 */
    219225static void netif_client_connection(ipc_callid_t iid, ipc_call_t *icall)
     
    225231        ipc_answer_0(iid, EOK);
    226232       
    227         while(true) {
     233        while (true) {
    228234                ipc_call_t answer;
    229235                int answer_count;
     
    240246                    &answer_count);
    241247               
    242                 /* End if said to either by the message or the processing result */
    243                 if ((IPC_GET_METHOD(call) == IPC_M_PHONE_HUNGUP) || (res == EHANGUP))
     248                /*
     249                 * End if told to either by the message or the processing
     250                 * result.
     251                 */
     252                if ((IPC_GET_METHOD(call) == IPC_M_PHONE_HUNGUP) ||
     253                    (res == EHANGUP))
    244254                        return;
    245255               
     
    251261int main(int argc, char *argv[])
    252262{
    253         ERROR_DECLARE;
     263        int rc;
    254264       
    255265        /* Start the module */
    256         if (ERROR_OCCURRED(netif_module_start(netif_client_connection)))
    257                 return ERROR_CODE;
    258        
    259         return EOK;
     266        rc = netif_module_start(netif_client_connection);
     267        return rc;
    260268}
    261269
Note: See TracChangeset for help on using the changeset viewer.