Ignore:
File:
1 edited

Legend:

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

    rffa2c8ef r25271006  
    3737#include <async.h>
    3838#include <errno.h>
     39#include <err.h>
    3940#include <stdio.h>
    4041#include <str.h>
     42
     43#include <ipc/ipc.h>
    4144#include <ipc/services.h>
    4245#include <ipc/nil.h>
     46
    4347#include <net/modules.h>
    4448#include <adt/measured_strings.h>
    4549#include <packet_client.h>
    4650#include <net/device.h>
    47 #include <netif_skel.h>
    48 #include <nil_remote.h>
     51#include <nil_interface.h>
     52#include <netif_interface.h>
     53#include <netif_local.h>
     54
     55/** Default hardware address. */
     56#define DEFAULT_ADDR            "\0\0\0\0\0\0"
    4957
    5058/** Default address length. */
    51 #define DEFAULT_ADDR_LEN  6
     59#define DEFAULT_ADDR_LEN        (sizeof(DEFAULT_ADDR) / sizeof(char))
    5260
    5361/** Loopback module name. */
    5462#define NAME  "lo"
    5563
    56 static uint8_t default_addr[DEFAULT_ADDR_LEN] =
    57     {0, 0, 0, 0, 0, 0};
    58 
    59 int netif_specific_message(ipc_callid_t callid, ipc_call_t *call,
    60     ipc_call_t *answer, size_t *count)
     64/** Network interface global data. */
     65netif_globals_t netif_globals;
     66
     67int
     68netif_specific_message(ipc_callid_t callid, ipc_call_t *call,
     69    ipc_call_t *answer, int *answer_count)
    6170{
    6271        return ENOTSUP;
    6372}
    6473
    65 int netif_get_addr_message(device_id_t device_id, measured_string_t *address)
     74int netif_get_addr_message(device_id_t device_id, measured_string_ref address)
    6675{
    6776        if (!address)
    6877                return EBADMEM;
    69        
    70         address->value = default_addr;
     78        address->value = str_dup(DEFAULT_ADDR);
    7179        address->length = DEFAULT_ADDR_LEN;
    72        
    73         return EOK;
    74 }
    75 
    76 int netif_get_device_stats(device_id_t device_id, device_stats_t *stats)
    77 {
     80        return EOK;
     81}
     82
     83int netif_get_device_stats(device_id_t device_id, device_stats_ref stats)
     84{
     85        ERROR_DECLARE;
     86
     87        netif_device_t *device;
     88
    7889        if (!stats)
    7990                return EBADMEM;
    80        
    81         netif_device_t *device;
    82         int rc = find_device(device_id, &device);
    83         if (rc != EOK)
    84                 return rc;
    85        
    86         memcpy(stats, (device_stats_t *) device->specific,
     91        ERROR_PROPAGATE(find_device(device_id, &device));
     92        memcpy(stats, (device_stats_ref) device->specific,
    8793            sizeof(device_stats_t));
    88        
    89         return EOK;
    90 }
    91 
    92 /** Change the loopback state.
    93  *
    94  * @param[in] device The device structure.
    95  * @param[in] state  The new device state.
    96  *
    97  * @return New state if changed.
    98  * @return EOK otherwise.
    99  *
    100  */
    101 static void change_state_message(netif_device_t *device, device_state_t state)
     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)
    102105{
    103106        if (device->state != state) {
    104107                device->state = state;
    105108               
    106                 const char *desc;
    107                 switch (state) {
    108                 case NETIF_ACTIVE:
    109                         desc = "active";
    110                         break;
    111                 case NETIF_STOPPED:
    112                         desc = "stopped";
    113                         break;
    114                 default:
    115                         desc = "unknown";
    116                 }
    117                
    118                 printf("%s: State changed to %s\n", NAME, desc);
    119         }
    120 }
    121 
    122 /** Create and return the loopback network interface structure.
    123  *
    124  * @param[in]  device_id New devce identifier.
    125  * @param[out] device    Device structure.
    126  *
    127  * @return EOK on success.
    128  * @return EXDEV if one loopback network interface already exists.
    129  * @return ENOMEM if there is not enough memory left.
    130  *
    131  */
    132 static int lo_create(device_id_t device_id, netif_device_t **device)
    133 {
     109                printf("%s: State changed to %s\n", NAME,
     110                    (state == NETIF_ACTIVE) ? "active" : "stopped");
     111               
     112                return state;
     113        }
     114       
     115        return EOK;
     116}
     117
     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{
     128        int index;
     129
    134130        if (netif_device_map_count(&netif_globals.device_map) > 0)
    135131                return EXDEV;
    136        
     132
    137133        *device = (netif_device_t *) malloc(sizeof(netif_device_t));
    138134        if (!*device)
    139135                return ENOMEM;
    140        
    141136        (*device)->specific = (device_stats_t *) malloc(sizeof(device_stats_t));
    142137        if (!(*device)->specific) {
     
    144139                return ENOMEM;
    145140        }
    146        
    147         null_device_stats((device_stats_t *) (*device)->specific);
     141        null_device_stats((device_stats_ref) (*device)->specific);
    148142        (*device)->device_id = device_id;
    149143        (*device)->nil_phone = -1;
    150144        (*device)->state = NETIF_STOPPED;
    151         int index = netif_device_map_add(&netif_globals.device_map,
     145        index = netif_device_map_add(&netif_globals.device_map,
    152146            (*device)->device_id, *device);
    153        
    154147        if (index < 0) {
    155148                free(*device);
     
    164157int netif_initialize(void)
    165158{
    166         return async_connect_to_me(PHONE_NS, SERVICE_LO, 0, 0, NULL);
    167 }
    168 
    169 int netif_probe_message(device_id_t device_id, int irq, void *io)
    170 {
    171         /* Create a new device */
     159        ipcarg_t phonehash;
     160
     161        return REGISTER_ME(SERVICE_LO, &phonehash);
     162}
     163
     164int netif_probe_message(device_id_t device_id, int irq, uintptr_t io)
     165{
     166        ERROR_DECLARE;
     167
    172168        netif_device_t *device;
    173         int rc = lo_create(device_id, &device);
    174         if (rc != EOK)
    175                 return rc;
    176        
     169
     170        // create a new device
     171        ERROR_PROPAGATE(create(device_id, &device));
     172        // print the settings
    177173        printf("%s: Device created (id: %d)\n", NAME, device->device_id);
    178174        return EOK;
    179175}
    180176
    181 int netif_send_message(device_id_t device_id, packet_t *packet, services_t sender)
    182 {
     177int netif_send_message(device_id_t device_id, packet_t packet, services_t sender)
     178{
     179        ERROR_DECLARE;
     180
    183181        netif_device_t *device;
    184         int rc = find_device(device_id, &device);
    185         if (rc != EOK)
    186                 return EOK;
    187        
     182        size_t length;
     183        packet_t next;
     184        int phone;
     185
     186        ERROR_PROPAGATE(find_device(device_id, &device));
    188187        if (device->state != NETIF_ACTIVE) {
    189188                netif_pq_release(packet_get_id(packet));
    190189                return EFORWARD;
    191190        }
    192        
    193         packet_t *next = packet;
     191        next = packet;
    194192        do {
    195                 ((device_stats_t *) device->specific)->send_packets++;
    196                 ((device_stats_t *) device->specific)->receive_packets++;
    197                 size_t length = packet_get_data_length(next);
    198                 ((device_stats_t *) device->specific)->send_bytes += length;
    199                 ((device_stats_t *) device->specific)->receive_bytes += length;
     193                ((device_stats_ref) device->specific)->send_packets++;
     194                ((device_stats_ref) device->specific)->receive_packets++;
     195                length = packet_get_data_length(next);
     196                ((device_stats_ref) device->specific)->send_bytes += length;
     197                ((device_stats_ref) device->specific)->receive_bytes += length;
    200198                next = pq_next(next);
    201         } while (next);
    202        
    203         int phone = device->nil_phone;
     199        } while(next);
     200        phone = device->nil_phone;
    204201        fibril_rwlock_write_unlock(&netif_globals.lock);
    205        
    206202        nil_received_msg(phone, device_id, packet, sender);
    207        
    208203        fibril_rwlock_write_lock(&netif_globals.lock);
     204       
    209205        return EOK;
    210206}
     
    212208int netif_start_message(netif_device_t *device)
    213209{
    214         change_state_message(device, NETIF_ACTIVE);
    215         return device->state;
     210        return change_state_message(device, NETIF_ACTIVE);
    216211}
    217212
    218213int netif_stop_message(netif_device_t *device)
    219214{
    220         change_state_message(device, NETIF_STOPPED);
    221         return device->state;
     215        return change_state_message(device, NETIF_STOPPED);
     216}
     217
     218/** Default thread for new connections.
     219 *
     220 * @param[in] iid       The initial message identifier.
     221 * @param[in] icall     The initial message call structure.
     222 */
     223static void netif_client_connection(ipc_callid_t iid, ipc_call_t *icall)
     224{
     225        /*
     226         * Accept the connection
     227         *  - Answer the first IPC_M_CONNECT_ME_TO call.
     228         */
     229        ipc_answer_0(iid, EOK);
     230       
     231        while (true) {
     232                ipc_call_t answer;
     233                int answer_count;
     234               
     235                /* Clear the answer structure */
     236                refresh_answer(&answer, &answer_count);
     237               
     238                /* Fetch the next message */
     239                ipc_call_t call;
     240                ipc_callid_t callid = async_get_call(&call);
     241               
     242                /* Process the message */
     243                int res = netif_module_message(NAME, callid, &call, &answer,
     244                    &answer_count);
     245               
     246                /*
     247                 * End if told to either by the message or the processing
     248                 * result.
     249                 */
     250                if ((IPC_GET_METHOD(call) == IPC_M_PHONE_HUNGUP) ||
     251                    (res == EHANGUP))
     252                        return;
     253               
     254                /* Answer the message */
     255                answer_call(callid, res, &answer, answer_count);
     256        }
    222257}
    223258
    224259int main(int argc, char *argv[])
    225260{
     261        ERROR_DECLARE;
     262       
    226263        /* Start the module */
    227         return netif_module_start();
     264        ERROR_PROPAGATE(netif_module_start(netif_client_connection));
     265        return EOK;
    228266}
    229267
Note: See TracChangeset for help on using the changeset viewer.