Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/loopip/loopip.c

    ra1a101d r1c635d6  
    3939#include <errno.h>
    4040#include <inet/iplink_srv.h>
     41#include <inet/addr.h>
    4142#include <io/log.h>
    4243#include <loc.h>
    4344#include <stdio.h>
    4445#include <stdlib.h>
    45 
    46 #define NAME "loopip"
     46#include <task.h>
     47
     48#define NAME  "loopip"
    4749
    4850static int loopip_open(iplink_srv_t *srv);
    4951static int loopip_close(iplink_srv_t *srv);
    50 static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu);
     52static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu);
     53static int loopip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu);
    5154static int loopip_get_mtu(iplink_srv_t *srv, size_t *mtu);
    52 static int loopip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr);
    53 static int loopip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_t *addr);
     55static int loopip_get_mac48(iplink_srv_t *srv, addr48_t *mac);
     56static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
     57static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr);
    5458
    5559static void loopip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
     
    5963        .close = loopip_close,
    6064        .send = loopip_send,
     65        .send6 = loopip_send6,
    6166        .get_mtu = loopip_get_mtu,
     67        .get_mac48 = loopip_get_mac48,
    6268        .addr_add = loopip_addr_add,
    6369        .addr_remove = loopip_addr_remove
     
    6975typedef struct {
    7076        link_t link;
    71         iplink_srv_sdu_t sdu;
     77       
     78        /* XXX Version should be part of SDU */
     79        ip_ver_t ver;
     80        iplink_recv_sdu_t sdu;
    7281} rqueue_entry_t;
    7382
     
    7786                log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_recv_fibril(): Wait for one item");
    7887                link_t *link = prodcons_consume(&loopip_rcv_queue);
    79                 rqueue_entry_t *rqe = list_get_instance(link, rqueue_entry_t, link);
    80 
    81                 (void) iplink_ev_recv(&loopip_iplink, &rqe->sdu);
    82         }
    83 
     88                rqueue_entry_t *rqe =
     89                    list_get_instance(link, rqueue_entry_t, link);
     90               
     91                (void) iplink_ev_recv(&loopip_iplink, &rqe->sdu, rqe->ver);
     92               
     93                free(rqe->sdu.data);
     94                free(rqe);
     95        }
     96       
    8497        return 0;
    8598}
     
    87100static int loopip_init(void)
    88101{
    89         int rc;
    90         service_id_t sid;
    91         category_id_t iplink_cat;
    92         const char *svc_name = "net/loopback";
    93        
    94102        async_set_client_connection(loopip_client_conn);
    95103       
    96         rc = loc_server_register(NAME);
     104        int rc = loc_server_register(NAME);
    97105        if (rc != EOK) {
    98106                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server.");
    99107                return rc;
    100108        }
    101 
     109       
    102110        iplink_srv_init(&loopip_iplink);
    103111        loopip_iplink.ops = &loopip_iplink_ops;
    104112        loopip_iplink.arg = NULL;
    105 
     113       
    106114        prodcons_initialize(&loopip_rcv_queue);
    107 
     115       
     116        const char *svc_name = "net/loopback";
     117        service_id_t sid;
    108118        rc = loc_service_register(svc_name, &sid);
    109119        if (rc != EOK) {
    110                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", svc_name);
    111                 return rc;
    112         }
    113 
     120                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.",
     121                    svc_name);
     122                return rc;
     123        }
     124       
     125        category_id_t iplink_cat;
    114126        rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING);
    115127        if (rc != EOK) {
     
    117129                return rc;
    118130        }
    119 
     131       
    120132        rc = loc_service_add_to_cat(sid, iplink_cat);
    121133        if (rc != EOK) {
    122                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", svc_name);
    123                 return rc;
    124         }
    125 
     134                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.",
     135                    svc_name);
     136                return rc;
     137        }
     138       
    126139        fid_t fid = fibril_create(loopip_recv_fibril, NULL);
    127140        if (fid == 0)
    128141                return ENOMEM;
    129 
     142       
    130143        fibril_add_ready(fid);
    131 
     144       
    132145        return EOK;
    133146}
     
    151164}
    152165
    153 static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu)
    154 {
    155         rqueue_entry_t *rqe;
    156 
     166static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu)
     167{
    157168        log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_send()");
    158 
    159         rqe = calloc(1, sizeof(rqueue_entry_t));
     169       
     170        rqueue_entry_t *rqe = calloc(1, sizeof(rqueue_entry_t));
    160171        if (rqe == NULL)
    161172                return ENOMEM;
     173       
    162174        /*
    163175         * Clone SDU
    164176         */
    165         rqe->sdu.lsrc = sdu->ldest;
    166         rqe->sdu.ldest = sdu->lsrc;
     177        rqe->ver = ip_v4;
    167178        rqe->sdu.data = malloc(sdu->size);
    168179        if (rqe->sdu.data == NULL) {
     
    170181                return ENOMEM;
    171182        }
    172 
     183       
    173184        memcpy(rqe->sdu.data, sdu->data, sdu->size);
    174185        rqe->sdu.size = sdu->size;
    175 
     186       
    176187        /*
    177188         * Insert to receive queue
    178189         */
    179190        prodcons_produce(&loopip_rcv_queue, &rqe->link);
    180 
     191       
     192        return EOK;
     193}
     194
     195static int loopip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu)
     196{
     197        log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip6_send()");
     198       
     199        rqueue_entry_t *rqe = calloc(1, sizeof(rqueue_entry_t));
     200        if (rqe == NULL)
     201                return ENOMEM;
     202       
     203        /*
     204         * Clone SDU
     205         */
     206        rqe->ver = ip_v6;
     207        rqe->sdu.data = malloc(sdu->size);
     208        if (rqe->sdu.data == NULL) {
     209                free(rqe);
     210                return ENOMEM;
     211        }
     212       
     213        memcpy(rqe->sdu.data, sdu->data, sdu->size);
     214        rqe->sdu.size = sdu->size;
     215       
     216        /*
     217         * Insert to receive queue
     218         */
     219        prodcons_produce(&loopip_rcv_queue, &rqe->link);
     220       
    181221        return EOK;
    182222}
     
    189229}
    190230
    191 static int loopip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr)
    192 {
    193         log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_addr_add(0x%" PRIx32 ")", addr->ipv4);
    194         return EOK;
    195 }
    196 
    197 static int loopip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_t *addr)
    198 {
    199         log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_addr_remove(0x%" PRIx32 ")", addr->ipv4);
     231static int loopip_get_mac48(iplink_srv_t *src, addr48_t *mac)
     232{
     233        log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_get_mac48()");
     234        return ENOTSUP;
     235}
     236
     237static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
     238{
     239        return EOK;
     240}
     241
     242static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr)
     243{
    200244        return EOK;
    201245}
     
    203247int main(int argc, char *argv[])
    204248{
    205         int rc;
    206 
    207         printf(NAME ": HelenOS loopback IP link provider\n");
    208 
    209         if (log_init(NAME) != EOK) {
    210                 printf(NAME ": Failed to initialize logging.\n");
    211                 return 1;
    212         }
    213 
     249        printf("%s: HelenOS loopback IP link provider\n", NAME);
     250       
     251        int rc = log_init(NAME);
     252        if (rc != EOK) {
     253                printf("%s: Failed to initialize logging.\n", NAME);
     254                return rc;
     255        }
     256       
    214257        rc = loopip_init();
    215258        if (rc != EOK)
    216                 return 1;
    217 
    218         printf(NAME ": Accepting connections.\n");
     259                return rc;
     260       
     261        printf("%s: Accepting connections.\n", NAME);
    219262        task_retval(0);
    220263        async_manager();
    221 
     264       
    222265        /* Not reached */
    223266        return 0;
Note: See TracChangeset for help on using the changeset viewer.