Annotation of embedaddon/bird2/proto/rpki/transport.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *     BIRD -- The Resource Public Key Infrastructure (RPKI) to Router Protocol
                      3:  *
                      4:  *     (c) 2015 CZ.NIC
                      5:  *     (c) 2015 Pavel Tvrdik <pawel.tvrdik@gmail.com>
                      6:  *
                      7:  *     This file was a part of RTRlib: http://rpki.realmv6.org/
                      8:  *
                      9:  *     Can be freely distributed and used under the terms of the GNU GPL.
                     10:  */
                     11: 
                     12: #include <sys/socket.h>
                     13: #include <netdb.h>
                     14: 
                     15: #include "rpki.h"
                     16: #include "transport.h"
                     17: #include "sysdep/unix/unix.h"
                     18: 
                     19: /**
                     20:  * rpki_hostname_autoresolv - auto-resolve an IP address from a hostname
                     21:  * @host: domain name of host, e.g. "rpki-validator.realmv6.org"
                     22:  *
                     23:  * This function resolves an IP address from a hostname.
                     24:  * Returns &ip_addr structure with IP address or |IPA_NONE|.
                     25:  */
                     26: static ip_addr
                     27: rpki_hostname_autoresolv(const char *host)
                     28: {
                     29:   ip_addr addr = {};
                     30:   struct addrinfo *res;
                     31:   struct addrinfo hints = {
                     32:       .ai_family = AF_UNSPEC,
                     33:       .ai_socktype = SOCK_STREAM,
                     34:       .ai_flags = AI_ADDRCONFIG,
                     35:   };
                     36: 
                     37:   if (!host)
                     38:     return IPA_NONE;
                     39: 
                     40:   int err_code = getaddrinfo(host, NULL, &hints, &res);
                     41:   if (err_code != 0)
                     42:   {
                     43:     log(L_DEBUG "getaddrinfo failed: %s", gai_strerror(err_code));
                     44:     return IPA_NONE;
                     45:   }
                     46: 
                     47:   sockaddr sa = {
                     48:       .sa = *res->ai_addr,
                     49:   };
                     50: 
                     51:   uint unused;
                     52:   sockaddr_read(&sa, res->ai_family, &addr, NULL, &unused);
                     53: 
                     54:   freeaddrinfo(res);
                     55:   return addr;
                     56: }
                     57: 
                     58: /**
                     59:  * rpki_tr_open - prepare and open a socket connection
                     60:  * @tr: initialized transport socket
                     61:  *
                     62:  * Prepare and open a socket connection specified by @tr that must be initialized before.
                     63:  * This function ends with a calling the sk_open() function.
                     64:  * Returns RPKI_TR_SUCCESS or RPKI_TR_ERROR.
                     65:  */
                     66: int
                     67: rpki_tr_open(struct rpki_tr_sock *tr)
                     68: {
                     69:   struct rpki_cache *cache = tr->cache;
                     70:   struct rpki_config *cf = (void *) cache->p->p.cf;
                     71: 
                     72:   ASSERT(tr->sk == NULL);
                     73:   tr->sk = sk_new(cache->pool);
                     74:   sock *sk = tr->sk;
                     75: 
                     76:   /* sk->type -1 is invalid value, a correct value MUST be set in the specific transport layer in open_fp() hook */
                     77:   sk->type = -1;
                     78: 
                     79:   sk->tx_hook = rpki_connected_hook;
                     80:   sk->err_hook = rpki_err_hook;
                     81:   sk->data = cache;
                     82:   sk->daddr = cf->ip;
                     83:   sk->dport = cf->port;
                     84:   sk->host = cf->hostname;
                     85:   sk->rbsize = RPKI_RX_BUFFER_SIZE;
                     86:   sk->tbsize = RPKI_TX_BUFFER_SIZE;
                     87:   sk->tos = IP_PREC_INTERNET_CONTROL;
                     88: 
                     89:   if (ipa_zero2(sk->daddr) && sk->host)
                     90:   {
                     91:     sk->daddr = rpki_hostname_autoresolv(sk->host);
                     92:     if (ipa_zero(sk->daddr))
                     93:     {
                     94:       CACHE_TRACE(D_EVENTS, cache, "Cannot resolve the hostname '%s'", sk->host);
                     95:       return RPKI_TR_ERROR;
                     96:     }
                     97:   }
                     98: 
                     99:   return tr->open_fp(tr);
                    100: }
                    101: 
                    102: /**
                    103:  * rpki_tr_close - close socket and prepare it for possible next open
                    104:  * @tr: successfully opened transport socket
                    105:  *
                    106:  * Close socket and free resources.
                    107:  */
                    108: void
                    109: rpki_tr_close(struct rpki_tr_sock *tr)
                    110: {
                    111:   if (tr->ident)
                    112:   {
                    113:     mb_free((char *) tr->ident);
                    114:     tr->ident = NULL;
                    115:   }
                    116: 
                    117:   if (tr->sk)
                    118:   {
                    119:     rfree(tr->sk);
                    120:     tr->sk = NULL;
                    121:   }
                    122: }
                    123: 
                    124: /**
                    125:  * rpki_tr_ident - Returns a string identifier for the rpki transport socket
                    126:  * @tr: successfully opened transport socket
                    127:  *
                    128:  * Returns a \0 terminated string identifier for the socket endpoint, e.g. "<host>:<port>".
                    129:  * Memory is allocated inside @tr structure.
                    130:  */
                    131: inline const char *
                    132: rpki_tr_ident(struct rpki_tr_sock *tr)
                    133: {
                    134:   return tr->ident_fp(tr);
                    135: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>