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

Changeset ecff3d9 in mainline


Ignore:
Timestamp:
2012-02-01T22:06:05Z (8 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
59157eb
Parents:
c76e926
Message:

Implement inet client IPC communication. Fix bug in inet_init().

Location:
uspace
Files:
4 edited

Legend:

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

    rc76e926 recff3d9  
    7575{
    7676        service_id_t inet_svc;
     77        int rc;
    7778
    7879        assert(inet_sess == NULL);
     
    8081        assert(inet_protocol == 0);
    8182
    82         inet_svc = loc_service_get_id(SERVICE_NAME_INET, &inet_svc,
     83        rc = loc_service_get_id(SERVICE_NAME_INET, &inet_svc,
    8384            IPC_FLAG_BLOCKING);
     85        if (rc != EOK)
     86                return ENOENT;
     87
    8488        inet_sess = loc_service_connect(EXCHANGE_SERIALIZE, inet_svc,
    8589            IPC_FLAG_BLOCKING);
     
    107111int inet_send(inet_dgram_t *dgram, uint8_t ttl, inet_df_t df)
    108112{
    109         return ENOTSUP;
     113        async_exch_t *exch = async_exchange_begin(inet_sess);
     114
     115        ipc_call_t answer;
     116        aid_t req = async_send_5(exch, INET_SEND, dgram->src.ipv4,
     117            dgram->dest.ipv4, dgram->tos, ttl, df, &answer);
     118        int rc = async_data_write_start(exch, dgram->data, dgram->size);
     119        async_exchange_end(exch);
     120
     121        if (rc != EOK) {
     122                async_wait_for(req, NULL);
     123                return rc;
     124        }
     125
     126        sysarg_t retval;
     127        async_wait_for(req, &retval);
     128        if (retval != EOK)
     129                return retval;
     130
     131        return EOK;
    110132}
    111133
    112134int inet_get_srcaddr(inet_addr_t *remote, uint8_t tos, inet_addr_t *local)
    113135{
    114         return ENOTSUP;
     136        sysarg_t local_addr;
     137        async_exch_t *exch = async_exchange_begin(inet_sess);
     138
     139        int rc = async_req_1_1(exch, INET_GET_SRCADDR, remote->ipv4,
     140            &local_addr);
     141        async_exchange_end(exch);
     142
     143        if (rc != EOK)
     144                return rc;
     145
     146        local->ipv4 = local_addr;
     147        return EOK;
    115148}
    116149
  • uspace/lib/c/include/ipc/inet.h

    rc76e926 recff3d9  
    4040typedef enum {
    4141        INET_CALLBACK_CREATE = IPC_FIRST_USER_METHOD,
     42        INET_GET_SRCADDR,
    4243        INET_SEND,
    4344        INET_SET_PROTO
  • uspace/srv/inet/inet.c

    rc76e926 recff3d9  
    4444#include <loc.h>
    4545#include <stdio.h>
     46#include <stdlib.h>
    4647#include <sys/types.h>
    4748
     
    99100}
    100101
     102static 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()");
     106
     107        async_answer_0(callid, ENOTSUP);
     108}
     109
    101110static void inet_send(inet_client_t *client, ipc_callid_t callid,
    102111    ipc_call_t *call)
    103112{
     113        uint32_t src_ipv4;
     114        uint32_t dest_ipv4;
     115        uint8_t tos;
     116        uint8_t ttl;
     117        int df;
     118        void *data;
     119        size_t size;
     120        int rc;
     121
    104122        log_msg(LVL_DEBUG, "inet_send()");
     123
     124        src_ipv4 = IPC_GET_ARG1(*call);
     125        dest_ipv4 = IPC_GET_ARG2(*call);
     126        tos = IPC_GET_ARG3(*call);
     127        ttl = IPC_GET_ARG4(*call);
     128        df = IPC_GET_ARG5(*call);
     129
     130        (void)src_ipv4;
     131        (void)dest_ipv4;
     132        (void)tos;
     133        (void)ttl;
     134        (void)df;
     135
     136        rc = async_data_write_accept(&data, false, 0, 0, 0, &size);
     137        if (rc != EOK) {
     138                async_answer_0(callid, rc);
     139                return;
     140        }
     141
     142        free(data);
    105143        async_answer_0(callid, ENOTSUP);
    106144}
     
    168206                        inet_callback_create(&client, callid, &call);
    169207                        break;
     208                case INET_GET_SRCADDR:
     209                        inet_get_srcaddr(&client, callid, &call);
     210                        break;
    170211                case INET_SEND:
    171212                        inet_send(&client, callid, &call);
     
    197238                return 1;
    198239
     240        printf(NAME ": Accepting connections.\n");
    199241        task_retval(0);
    200242        async_manager();
  • uspace/srv/tcp/tcp.c

    rc76e926 recff3d9  
    186186
    187187        rc = inet_init(42, &tcp_inet_ev_ops);
    188         if (rc != EOK)
     188        if (rc != EOK) {
     189                log_msg(LVL_ERROR, "Failed connecting to internet service.");
    189190                return ENOENT;
     191        }
    190192
    191193        rc = tcp_sock_init();
    192         if (rc != EOK)
     194        if (rc != EOK) {
     195                log_msg(LVL_ERROR, "Failed initializing socket service.");
    193196                return ENOENT;
     197        }
    194198
    195199        return EOK;
     
    208212        }
    209213
    210         tcp_init();
     214        rc = tcp_init();
     215        if (rc != EOK)
     216                return 1;
     217
     218        printf(NAME ": Accepting connections.\n");
    211219        task_retval(0);
    212220        async_manager();
Note: See TracChangeset for help on using the changeset viewer.