Ignore:
File:
1 edited

Legend:

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

    ra1a101d r02a09ed  
    3939#include <errno.h>
    4040#include <inet/iplink_srv.h>
     41#include <inet/addr.h>
    4142#include <io/log.h>
    4243#include <loc.h>
     
    4445#include <stdlib.h>
    4546
    46 #define NAME "loopip"
     47#define NAME  "loopip"
    4748
    4849static int loopip_open(iplink_srv_t *srv);
    4950static int loopip_close(iplink_srv_t *srv);
    50 static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu);
     51static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu);
    5152static 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);
     53static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
     54static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr);
    5455
    5556static void loopip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
     
    6970typedef struct {
    7071        link_t link;
    71         iplink_srv_sdu_t sdu;
     72       
     73        uint16_t af;
     74        iplink_recv_sdu_t sdu;
    7275} rqueue_entry_t;
    7376
     
    7780                log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_recv_fibril(): Wait for one item");
    7881                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 
     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        }
     90       
    8491        return 0;
    8592}
     
    8794static int loopip_init(void)
    8895{
    89         int rc;
    90         service_id_t sid;
    91         category_id_t iplink_cat;
    92         const char *svc_name = "net/loopback";
    93        
    9496        async_set_client_connection(loopip_client_conn);
    9597       
    96         rc = loc_server_register(NAME);
     98        int rc = loc_server_register(NAME);
    9799        if (rc != EOK) {
    98100                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server.");
    99101                return rc;
    100102        }
    101 
     103       
    102104        iplink_srv_init(&loopip_iplink);
    103105        loopip_iplink.ops = &loopip_iplink_ops;
    104106        loopip_iplink.arg = NULL;
    105 
     107       
    106108        prodcons_initialize(&loopip_rcv_queue);
    107 
     109       
     110        const char *svc_name = "net/loopback";
     111        service_id_t sid;
    108112        rc = loc_service_register(svc_name, &sid);
    109113        if (rc != EOK) {
    110                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", svc_name);
    111                 return rc;
    112         }
    113 
     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;
    114120        rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING);
    115121        if (rc != EOK) {
     
    117123                return rc;
    118124        }
    119 
     125       
    120126        rc = loc_service_add_to_cat(sid, iplink_cat);
    121127        if (rc != EOK) {
    122                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", svc_name);
    123                 return rc;
    124         }
    125 
     128                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.",
     129                    svc_name);
     130                return rc;
     131        }
     132       
    126133        fid_t fid = fibril_create(loopip_recv_fibril, NULL);
    127134        if (fid == 0)
    128135                return ENOMEM;
    129 
     136       
    130137        fibril_add_ready(fid);
    131 
     138       
    132139        return EOK;
    133140}
     
    151158}
    152159
    153 static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu)
    154 {
    155         rqueue_entry_t *rqe;
    156 
     160static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu)
     161{
    157162        log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_send()");
    158 
    159         rqe = calloc(1, sizeof(rqueue_entry_t));
     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));
    160176        if (rqe == NULL)
    161177                return ENOMEM;
     178       
    162179        /*
    163180         * Clone SDU
    164181         */
    165         rqe->sdu.lsrc = sdu->ldest;
    166         rqe->sdu.ldest = sdu->lsrc;
     182        rqe->af = src_af;
    167183        rqe->sdu.data = malloc(sdu->size);
    168184        if (rqe->sdu.data == NULL) {
     
    170186                return ENOMEM;
    171187        }
    172 
     188       
    173189        memcpy(rqe->sdu.data, sdu->data, sdu->size);
    174190        rqe->sdu.size = sdu->size;
    175 
     191       
    176192        /*
    177193         * Insert to receive queue
    178194         */
    179195        prodcons_produce(&loopip_rcv_queue, &rqe->link);
    180 
     196       
    181197        return EOK;
    182198}
     
    189205}
    190206
    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);
     207static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
     208{
     209        return EOK;
     210}
     211
     212static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr)
     213{
    200214        return EOK;
    201215}
     
    203217int main(int argc, char *argv[])
    204218{
    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 
     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       
    214227        rc = loopip_init();
    215228        if (rc != EOK)
    216                 return 1;
    217 
    218         printf(NAME ": Accepting connections.\n");
     229                return rc;
     230       
     231        printf("%s: Accepting connections.\n", NAME);
    219232        task_retval(0);
    220233        async_manager();
    221 
     234       
    222235        /* Not reached */
    223236        return 0;
Note: See TracChangeset for help on using the changeset viewer.