Ignore:
File:
1 edited

Legend:

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

    r02a09ed ra1a101d  
    3939#include <errno.h>
    4040#include <inet/iplink_srv.h>
    41 #include <inet/addr.h>
    4241#include <io/log.h>
    4342#include <loc.h>
     
    4544#include <stdlib.h>
    4645
    47 #define NAME  "loopip"
     46#define NAME "loopip"
    4847
    4948static int loopip_open(iplink_srv_t *srv);
    5049static int loopip_close(iplink_srv_t *srv);
    51 static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu);
     50static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu);
    5251static int loopip_get_mtu(iplink_srv_t *srv, size_t *mtu);
    53 static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
    54 static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr);
     52static int loopip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr);
     53static int loopip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_t *addr);
    5554
    5655static void loopip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
     
    7069typedef struct {
    7170        link_t link;
    72        
    73         uint16_t af;
    74         iplink_recv_sdu_t sdu;
     71        iplink_srv_sdu_t sdu;
    7572} rqueue_entry_t;
    7673
     
    8077                log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_recv_fibril(): Wait for one item");
    8178                link_t *link = prodcons_consume(&loopip_rcv_queue);
    82                 rqueue_entry_t *rqe =
    83                     list_get_instance(link, rqueue_entry_t, link);
    84                
    85                 (void) iplink_ev_recv(&loopip_iplink, &rqe->sdu, rqe->af);
    86                
    87                 free(rqe->sdu.data);
    88                 free(rqe);
    89         }
     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
     84        return 0;
     85}
     86
     87static int loopip_init(void)
     88{
     89        int rc;
     90        service_id_t sid;
     91        category_id_t iplink_cat;
     92        const char *svc_name = "net/loopback";
    9093       
    91         return 0;
    92 }
    93 
    94 static int loopip_init(void)
    95 {
    9694        async_set_client_connection(loopip_client_conn);
    9795       
    98         int rc = loc_server_register(NAME);
     96        rc = loc_server_register(NAME);
    9997        if (rc != EOK) {
    10098                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server.");
    10199                return rc;
    102100        }
    103        
     101
    104102        iplink_srv_init(&loopip_iplink);
    105103        loopip_iplink.ops = &loopip_iplink_ops;
    106104        loopip_iplink.arg = NULL;
    107        
     105
    108106        prodcons_initialize(&loopip_rcv_queue);
    109        
    110         const char *svc_name = "net/loopback";
    111         service_id_t sid;
     107
    112108        rc = loc_service_register(svc_name, &sid);
    113109        if (rc != EOK) {
    114                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.",
    115                     svc_name);
    116                 return rc;
    117         }
    118        
    119         category_id_t iplink_cat;
     110                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", svc_name);
     111                return rc;
     112        }
     113
    120114        rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING);
    121115        if (rc != EOK) {
     
    123117                return rc;
    124118        }
    125        
     119
    126120        rc = loc_service_add_to_cat(sid, iplink_cat);
    127121        if (rc != EOK) {
    128                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.",
    129                     svc_name);
    130                 return rc;
    131         }
    132        
     122                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", svc_name);
     123                return rc;
     124        }
     125
    133126        fid_t fid = fibril_create(loopip_recv_fibril, NULL);
    134127        if (fid == 0)
    135128                return ENOMEM;
    136        
     129
    137130        fibril_add_ready(fid);
    138        
     131
    139132        return EOK;
    140133}
     
    158151}
    159152
    160 static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu)
    161 {
     153static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu)
     154{
     155        rqueue_entry_t *rqe;
     156
    162157        log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_send()");
    163        
    164         addr32_t src_v4;
    165         addr128_t src_v6;
    166         uint16_t src_af = inet_addr_get(&sdu->src, &src_v4, &src_v6);
    167        
    168         addr32_t dest_v4;
    169         addr128_t dest_v6;
    170         uint16_t dest_af = inet_addr_get(&sdu->dest, &dest_v4, &dest_v6);
    171        
    172         if (src_af != dest_af)
    173                 return EINVAL;
    174        
    175         rqueue_entry_t *rqe = calloc(1, sizeof(rqueue_entry_t));
     158
     159        rqe = calloc(1, sizeof(rqueue_entry_t));
    176160        if (rqe == NULL)
    177161                return ENOMEM;
    178        
    179162        /*
    180163         * Clone SDU
    181164         */
    182         rqe->af = src_af;
     165        rqe->sdu.lsrc = sdu->ldest;
     166        rqe->sdu.ldest = sdu->lsrc;
    183167        rqe->sdu.data = malloc(sdu->size);
    184168        if (rqe->sdu.data == NULL) {
     
    186170                return ENOMEM;
    187171        }
    188        
     172
    189173        memcpy(rqe->sdu.data, sdu->data, sdu->size);
    190174        rqe->sdu.size = sdu->size;
    191        
     175
    192176        /*
    193177         * Insert to receive queue
    194178         */
    195179        prodcons_produce(&loopip_rcv_queue, &rqe->link);
    196        
     180
    197181        return EOK;
    198182}
     
    205189}
    206190
    207 static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
    208 {
    209         return EOK;
    210 }
    211 
    212 static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr)
    213 {
     191static 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
     197static 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);
    214200        return EOK;
    215201}
     
    217203int main(int argc, char *argv[])
    218204{
    219         printf("%s: HelenOS loopback IP link provider\n", NAME);
    220        
    221         int rc = log_init(NAME);
    222         if (rc != EOK) {
    223                 printf("%s: Failed to initialize logging.\n", NAME);
    224                 return rc;
    225         }
    226        
     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
    227214        rc = loopip_init();
    228215        if (rc != EOK)
    229                 return rc;
    230        
    231         printf("%s: Accepting connections.\n", NAME);
     216                return 1;
     217
     218        printf(NAME ": Accepting connections.\n");
    232219        task_retval(0);
    233220        async_manager();
    234        
     221
    235222        /* Not reached */
    236223        return 0;
Note: See TracChangeset for help on using the changeset viewer.