Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset ceba4bed in mainline


Ignore:
Timestamp:
2012-02-06T17:38:50Z (8 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
e767dbf
Parents:
bc38578
Message:

Introduce address object. Sketch sending outgoing datagrams to directly
reachable destinations.

Location:
uspace
Files:
4 added
9 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/iplink.c

    rbc38578 rceba4bed  
    8888
    8989        ipc_call_t answer;
    90         aid_t req = async_send_2(exch, IPLINK_SEND, sdu->src.ipv4,
    91             sdu->dest.ipv4, &answer);
     90        aid_t req = async_send_2(exch, IPLINK_SEND, sdu->lsrc.ipv4,
     91            sdu->ldest.ipv4, &answer);
    9292        int rc = async_data_write_start(exch, sdu->data, sdu->size);
    9393        async_exchange_end(exch);
     
    127127        iplink_sdu_t sdu;
    128128
    129         sdu.src.ipv4 = IPC_GET_ARG1(*call);
    130         sdu.dest.ipv4 = IPC_GET_ARG2(*call);
     129        sdu.lsrc.ipv4 = IPC_GET_ARG1(*call);
     130        sdu.ldest.ipv4 = IPC_GET_ARG2(*call);
    131131
    132132        rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);
  • uspace/lib/c/generic/iplink_srv.c

    rbc38578 rceba4bed  
    5757        int rc;
    5858
    59         sdu.src.ipv4 = IPC_GET_ARG1(*call);
    60         sdu.dest.ipv4 = IPC_GET_ARG2(*call);
     59        sdu.lsrc.ipv4 = IPC_GET_ARG1(*call);
     60        sdu.ldest.ipv4 = IPC_GET_ARG2(*call);
    6161
    6262        rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);
     
    122122
    123123        ipc_call_t answer;
    124         aid_t req = async_send_2(exch, IPLINK_EV_RECV, sdu->src.ipv4,
    125             sdu->dest.ipv4, &answer);
     124        aid_t req = async_send_2(exch, IPLINK_EV_RECV, sdu->lsrc.ipv4,
     125            sdu->ldest.ipv4, &answer);
    126126        int rc = async_data_write_start(exch, sdu->data, sdu->size);
    127127        async_exchange_end(exch);
  • uspace/lib/c/include/inet/iplink.h

    rbc38578 rceba4bed  
    5252/** IP link Service Data Unit */
    5353typedef struct {
    54         /** Source address */
    55         iplink_addr_t src;
    56         /** Destination address */
    57         iplink_addr_t dest;
     54        /** Local source address */
     55        iplink_addr_t lsrc;
     56        /** Local destination address */
     57        iplink_addr_t ldest;
    5858        /** Serialized IP packet */
    5959        void *data;
  • uspace/lib/c/include/inet/iplink_srv.h

    rbc38578 rceba4bed  
    5757/** IP link Service Data Unit */
    5858typedef struct {
    59         /** Source address */
    60         iplink_srv_addr_t src;
    61         /** Destination address */
    62         iplink_srv_addr_t dest;
     59        /** Local source address */
     60        iplink_srv_addr_t lsrc;
     61        /** Local destination address */
     62        iplink_srv_addr_t ldest;
    6363        /** Serialized IP packet */
    6464        void *data;
  • uspace/srv/inet/Makefile

    rbc38578 rceba4bed  
    3131
    3232SOURCES = \
     33        addrobj.c \
    3334        inet.c \
    34         inet_link.c
     35        inet_link.c \
     36        pdu.c
    3537
    3638include $(USPACE_PREFIX)/Makefile.common
  • uspace/srv/inet/inet.c

    rbc38578 rceba4bed  
    4747#include <sys/types.h>
    4848
     49#include "addrobj.h"
    4950#include "inet.h"
    5051#include "inet_link.h"
     
    8586}
    8687
    87 static void inet_callback_create(inet_client_t *client, ipc_callid_t callid,
    88     ipc_call_t *call)
    89 {
    90         log_msg(LVL_DEBUG, "inet_callback_create()");
     88static void inet_callback_create_srv(inet_client_t *client, ipc_callid_t callid,
     89    ipc_call_t *call)
     90{
     91        log_msg(LVL_DEBUG, "inet_callback_create_srv()");
    9192
    9293        async_sess_t *sess = async_callback_receive(EXCHANGE_SERIALIZE);
     
    100101}
    101102
    102 static void inet_get_srcaddr(inet_client_t *client, ipc_callid_t callid,
    103     ipc_call_t *call)
    104 {
    105         log_msg(LVL_DEBUG, "inet_get_srcaddr()");
     103static int inet_send(inet_client_t *client, inet_dgram_t *dgram,
     104    uint8_t ttl, int df)
     105{
     106        inet_addrobj_t *addr;
     107
     108        addr = inet_addrobj_find(&dgram->dest);
     109        if (addr != NULL) {
     110                /* Destination is directly accessible */
     111                return inet_addrobj_send_dgram(addr, dgram, ttl, df);
     112        }
     113
     114        /* TODO: Gateways */
     115        log_msg(LVL_DEBUG, "inet_send: No route to destination.");
     116        return ENOENT;
     117}
     118
     119static void inet_get_srcaddr_srv(inet_client_t *client, ipc_callid_t callid,
     120    ipc_call_t *call)
     121{
     122        log_msg(LVL_DEBUG, "inet_get_srcaddr_srv()");
    106123
    107124        async_answer_0(callid, ENOTSUP);
    108125}
    109126
    110 static void inet_send(inet_client_t *client, ipc_callid_t callid,
     127static void inet_send_srv(inet_client_t *client, ipc_callid_t callid,
    111128    ipc_call_t *call)
    112129{
     
    116133        int rc;
    117134
    118         log_msg(LVL_DEBUG, "inet_send()");
     135        log_msg(LVL_DEBUG, "inet_send_srv()");
    119136
    120137        dgram.src.ipv4 = IPC_GET_ARG1(*call);
     
    124141        df = IPC_GET_ARG5(*call);
    125142
    126         (void)ttl;
    127         (void)df;
    128 
    129143        rc = async_data_write_accept(&dgram.data, false, 0, 0, 0, &dgram.size);
    130144        if (rc != EOK) {
     
    133147        }
    134148
     149        rc = inet_send(client, &dgram, ttl, df);
     150
    135151        free(dgram.data);
    136         async_answer_0(callid, ENOTSUP);
    137 }
    138 
    139 static void inet_set_proto(inet_client_t *client, ipc_callid_t callid,
     152        async_answer_0(callid, rc);
     153}
     154
     155static void inet_set_proto_srv(inet_client_t *client, ipc_callid_t callid,
    140156    ipc_call_t *call)
    141157{
     
    143159
    144160        proto = IPC_GET_ARG1(*call);
    145         log_msg(LVL_DEBUG, "inet_set_proto(%lu)", (unsigned long) proto);
     161        log_msg(LVL_DEBUG, "inet_set_proto_srv(%lu)", (unsigned long) proto);
    146162
    147163        if (proto > UINT8_MAX) {
     
    197213                switch (method) {
    198214                case INET_CALLBACK_CREATE:
    199                         inet_callback_create(&client, callid, &call);
     215                        inet_callback_create_srv(&client, callid, &call);
    200216                        break;
    201217                case INET_GET_SRCADDR:
    202                         inet_get_srcaddr(&client, callid, &call);
     218                        inet_get_srcaddr_srv(&client, callid, &call);
    203219                        break;
    204220                case INET_SEND:
    205                         inet_send(&client, callid, &call);
     221                        inet_send_srv(&client, callid, &call);
    206222                        break;
    207223                case INET_SET_PROTO:
    208                         inet_set_proto(&client, callid, &call);
     224                        inet_set_proto_srv(&client, callid, &call);
    209225                        break;
    210226                default:
  • uspace/srv/inet/inet.h

    rbc38578 rceba4bed  
    3939
    4040#include <adt/list.h>
     41#include <inet/iplink.h>
     42#include <ipc/loc.h>
    4143#include <sys/types.h>
    4244#include <async.h>
     
    4951} inet_client_t;
    5052
     53/** Host address */
    5154typedef struct {
    5255        uint32_t ipv4;
    5356} inet_addr_t;
     57
     58/** Network address */
     59typedef struct {
     60        /** Address */
     61        uint32_t ipv4;
     62        /** Number of valid bits in @c ipv4 */
     63        int bits;
     64} inet_naddr_t;
    5465
    5566typedef struct {
     
    6172} inet_dgram_t;
    6273
     74typedef struct {
     75        link_t link_list;
     76        service_id_t svc_id;
     77        char *svc_name;
     78        async_sess_t *sess;
     79        iplink_t *iplink;
     80} inet_link_t;
     81
     82typedef struct {
     83        link_t addr_list;
     84        inet_naddr_t naddr;
     85        inet_link_t *ilink;
     86} inet_addrobj_t;
     87
    6388extern int inet_ev_recv(inet_client_t *, inet_dgram_t *);
    6489
  • uspace/srv/inet/inet_link.c

    rbc38578 rceba4bed  
    4343#include <stdlib.h>
    4444
     45#include "addrobj.h"
     46#include "inet.h"
    4547#include "inet_link.h"
     48#include "pdu.h"
    4649
    4750static int inet_link_open(service_id_t sid);
    4851static int inet_iplink_recv(iplink_t *ilink, iplink_sdu_t *sdu);
    49 
    50 typedef struct {
    51         link_t link_list;
    52         service_id_t svc_id;
    53         char *svc_name;
    54         async_sess_t *sess;
    55         iplink_t *iplink;
    56 } inet_link_t;
    5752
    5853static iplink_ev_ops_t inet_iplink_ev_ops = {
     
    172167        list_append(&ilink->link_list, &inet_link_list);
    173168
     169        inet_addrobj_t *addr;
     170
     171        /* XXX For testing: set static IP address 192.168.0.4/24 */
     172        addr = inet_addrobj_new();
     173        addr->naddr.ipv4 = (192 << 24) + (168 << 16) + (0 << 8) + 4;
     174        addr->naddr.bits = 24;
     175        addr->ilink = ilink;
     176        inet_addrobj_add(addr);
     177
    174178        return EOK;
    175179
     
    198202}
    199203
     204/** Send datagram over Internet link */
     205int inet_link_send_dgram(inet_link_t *ilink, inet_addr_t *lsrc,
     206    inet_addr_t *ldest, inet_dgram_t *dgram, uint8_t ttl, int df)
     207{
     208        iplink_sdu_t sdu;
     209        int rc;
     210
     211        sdu.lsrc.ipv4 = lsrc->ipv4;
     212        sdu.ldest.ipv4 = ldest->ipv4;
     213        rc = inet_pdu_encode(dgram, &sdu.data, &sdu.size);
     214        if (rc != EOK)
     215                return rc;
     216
     217        rc = iplink_send(ilink->iplink, &sdu);
     218        free(sdu.data);
     219
     220        return rc;
     221}
     222
     223
    200224/** @}
    201225 */
  • uspace/srv/inet/inet_link.h

    rbc38578 rceba4bed  
    3838#define INET_LINK_H_
    3939
     40#include "inet.h"
     41
    4042extern int inet_link_discovery_start(void);
     43extern int inet_link_send_dgram(inet_link_t *, inet_addr_t *,
     44    inet_addr_t *, inet_dgram_t *, uint8_t, int);
    4145
    4246#endif
Note: See TracChangeset for help on using the changeset viewer.