Ignore:
File:
1 edited

Legend:

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

    r1c635d6 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>
    4443#include <stdio.h>
    4544#include <stdlib.h>
    46 #include <task.h>
    47 
    48 #define NAME  "loopip"
     45
     46#define NAME "loopip"
    4947
    5048static int loopip_open(iplink_srv_t *srv);
    5149static int loopip_close(iplink_srv_t *srv);
    52 static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu);
    53 static int loopip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu);
     50static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu);
    5451static int loopip_get_mtu(iplink_srv_t *srv, size_t *mtu);
    55 static int loopip_get_mac48(iplink_srv_t *srv, addr48_t *mac);
    56 static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
    57 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);
    5854
    5955static void loopip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
     
    6359        .close = loopip_close,
    6460        .send = loopip_send,
    65         .send6 = loopip_send6,
    6661        .get_mtu = loopip_get_mtu,
    67         .get_mac48 = loopip_get_mac48,
    6862        .addr_add = loopip_addr_add,
    6963        .addr_remove = loopip_addr_remove
     
    7569typedef struct {
    7670        link_t link;
    77        
    78         /* XXX Version should be part of SDU */
    79         ip_ver_t ver;
    80         iplink_recv_sdu_t sdu;
     71        iplink_srv_sdu_t sdu;
    8172} rqueue_entry_t;
    8273
     
    8677                log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_recv_fibril(): Wait for one item");
    8778                link_t *link = prodcons_consume(&loopip_rcv_queue);
    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         }
     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";
    9693       
    97         return 0;
    98 }
    99 
    100 static int loopip_init(void)
    101 {
    10294        async_set_client_connection(loopip_client_conn);
    10395       
    104         int rc = loc_server_register(NAME);
     96        rc = loc_server_register(NAME);
    10597        if (rc != EOK) {
    10698                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server.");
    10799                return rc;
    108100        }
    109        
     101
    110102        iplink_srv_init(&loopip_iplink);
    111103        loopip_iplink.ops = &loopip_iplink_ops;
    112104        loopip_iplink.arg = NULL;
    113        
     105
    114106        prodcons_initialize(&loopip_rcv_queue);
    115        
    116         const char *svc_name = "net/loopback";
    117         service_id_t sid;
     107
    118108        rc = loc_service_register(svc_name, &sid);
    119109        if (rc != EOK) {
    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;
     110                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", svc_name);
     111                return rc;
     112        }
     113
    126114        rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING);
    127115        if (rc != EOK) {
     
    129117                return rc;
    130118        }
    131        
     119
    132120        rc = loc_service_add_to_cat(sid, iplink_cat);
    133121        if (rc != EOK) {
    134                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.",
    135                     svc_name);
    136                 return rc;
    137         }
    138        
     122                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", svc_name);
     123                return rc;
     124        }
     125
    139126        fid_t fid = fibril_create(loopip_recv_fibril, NULL);
    140127        if (fid == 0)
    141128                return ENOMEM;
    142        
     129
    143130        fibril_add_ready(fid);
    144        
     131
    145132        return EOK;
    146133}
     
    164151}
    165152
    166 static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu)
    167 {
     153static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu)
     154{
     155        rqueue_entry_t *rqe;
     156
    168157        log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_send()");
    169        
    170         rqueue_entry_t *rqe = calloc(1, sizeof(rqueue_entry_t));
     158
     159        rqe = calloc(1, sizeof(rqueue_entry_t));
    171160        if (rqe == NULL)
    172161                return ENOMEM;
    173        
    174162        /*
    175163         * Clone SDU
    176164         */
    177         rqe->ver = ip_v4;
     165        rqe->sdu.lsrc = sdu->ldest;
     166        rqe->sdu.ldest = sdu->lsrc;
    178167        rqe->sdu.data = malloc(sdu->size);
    179168        if (rqe->sdu.data == NULL) {
     
    181170                return ENOMEM;
    182171        }
    183        
     172
    184173        memcpy(rqe->sdu.data, sdu->data, sdu->size);
    185174        rqe->sdu.size = sdu->size;
    186        
     175
    187176        /*
    188177         * Insert to receive queue
    189178         */
    190179        prodcons_produce(&loopip_rcv_queue, &rqe->link);
    191        
    192         return EOK;
    193 }
    194 
    195 static 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        
     180
    221181        return EOK;
    222182}
     
    229189}
    230190
    231 static 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 
    237 static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
    238 {
    239         return EOK;
    240 }
    241 
    242 static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr)
    243 {
     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);
    244200        return EOK;
    245201}
     
    247203int main(int argc, char *argv[])
    248204{
    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        
     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
    257214        rc = loopip_init();
    258215        if (rc != EOK)
    259                 return rc;
    260        
    261         printf("%s: Accepting connections.\n", NAME);
     216                return 1;
     217
     218        printf(NAME ": Accepting connections.\n");
    262219        task_retval(0);
    263220        async_manager();
    264        
     221
    265222        /* Not reached */
    266223        return 0;
Note: See TracChangeset for help on using the changeset viewer.