Browse Source

daemon: netaddr

Structure for a net address.  We can expand it later to cover exotic
address types (Tor?).

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 9 years ago
parent
commit
e4224f72d4
  1. 2
      daemon/Makefile
  2. 44
      daemon/netaddr.c
  3. 29
      daemon/netaddr.h
  4. 22
      daemon/peer.c
  5. 17
      daemon/peer.h

2
daemon/Makefile

@ -16,6 +16,7 @@ DAEMON_LIB_OBJS := $(DAEMON_LIB_SRC:.c=.o)
DAEMON_SRC := \
daemon/jsonrpc.c \
daemon/lightningd.c \
daemon/netaddr.c \
daemon/peer.c \
daemon/timeout.c
DAEMON_OBJS := $(DAEMON_SRC:.c=.o)
@ -32,6 +33,7 @@ DAEMON_HEADERS := \
daemon/jsonrpc.h \
daemon/lightningd.h \
daemon/log.h \
daemon/netaddr.h \
daemon/peer.h \
daemon/pseudorand.h \
daemon/timeout.h

44
daemon/netaddr.c

@ -0,0 +1,44 @@
#include "netaddr.h"
#include <arpa/inet.h>
#include <ccan/cast/cast.h>
#include <ccan/tal/str/str.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
void netaddr_to_addrinfo(struct addrinfo *ai, const struct netaddr *a)
{
ai->ai_flags = 0;
ai->ai_family = a->saddr.s.sa_family;
ai->ai_socktype = a->type;
ai->ai_protocol = a->protocol;
ai->ai_addrlen = a->addrlen;
ai->ai_addr = cast_const(struct sockaddr *, &a->saddr.s);
ai->ai_canonname = NULL;
ai->ai_next = NULL;
}
char *netaddr_name(const tal_t *ctx, const struct netaddr *a)
{
char name[INET6_ADDRSTRLEN];
const void *sockaddr;
uint16_t port;
switch (a->saddr.s.sa_family) {
case AF_INET:
sockaddr = &a->saddr.ipv4.sin_addr;
port = ntohs(a->saddr.ipv4.sin_port);
break;
case AF_INET6:
sockaddr = &a->saddr.ipv6.sin6_addr;
port = ntohs(a->saddr.ipv6.sin6_port);
break;
default:
return tal_fmt(ctx, "Unknown protocol %u", a->saddr.s.sa_family);
}
if (!inet_ntop(a->saddr.s.sa_family, sockaddr, name, sizeof(name)))
sprintf(name, "Unprintable-%u-address", a->saddr.s.sa_family);
return tal_fmt(ctx, "%s:%u", name, port);
}

29
daemon/netaddr.h

@ -0,0 +1,29 @@
#ifndef LIGHTNING_DAEMON_NETADDR_H
#define LIGHTNING_DAEMON_NETADDR_H
#include "config.h"
#include <ccan/tal/tal.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <sys/socket.h>
struct addrinfo;
/* This can be extended to support other protocols in future. */
struct netaddr {
int type; /* See socket(2): SOCK_STREAM currently */
int protocol; /* See socket(2): 0 currently */
socklen_t addrlen;
union {
struct sockaddr s;
struct sockaddr_in ipv4;
struct sockaddr_in6 ipv6;
} saddr;
};
/* Get the name for this netaddr. */
char *netaddr_name(const tal_t *ctx, const struct netaddr *a);
/* Create a addrinfo (as wanted by io_connect) for this address. */
void netaddr_to_addrinfo(struct addrinfo *ai, const struct netaddr *a);
#endif /* LIGHTNING_DAEMON_NETADDR_H */

22
daemon/peer.c

@ -1,7 +1,6 @@
#include "lightningd.h"
#include "log.h"
#include "peer.h"
#include <arpa/inet.h>
#include <ccan/io/io.h>
#include <ccan/noerr/noerr.h>
#include <ccan/short_types/short_types.h>
@ -13,18 +12,6 @@
#include <sys/socket.h>
#include <sys/types.h>
static u16 get_port(const struct netaddr *addr)
{
switch (addr->saddr.s.sa_family) {
case AF_INET:
return ntohs(addr->saddr.ipv4.sin_port);
case AF_INET6:
return ntohs(addr->saddr.ipv6.sin6_port);
default:
abort();
}
}
static void destroy_peer(struct peer *peer)
{
list_del_from(&peer->state->peers, &peer->list);
@ -36,7 +23,6 @@ static struct peer *new_peer(struct lightningd_state *state,
const char *in_or_out)
{
struct peer *peer = tal(state, struct peer);
char name[INET6_ADDRSTRLEN];
/* FIXME: Stop listening if too many peers? */
list_add(&state->peers, &peer->list);
@ -57,13 +43,9 @@ static struct peer *new_peer(struct lightningd_state *state,
return tal_free(peer);
}
if (!inet_ntop(peer->addr.saddr.s.sa_family, &peer->addr.saddr,
name, sizeof(name)))
strcpy(name, "UNCONVERTABLE-ADDR");
peer->log = new_log(peer, state->log_record, "%s-%s:%s:%u",
peer->log = new_log(peer, state->log_record, "%s%s:%s:",
log_prefix(state->base_log), in_or_out,
name, get_port(&peer->addr));
netaddr_name(peer, &peer->addr));
return peer;
}

17
daemon/peer.h

@ -1,23 +1,8 @@
#ifndef LIGHTNING_DAEMON_PEER_H
#define LIGHTNING_DAEMON_PEER_H
#include "config.h"
#include "netaddr.h"
#include <ccan/list/list.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <sys/socket.h>
#include <sys/socket.h>
/* This can be extended to support other protocols in future. */
struct netaddr {
int type; /* See socket(2): SOCK_STREAM currently */
int protocol; /* See socket(2): 0 currently */
socklen_t addrlen;
union {
struct sockaddr s;
struct sockaddr_in ipv4;
struct sockaddr_in6 ipv6;
} saddr;
};
struct peer {
/* state->peers list */

Loading…
Cancel
Save