Changeset 0ac2158 in mainline for uspace/srv/net/tl/tcp/sock.c


Ignore:
Timestamp:
2011-12-08T23:29:06Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d9e14fa4
Parents:
5f9ecd3
Message:

Determine local IP address, fill it in pseudo header.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/tl/tcp/sock.c

    r5f9ecd3 r0ac2158  
    3939#include <errno.h>
    4040#include <io/log.h>
     41#include <ip_client.h>
    4142#include <ipc/socket.h>
    4243#include <net/modules.h>
     
    106107
    107108        sock->client = client;
     109        sock->laddr.ipv4 = TCP_IPV4_ANY;
    108110
    109111        sock_id = SOCKET_GET_SOCKET_ID(call);
     
    211213        tcp_sockdata_t *socket;
    212214        tcp_error_t trc;
     215        tcp_sock_t lsocket;
    213216        tcp_sock_t fsocket;
    214         uint16_t lport;
     217        device_id_t dev_id;
     218        tcp_phdr_t *phdr;
     219        size_t phdr_len;
    215220
    216221        log_msg(LVL_DEBUG, "tcp_sock_connect()");
     
    243248        }
    244249
    245         lport = sock_core->port;
     250        if (socket->laddr.ipv4 == TCP_IPV4_ANY) {
     251                /* Find route to determine local IP address. */
     252                rc = ip_get_route_req(ip_sess, IPPROTO_TCP,
     253                    (struct sockaddr *)addr, sizeof(*addr), &dev_id,
     254                    (void **)&phdr, &phdr_len);
     255                if (rc != EOK) {
     256                        async_answer_0(callid, rc);
     257                        log_msg(LVL_DEBUG, "tcp_transmit_connect: Failed to find route.");
     258                        return;
     259                }
     260
     261                socket->laddr.ipv4 = uint32_t_be2host(phdr->src_addr);
     262                log_msg(LVL_DEBUG, "Local IP address is %x", socket->laddr.ipv4);
     263                free(phdr);
     264        }
     265
     266        lsocket.addr.ipv4 = socket->laddr.ipv4;
     267        lsocket.port = sock_core->port;
    246268        fsocket.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr);
    247269        fsocket.port = uint16_t_be2host(addr->sin_port);
    248270
    249         trc = tcp_uc_open(lport, &fsocket, ap_active, &socket->conn);
     271        trc = tcp_uc_open(&lsocket, &fsocket, ap_active, &socket->conn);
    250272
    251273        if (socket->conn != NULL)
     
    280302        tcp_sockdata_t *asocket;
    281303        tcp_error_t trc;
     304        tcp_sock_t lsocket;
    282305        tcp_sock_t fsocket;
    283306        tcp_conn_t *conn;
     
    305328        log_msg(LVL_DEBUG, " - open connection");
    306329
     330        lsocket.addr.ipv4 = TCP_IPV4_ANY;
     331        lsocket.port = sock_core->port;
    307332        fsocket.addr.ipv4 = TCP_IPV4_ANY;
    308333        fsocket.port = TCP_PORT_ANY;
    309334
    310         trc = tcp_uc_open(sock_core->port, &fsocket, ap_passive, &conn);
     335        trc = tcp_uc_open(&lsocket, &fsocket, ap_passive, &conn);
    311336        if (conn != NULL)
    312337                conn->name = (char *)"S";
Note: See TracChangeset for help on using the changeset viewer.