Statistics
| Branch: | Revision:

iof-bird / bird-2.0.1 / proto / rpki / tcp_transport.c @ 6b3f1a54

History | View | Annotate | Download (1.63 KB)

1
/*
2
 *        BIRD -- An implementation of the TCP protocol for the RPKI protocol transport
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 <errno.h>
13
#include <netdb.h>
14
#include <stdio.h>
15
#include <stdlib.h>
16
#include <string.h>
17
#include <sys/socket.h>
18
#include <sys/types.h>
19
#include <unistd.h>
20

    
21
#include "rpki.h"
22
#include "sysdep/unix/unix.h"
23

    
24
static int
25
rpki_tr_tcp_open(struct rpki_tr_sock *tr)
26
{
27
  sock *sk = tr->sk;
28

    
29
  sk->type = SK_TCP_ACTIVE;
30

    
31
  if (sk_open(sk) != 0)
32
    return RPKI_TR_ERROR;
33

    
34
  return RPKI_TR_SUCCESS;
35
}
36

    
37
static const char *
38
rpki_tr_tcp_ident(struct rpki_tr_sock *tr)
39
{
40
  struct rpki_cache *cache = tr->cache;
41
  struct rpki_config *cf = (void *) cache->p->p.cf;
42

    
43
  if (tr->ident != NULL)
44
    return tr->ident;
45

    
46
  const char *host = cf->hostname;
47
  ip_addr ip = cf->ip;
48
  u16 port = cf->port;
49

    
50
  size_t colon_and_port_len = 6; /* max ":65535" */
51
  size_t ident_len;
52
  if (host)
53
    ident_len = strlen(host) + colon_and_port_len + 1;
54
  else
55
    ident_len = IPA_MAX_TEXT_LENGTH + colon_and_port_len + 1;
56

    
57
  char *ident = mb_alloc(cache->pool, ident_len);
58
  if (host)
59
    bsnprintf(ident, ident_len, "%s:%u", host, port);
60
  else
61
    bsnprintf(ident, ident_len, "%I:%u", ip, port);
62

    
63
  tr->ident = ident;
64
  return tr->ident;
65
}
66

    
67
/**
68
 * rpki_tr_tcp_init - initializes the RPKI transport structure for a TCP connection
69
 * @tr: allocated RPKI transport structure
70
 */
71
void
72
rpki_tr_tcp_init(struct rpki_tr_sock *tr)
73
{
74
  tr->open_fp = &rpki_tr_tcp_open;
75
  tr->ident_fp = &rpki_tr_tcp_ident;
76
}