Update relayd to 5.0.20110907

FreeBSD port is now developed at https://github.com/mmatuska/relayd
This commit is contained in:
Martin Matuska 2011-09-07 12:14:40 +00:00
parent 4075117e52
commit b6ec62db23
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=281379
28 changed files with 14 additions and 2074 deletions

View File

@ -5,10 +5,11 @@
# $FreeBSD$
PORTNAME= relayd
PORTVERSION= 4.9.20110526
PORTREVISION= 2
PORTVERSION= 5.0.20110907
CATEGORIES= net
MASTER_SITES= ${MASTER_SITE_LOCAL}
MASTER_SITES= https://github.com/downloads/mmatuska/relayd/
FETCH_ARGS= -pRr
MASTER_SITE_SUBDIR= mm
MAINTAINER= mm@FreeBSD.org
@ -48,12 +49,6 @@ MAKE_ARGS+= LIBEVENT=-levent
BROKEN= does not build on FreeBSD 7.X
.endif
post-extract:
@${CP} ${FILESDIR}/Makefile.all ${WRKSRC}/Makefile
@${CP} ${FILESDIR}/Makefile.relayctl ${WRKSRC}/relayctl/Makefile
@${CP} ${FILESDIR}/Makefile.relayd ${WRKSRC}/relayd/Makefile
@${CP} ${FILESDIR}/arc4random.c ${WRKSRC}/relayd
post-patch:
@${REINPLACE_CMD} -e 's|%%PREFIX%%|${PREFIX}|g' \
${WRKSRC}/relayd/relay.c \
@ -64,5 +59,7 @@ post-patch:
post-install:
@${INSTALL_DATA} ${WRKSRC}/../etc/relayd.conf \
${PREFIX}/etc/relayd.conf.sample
@${CP} -n ${PREFIX}/etc/relayd.conf.sample \
${PREFIX}/etc/relayd.conf
.include <bsd.port.post.mk>

View File

@ -1,2 +1,2 @@
SHA256 (relayd-4.9.20110526.tar.bz2) = d9ce490b6bb2c82ed879b4e1c047977ffef49b530680c5816b05e1a04969411f
SIZE (relayd-4.9.20110526.tar.bz2) = 85883
SHA256 (relayd-5.0.20110907.tar.bz2) = bba3aa1e427031f74fa617616532b6c607b273d11278a06fad9e37aecb43f220
SIZE (relayd-5.0.20110907.tar.bz2) = 86032

View File

@ -1,5 +0,0 @@
# $FreeBSD$
SUBDIR= relayd relayctl
.include <bsd.subdir.mk>

View File

@ -1,24 +0,0 @@
# $FreeBSD$
PROG= relayctl
.PATH: ${.CURDIR}/../../lib/libutil
SRCS= imsg-buffer.c \
imsg.c
.PATH: ${.CURDIR}/../relayd
SRCS+= log.c
.PATH: ${.CURDIR}
SRCS+= relayctl.c \
parser.c
MAN= relayctl.8
CFLAGS+= -D__dead=''
CFLAGS+= -I${.CURDIR} \
-I${.CURDIR}/../../lib/libutil \
-I${.CURDIR}/../relayd \
-I${PREFIX}/include
.include <bsd.prog.mk>

View File

@ -1,44 +0,0 @@
# $FreeBSD$
PROG= relayd
MAN= relayd.8 \
relayd.conf.5
.PATH: ${.CURDIR}/../../lib/libutil
SRCS= imsg-buffer.c \
imsg.c
.PATH: ${.CURDIR}
SRCS+= parse.y \
log.c \
control.c \
ssl.c \
ssl_privsep.c \
relayd.c \
pfe.c \
pfe_filter.c \
hce.c \
relay.c \
relay_udp.c \
check_icmp.c \
check_tcp.c \
check_script.c \
name2id.c \
arc4random.c \
shuffle.c \
proc.c \
config.c
CFLAGS+= -DSHA1_DIGEST_LENGTH=SHA_DIGEST_LENGTH \
-DSHA1_DIGEST_STRING_LENGTH=SHA_DIGEST_LENGTH \
-DOPENSSL_NO_SHA -DOPENSSL_NO_MD5 \
-D__dead=''
CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../../lib/libutil \
-I${PREFIX}/include
CLEANFILES+= y.tab.h
LDADD= -lmd -L${PREFIX}/lib ${LIBEVENT} -lssl -lcrypto
DPADD= ${LIBEVENT} ${LIBSSL} ${LIBCRYPTO}
.include <bsd.prog.mk>

View File

@ -1,72 +0,0 @@
/*
* Copyright (c) 1999,2000,2004 Damien Miller <djm@mindrot.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* $FreeBSD: /tmp/pcvs/ports/net/relayd/files/Attic/arc4random.c,v 1.1 2010-05-28 11:59:49 mm Exp $
*/
#include <sys/param.h>
#if __FreeBSD_version < 800041
#include <sys/types.h>
#include <limits.h>
#include <stdlib.h>
/*
* Calculate a uniformly distributed random number less than upper_bound
* avoiding "modulo bias".
*
* Uniformity is achieved by generating new random numbers until the one
* returned is outside the range [0, 2**32 % upper_bound). This
* guarantees the selected random number will be inside
* [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound)
* after reduction modulo upper_bound.
*/
u_int32_t
arc4random_uniform(u_int32_t upper_bound)
{
u_int32_t r, min;
if (upper_bound < 2)
return 0;
#if (ULONG_MAX > 0xffffffffUL)
min = 0x100000000UL % upper_bound;
#else
/* Calculate (2**32 % upper_bound) avoiding 64-bit math */
if (upper_bound > 0x80000000)
min = 1 + ~upper_bound; /* 2**32 - upper_bound */
else {
/* (2**32 - (x * 2)) % x == 2**32 % x when x <= 2**31 */
min = ((0xffffffff - (upper_bound * 2)) + 1) % upper_bound;
}
#endif
/*
* This could theoretically loop forever but each retry has
* p > 0.5 (worst case, usually far better) of selecting a
* number inside the range we need, so it should rarely need
* to re-roll.
*/
for (;;) {
r = arc4random();
if (r >= min)
break;
}
return r % upper_bound;
}
#endif /* __FreeBSD_version */

View File

@ -1,20 +0,0 @@
--- relayd/check_tcp.c.orig Sat Jun 4 08:59:06 2011
+++ relayd/check_tcp.c Sat Jun 4 09:07:17 2011
@@ -77,6 +77,8 @@
goto bad;
}
+ cte->s = s;
+
bzero(&lng, sizeof(lng));
if (setsockopt(s, SOL_SOCKET, SO_LINGER, &lng, sizeof(lng)) == -1)
goto bad;
@@ -100,7 +102,6 @@
cte->buf = NULL;
cte->host->up = HOST_UP;
- cte->s = s;
event_del(&cte->ev);
event_set(&cte->ev, s, EV_TIMEOUT|EV_WRITE, tcp_write, cte);
event_add(&cte->ev, &tv);

View File

@ -1,41 +0,0 @@
--- relayd/hce.c.orig Mon Jun 6 18:02:45 2011
+++ relayd/hce.c Mon Jun 6 18:09:07 2011
@@ -207,10 +207,27 @@
struct timeval tv_now, tv_dur;
u_long duration;
u_int logopt;
- struct host *h;
+ struct host *h, *hostupd;
int hostup;
const char *msg;
+ if ((hostupd = host_find(env, host->conf.id)) == NULL)
+ fatalx("hce_notify_done: desynchronized");
+
+ if ((table = table_find(env, host->conf.tableid)) == NULL)
+ fatalx("hce_notify_done: invalid table id");
+
+ if (hostupd->flags & F_DISABLE) {
+ if (env->sc_opts & RELAYD_OPT_LOGUPDATE) {
+ log_info("host %s, check %s%s (ignoring result, "
+ "host disabled)",
+ host->conf.name, table_check(table->conf.check),
+ (table->conf.flags & F_SSL) ? " use ssl" : "");
+ }
+ host->flags |= (F_CHECK_SENT|F_CHECK_DONE);
+ return;
+ }
+
hostup = host->up;
host->he = he;
@@ -250,9 +267,6 @@
duration = (tv_dur.tv_sec * 1000) + (tv_dur.tv_usec / 1000.0);
else
duration = 0;
-
- if ((table = table_find(env, host->conf.tableid)) == NULL)
- fatalx("hce_notify_done: invalid table id");
if (env->sc_opts & logopt) {
log_info("host %s, check %s%s (%lums), state %s -> %s, "

View File

@ -1,24 +0,0 @@
--- relayctl/parser.c.orig 2011-05-19 10:56:49.000000000 +0200
+++ relayctl/parser.c 2011-05-22 10:51:26.683383150 +0200
@@ -18,7 +18,11 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#else
#include <sys/types.h>
+#endif
#include <sys/socket.h>
#include <sys/queue.h>
@@ -87,7 +91,9 @@
{KEYWORD, "hosts", SHOW_HOSTS, NULL},
{KEYWORD, "redirects", SHOW_RDRS, NULL},
{KEYWORD, "relays", SHOW_RELAYS, NULL},
+#ifndef __FreeBSD__
{KEYWORD, "routers", SHOW_ROUTERS, NULL},
+#endif
{KEYWORD, "sessions", SHOW_SESSIONS, NULL},
{ENDTOKEN, "", NONE, NULL}
};

View File

@ -1,12 +0,0 @@
--- relayctl/parser.h.orig 2011-05-22 10:56:33.769045780 +0200
+++ relayctl/parser.h 2011-05-22 10:56:46.122442873 +0200
@@ -23,7 +23,9 @@
SHOW_RDRS,
SHOW_RELAYS,
SHOW_SESSIONS,
+#ifndef __FreeBSD__
SHOW_ROUTERS,
+#endif
RDR_DISABLE,
RDR_ENABLE,
TABLE_DISABLE,

View File

@ -1,17 +0,0 @@
--- relayctl/relayctl.8.orig 2011-05-19 10:56:49.000000000 +0200
+++ relayctl/relayctl.8 2011-05-22 10:43:42.420854658 +0200
@@ -78,13 +78,10 @@
Show detailed status of relays including the current and average
access statistics.
The statistics will be updated every minute.
-.It Cm show routers
-Show detailed status of routers including the configured network
-routes.
.It Cm show sessions
Dump the complete list of running relay sessions.
.It Cm show summary
-Display a list of all relays, redirections, routers, tables, and hosts.
+Display a list of all relays, redirections, tables, and hosts.
.It Cm table disable Op Ar name | id
Disable a table.
Consider all hosts disabled.

View File

@ -1,83 +0,0 @@
--- relayctl/relayctl.c.orig 2011-05-20 11:43:53.000000000 +0200
+++ relayctl/relayctl.c 2011-05-22 11:19:50.925707539 +0200
@@ -20,6 +20,9 @@
*/
#include <sys/types.h>
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#endif
#include <sys/socket.h>
#include <sys/queue.h>
#include <sys/un.h>
@@ -141,7 +144,9 @@
case SHOW_HOSTS:
case SHOW_RDRS:
case SHOW_RELAYS:
+#ifndef __FreeBSD__
case SHOW_ROUTERS:
+#endif
imsg_compose(ibuf, IMSG_CTL_SHOW_SUM, 0, 0, -1, NULL, 0);
printf("%-4s\t%-8s\t%-24s\t%-7s\tStatus\n",
"Id", "Type", "Name", "Avlblty");
@@ -222,7 +227,9 @@
case SHOW_HOSTS:
case SHOW_RDRS:
case SHOW_RELAYS:
+#ifndef __FreeBSD__
case SHOW_ROUTERS:
+#endif
done = show_summary_msg(&imsg, res->action);
break;
case SHOW_SESSIONS:
@@ -312,7 +319,11 @@
imn = monitor_lookup(imsg->hdr.type);
printf("%s: imsg type %u len %u peerid %u pid %d\n", imn->name,
imsg->hdr.type, imsg->hdr.len, imsg->hdr.peerid, imsg->hdr.pid);
+#ifdef __FreeBSD__
+ printf("\ttimestamp: %lu, %s", (unsigned long)now, ctime(&now));
+#else
printf("\ttimestamp: %u, %s", now, ctime(&now));
+#endif
if (imn->type == -1)
done = 1;
if (imn->func != NULL)
@@ -328,8 +339,10 @@
struct table *table;
struct host *host;
struct relay *rlay;
+#ifndef __FreeBSD__
struct router *rt;
struct netroute *nr;
+#endif
struct ctl_stats stats[RELAY_MAXPROC];
char name[MAXHOSTNAMELEN];
@@ -394,6 +407,7 @@
bcopy(imsg->data, &stats, sizeof(stats));
print_statistics(stats);
break;
+#ifndef __FreeBSD__
case IMSG_CTL_ROUTER:
if (!(type == SHOW_SUM || type == SHOW_ROUTERS))
break;
@@ -416,6 +430,7 @@
printf("\t%8s\troute: %s/%d\n",
"", name, nr->nr_conf.prefixlen);
break;
+#endif
case IMSG_CTL_END:
return (1);
default:
@@ -557,7 +572,11 @@
printf("\t%8s\ttotal: %llu sessions\n"
"\t%8s\tlast: %u/%us %u/h %u/d sessions\n"
"\t%8s\taverage: %u/%us %u/h %u/d sessions\n",
+#ifdef __FreeBSD__
+ "", (long long unsigned)crs.cnt,
+#else
"", crs.cnt,
+#endif
"", crs.last, crs.interval,
crs.last_hour, crs.last_day,
"", crs.avg, crs.interval,

View File

@ -1,10 +0,0 @@
--- relayd.orig/carp.c 2011-05-22 01:06:39.463154237 +0200
+++ relayd/carp.c 2011-05-22 01:06:54.671017027 +0200
@@ -19,6 +19,7 @@
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
+#include <sys/queue.h>
#include <net/if.h>

View File

@ -1,59 +0,0 @@
--- relayd.orig/check_tcp.c 2011-05-22 01:06:39.463154237 +0200
+++ relayd/check_tcp.c 2011-05-22 01:06:54.673025092 +0200
@@ -31,7 +31,7 @@
#include <stdlib.h>
#include <errno.h>
#include <fnmatch.h>
-#include <sha1.h>
+#include <sha.h>
#include <openssl/ssl.h>
@@ -287,7 +287,11 @@
if (b == NULL)
fatal("out of memory");
*b = '\0';
+#ifndef __FreeBSD__
if (fnmatch(cte->table->conf.exbuf, cte->buf->buf, 0) == 0) {
+#else
+ if (fnmatch(cte->table->conf.exbuf, (char *)cte->buf->buf, 0) == 0) {
+#endif
cte->host->he = HCE_SEND_EXPECT_OK;
cte->host->up = HOST_UP;
return (0);
@@ -320,7 +324,11 @@
fatal("out of memory");
*b = '\0';
+#ifndef __FreeBSD__
head = cte->buf->buf;
+#else
+ head = (char *)cte->buf->buf;
+#endif
host = cte->host;
host->he = HCE_HTTP_CODE_ERROR;
@@ -372,7 +380,11 @@
fatal("out of memory");
*b = '\0';
+#ifndef __FreeBSD__
head = cte->buf->buf;
+#else
+ head = (char *)cte->buf->buf;
+#endif
host = cte->host;
host->he = HCE_HTTP_DIGEST_ERROR;
@@ -384,7 +396,11 @@
}
head += strlen("\r\n\r\n");
+#ifndef __FreeBSD__
digeststr(cte->table->conf.digest_type, head, strlen(head), digest);
+#else
+ digeststr(cte->table->conf.digest_type, (u_int8_t*)head, strlen(head), digest);
+#endif
if (strcmp(cte->table->conf.digest, digest)) {
log_warnx("%s: %s failed (wrong digest)",

View File

@ -1,62 +0,0 @@
--- relayd.orig/config.c 2011-05-22 01:06:39.463154237 +0200
+++ relayd/config.c 2011-05-22 01:18:41.041076104 +0200
@@ -118,6 +118,7 @@
RB_INIT(&env->sc_proto_default.request_tree);
RB_INIT(&env->sc_proto_default.response_tree);
}
+#ifndef __FreeBSD__
if (what & CONFIG_RTS) {
if ((env->sc_rts =
calloc(1, sizeof(*env->sc_rts))) == NULL)
@@ -130,7 +131,7 @@
return (-1);
TAILQ_INIT(env->sc_routes);
}
-
+#endif
return (0);
}
@@ -143,8 +144,10 @@
struct address *virt;
struct protocol *proto;
struct relay *rlay;
+#ifndef __FreeBSD__
struct netroute *nr;
struct router *rt;
+#endif
u_int what;
what = ps->ps_what[privsep_process] & reset;
@@ -181,6 +184,7 @@
}
env->sc_protocount = 0;
}
+#ifndef __FreeBSD__
if (what & CONFIG_RTS && env->sc_rts != NULL) {
while ((rt = TAILQ_FIRST(env->sc_rts)) != NULL) {
TAILQ_REMOVE(env->sc_rts, rt, rt_entry);
@@ -203,6 +207,7 @@
}
env->sc_routecount = 0;
}
+#endif
}
int
@@ -476,6 +481,7 @@
return (0);
}
+#ifndef __FreeBSD__
int
config_setrt(struct relayd *env, struct router *rt)
{
@@ -570,6 +576,7 @@
return (0);
}
+#endif
int
config_setproto(struct relayd *env, struct protocol *proto)

View File

@ -1,35 +0,0 @@
--- relayd.orig/hce.c 2011-05-22 01:06:39.461146172 +0200
+++ relayd/hce.c 2011-05-22 01:08:01.230992828 +0200
@@ -80,7 +80,9 @@
/* Allow maximum available sockets for TCP checks */
socket_rlimit(-1);
+#ifndef __FreeBSD__
snmp_init(env, PROC_PARENT);
+#endif
}
void
@@ -263,8 +265,10 @@
print_availability(host->check_cnt, host->up_cnt));
}
+#ifndef __FreeBSD__
if (host->last_up != host->up)
snmp_hosttrap(env, table, host);
+#endif
host->last_up = host->up;
@@ -350,9 +354,11 @@
case IMSG_CFG_HOST:
config_gethost(env, imsg);
break;
+#ifndef __FreeBSD__
case IMSG_SNMPSOCK:
snmp_getsock(env, imsg);
break;
+#endif
case IMSG_CFG_DONE:
config_getcfg(env, imsg);
hce_setup_events();

View File

@ -1,14 +0,0 @@
--- relayd.orig/log.c 2011-05-22 01:06:39.461146172 +0200
+++ relayd/log.c 2011-05-22 01:06:54.680052759 +0200
@@ -16,7 +16,11 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#else
#include <sys/types.h>
+#endif
#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/tree.h>

View File

@ -1,249 +0,0 @@
--- relayd.orig/parse.y 2011-05-22 01:06:39.462150204 +0200
+++ relayd/parse.y 2011-05-22 01:06:54.687080706 +0200
@@ -35,7 +35,7 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
-#include <net/route.h>
+// FreeBSD #include <net/route.h>
#include <ctype.h>
#include <unistd.h>
@@ -93,8 +93,10 @@
objid_t last_host_id = 0;
objid_t last_relay_id = 0;
objid_t last_proto_id = 0;
+/* FreeBSD exclude
objid_t last_rt_id = 0;
objid_t last_nr_id = 0;
+*/
static struct rdr *rdr = NULL;
static struct table *table = NULL;
@@ -103,7 +105,9 @@
struct relaylist relays;
static struct protocol *proto = NULL;
static struct protonode node;
+/* FreeBSD exclude
static struct router *router = NULL;
+*/
static u_int16_t label = 0;
static in_port_t tableport = 0;
static int nodedirection;
@@ -148,12 +152,20 @@
%token CIPHERS CODE COOKIE DEMOTE DIGEST DISABLE ERROR EXPECT
%token EXTERNAL FILENAME FILTER FORWARD FROM HASH HEADER HOST ICMP
%token INCLUDE INET INET6 INTERFACE INTERVAL IP LABEL LISTEN
-%token LOADBALANCE LOG LOOKUP MARK MARKED MODE NAT NO DESTINATION
-%token NODELAY NOTHING ON PARENT PATH PORT PREFORK PRIORITY PROTO
+// FreeBSD exclude %token LOADBALANCE LOG LOOKUP MARK MARKED MODE NAT NO DESTINATION
+%token LOADBALANCE LOG LOOKUP MARK MARKED MODE NAT NO
+// FreeBSD exclude %token NODELAY NOTHING ON PARENT PATH PORT PREFORK PRIORITY PROTO
+%token NODELAY NOTHING ON PARENT PATH PORT PREFORK PROTO
%token QUERYSTR REAL REDIRECT RELAY REMOVE REQUEST RESPONSE RETRY
%token RETURN ROUNDROBIN ROUTE SACK SCRIPT SEND SESSION SOCKET SPLICE
+/* FreeBSD exclude
%token SSL STICKYADDR STYLE TABLE TAG TCP TIMEOUT TO ROUTER RTLABEL
%token TRANSPARENT TRAP UPDATES URL VIRTUAL WITH TTL RTABLE MATCH
+*/
+// Start FreeBSD include
+%token SSL STICKYADDR STYLE TABLE TAG TCP TIMEOUT TO
+%token TRANSPARENT TRAP UPDATES URL VIRTUAL WITH TTL
+// End FreeBSD include
%token <v.string> STRING
%token <v.number> NUMBER
%type <v.string> hostname interface table
@@ -179,7 +191,7 @@
| grammar tabledef '\n'
| grammar relay '\n'
| grammar proto '\n'
- | grammar router '\n'
+// FreeBSD | grammar router '\n'
| grammar error '\n' { file->errors++; }
;
@@ -363,6 +375,7 @@
}
conf->sc_prefork_relay = $2;
}
+/* FreeBSD exclude
| DEMOTE STRING {
if (loadcfg)
break;
@@ -386,6 +399,7 @@
break;
conf->sc_flags |= F_TRAP;
}
+*/
;
loglevel : UPDATES { $$ = RELAYD_OPT_LOGUPDATE; }
@@ -658,6 +672,7 @@
bcopy(&$2, &table->conf.timeout,
sizeof(struct timeval));
}
+/* FreeBSD exclude
| DEMOTE STRING {
table->conf.flags |= F_DEMOTE;
if (strlcpy(table->conf.demote_group, $2,
@@ -675,6 +690,7 @@
YYERROR;
}
}
+*/
| INTERVAL NUMBER {
if ($2 < conf->sc_interval.tv_sec ||
$2 % conf->sc_interval.tv_sec) {
@@ -1261,6 +1277,8 @@
rlay->rl_conf.name);
YYERROR;
}
+ if ((rlay->rl_conf.flags & F_NATLOOK) == 0 &&
+/* FreeBSD exclude
if ((rlay->rl_conf.flags & (F_NATLOOK|F_DIVERT)) ==
(F_NATLOOK|F_DIVERT)) {
yyerror("relay %s with conflicting nat lookup "
@@ -1268,6 +1286,7 @@
YYERROR;
}
if ((rlay->rl_conf.flags & (F_NATLOOK|F_DIVERT)) == 0 &&
+*/
rlay->rl_conf.dstss.ss_family == AF_UNSPEC &&
rlay->rl_conf.dsttable == EMPTY_ID) {
yyerror("relay %s has no target, rdr, "
@@ -1430,11 +1449,13 @@
rlay->rl_conf.flags |= F_NATLOOK;
rlay->rl_conf.dstretry = $3;
}
+/* FreeBSD exclude
| DESTINATION retry {
conf->sc_flags |= F_NEEDPF;
rlay->rl_conf.flags |= F_DIVERT;
rlay->rl_conf.dstretry = $2;
}
+*/
| tablespec {
if (rlay->rl_backuptable) {
yyerror("only one backup table is allowed");
@@ -1459,6 +1480,7 @@
| HASH { $$ = RELAY_DSTMODE_HASH; }
;
+/* FreeBSD exclude
router : ROUTER STRING {
struct router *rt = NULL;
@@ -1594,7 +1616,7 @@
| DISABLE { rlay->rl_conf.flags |= F_DISABLE; }
| include
;
-
+*/
dstaf : /* empty */ {
rlay->rl_conf.dstaf.ss_family = AF_UNSPEC;
}
@@ -1670,6 +1692,7 @@
}
hst->conf.parentid = $2;
}
+/* FreeBSD exclude
| PRIORITY NUMBER {
if (hst->conf.priority) {
yyerror("priority already set");
@@ -1681,6 +1704,7 @@
}
hst->conf.priority = $2;
}
+*/
| IP TTL NUMBER {
if (hst->conf.ttl) {
yyerror("ttl value already set");
@@ -1794,8 +1818,10 @@
{ "ciphers", CIPHERS },
{ "code", CODE },
{ "cookie", COOKIE },
+/* FreeBSD exclude
{ "demote", DEMOTE },
{ "destination", DESTINATION },
+*/
{ "digest", DIGEST },
{ "disable", DISABLE },
{ "error", ERROR },
@@ -1833,7 +1859,7 @@
{ "path", PATH },
{ "port", PORT },
{ "prefork", PREFORK },
- { "priority", PRIORITY },
+// FreeBSD { "priority", PRIORITY },
{ "protocol", PROTO },
{ "query", QUERYSTR },
{ "real", REAL },
@@ -1846,9 +1872,11 @@
{ "return", RETURN },
{ "roundrobin", ROUNDROBIN },
{ "route", ROUTE },
+/* FreeBSD exclude
{ "router", ROUTER },
{ "rtable", RTABLE },
{ "rtlabel", RTLABEL },
+*/
{ "sack", SACK },
{ "script", SCRIPT },
{ "send", SEND },
@@ -1864,7 +1892,7 @@
{ "timeout", TIMEOUT },
{ "to", TO },
{ "transparent", TRANSPARENT },
- { "trap", TRAP },
+// FreeBSD { "trap", TRAP },
{ "ttl", TTL },
{ "updates", UPDATES },
{ "url", URL },
@@ -2096,7 +2124,8 @@
(isalnum(x) || (ispunct(x) && x != '(' && x != ')' && \
x != '{' && x != '}' && x != '<' && x != '>' && \
x != '!' && x != '=' && x != '#' && \
- x != ',' && x != '/'))
+ x != ','))
+// FreeBSD exclude x != ',' && x != '/'))
if (isalnum(c) || c == ':' || c == '_') {
do {
@@ -2240,13 +2269,14 @@
loadcfg = 1;
errors = 0;
last_host_id = last_table_id = last_rdr_id = last_proto_id =
- last_relay_id = last_rt_id = last_nr_id = 0;
+// FreeBSD last_relay_id = last_rt_id = last_nr_id = 0;
+ last_relay_id = 0;
rdr = NULL;
table = NULL;
rlay = NULL;
proto = NULL;
- router = NULL;
+// FreeBSD router = NULL;
if ((file = pushfile(filename, 0)) == NULL)
return (-1);
@@ -2276,8 +2306,8 @@
}
if (TAILQ_EMPTY(conf->sc_rdrs) &&
- TAILQ_EMPTY(conf->sc_relays) &&
- TAILQ_EMPTY(conf->sc_rts)) {
+ TAILQ_EMPTY(conf->sc_relays) /* FreeBSD exclude &&
+ TAILQ_EMPTY(conf->sc_rts) */ ) {
log_warnx("no actions, nothing to do");
errors++;
}
@@ -2493,7 +2523,8 @@
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM; /* DUMMY */
error = getaddrinfo(s, NULL, &hints, &res0);
- if (error == EAI_AGAIN || error == EAI_NODATA || error == EAI_NONAME)
+// if (error == EAI_AGAIN || error == EAI_NODATA || error == EAI_NONAME)
+ if (error == EAI_AGAIN || error == EAI_NONAME)
return (0);
if (error) {
log_warnx("%s: could not parse \"%s\": %s", __func__, s,

View File

@ -1,109 +0,0 @@
--- relayd.orig/pfe.c 2011-05-22 01:06:39.464157989 +0200
+++ relayd/pfe.c 2011-05-22 01:09:30.589288807 +0200
@@ -17,6 +17,9 @@
*/
#include <sys/param.h>
+#ifdef __FreeBSD__
+#include <sys/queue.h>
+#endif
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
@@ -185,12 +188,14 @@
case IMSG_CFG_VIRT:
config_getvirt(env, imsg);
break;
+#ifndef __FreeBSD__
case IMSG_CFG_ROUTER:
config_getrt(env, imsg);
break;
case IMSG_CFG_ROUTE:
config_getroute(env, imsg);
break;
+#endif
case IMSG_CFG_PROTO:
config_getproto(env, imsg);
break;
@@ -292,8 +297,10 @@
struct rdr *rdr;
struct host *host;
struct relay *rlay;
+#ifndef __FreeBSD__
struct router *rt;
struct netroute *nr;
+#endif
if (env->sc_rdrs == NULL)
goto relays;
@@ -324,7 +331,11 @@
}
relays:
if (env->sc_relays == NULL)
+#ifndef __FreeBSD__
goto routers;
+#else
+ goto end;
+#endif
TAILQ_FOREACH(rlay, env->sc_relays, rl_entry) {
rlay->rl_stats[env->sc_prefork_relay].id = EMPTY_ID;
imsg_compose_event(&c->iev, IMSG_CTL_RELAY, 0, 0, -1,
@@ -351,6 +362,7 @@
0, 0, -1, host, sizeof(*host));
}
+#ifndef __FreeBSD__
routers:
if (env->sc_rts == NULL)
goto end;
@@ -370,6 +382,7 @@
imsg_compose_event(&c->iev, IMSG_CTL_HOST,
0, 0, -1, host, sizeof(*host));
}
+#endif
end:
imsg_compose_event(&c->iev, IMSG_CTL_END, 0, 0, -1, NULL, 0);
@@ -622,8 +635,10 @@
struct table *table;
struct ctl_id id;
struct imsg imsg;
+#ifndef __FreeBSD__
struct ctl_demote demote;
struct router *rt;
+#endif
bzero(&id, sizeof(id));
bzero(&imsg, sizeof(imsg));
@@ -678,6 +693,7 @@
}
}
+#ifndef __FreeBSD__
TAILQ_FOREACH(rt, env->sc_rts, rt_entry) {
rt->rt_conf.flags &= ~(F_BACKUP);
rt->rt_conf.flags &= ~(F_DOWN);
@@ -685,6 +701,7 @@
if ((rt->rt_gwtable->conf.flags & F_CHANGED))
sync_routes(env, rt);
}
+#endif
TAILQ_FOREACH(table, env->sc_tables, entry) {
if (table->conf.check == CHECK_NOCHECK)
@@ -695,6 +712,7 @@
*/
table->conf.flags &= ~(F_CHANGED);
+#ifndef __FreeBSD__
/*
* handle demotion.
*/
@@ -717,6 +735,7 @@
sizeof(demote.group));
proc_compose_imsg(env->sc_ps, PROC_PARENT, -1, IMSG_DEMOTE, -1,
&demote, sizeof(demote));
+#endif
}
}

View File

@ -1,284 +0,0 @@
--- relayd/pfe_filter.c.orig 2011-05-19 10:56:49.000000000 +0200
+++ relayd/pfe_filter.c 2011-05-22 10:32:36.639918375 +0200
@@ -24,7 +24,10 @@
#include <net/if.h>
#include <net/pfvar.h>
#include <netinet/in.h>
+#ifndef __FreeBSD__
+/* New pf */
#include <netinet/tcp.h>
+#endif
#include <arpa/inet.h>
#include <limits.h>
@@ -43,8 +46,14 @@
struct pfdata {
int dev;
struct pf_anchor *anchor;
+#ifndef __FreeBSD__
struct pfioc_trans pft;
struct pfioc_trans_e pfte;
+#else
+ /* Old pf */
+ struct pfioc_trans pft[PF_RULESET_MAX];
+ struct pfioc_trans_e pfte[PF_RULESET_MAX];
+#endif
u_int8_t pfused;
};
@@ -103,6 +112,10 @@
sizeof(tables[i].pfrt_name))
goto toolong;
tables[i].pfrt_flags |= PFR_TFLAG_PERSIST;
+#ifdef __FreeBSD__
+ log_debug("init_tables: prepare anchor \"%s\" and table \"%s\"",
+ tables[i].pfrt_anchor, tables[i].pfrt_name);
+#endif
i++;
}
if (i != env->sc_rdrcount)
@@ -286,12 +299,18 @@
}
psnk.psnk_af = host->conf.ss.ss_family;
+#ifndef __FreeBSD__
psnk.psnk_killed = 0;
+#endif
if (ioctl(env->sc_pf->dev,
DIOCKILLSRCNODES, &psnk) == -1)
fatal("kill_srcnodes: cannot kill src nodes");
+#ifndef __FreeBSD__
cnt += psnk.psnk_killed;
+#else
+ cnt += psnk.psnk_af;
+#endif
}
return (cnt);
@@ -335,6 +354,7 @@
int
transaction_init(struct relayd *env, const char *anchor)
{
+#ifndef __FreeBSD__
env->sc_pf->pft.size = 1;
env->sc_pf->pft.esize = sizeof(env->sc_pf->pfte);
env->sc_pf->pft.array = &env->sc_pf->pfte;
@@ -347,17 +367,45 @@
if (ioctl(env->sc_pf->dev, DIOCXBEGIN,
&env->sc_pf->pft) == -1)
return (-1);
+#else
+ /* Old pf */
+ int i;
+
+ for (i = 0; i < PF_RULESET_MAX; i++) {
+ env->sc_pf->pft[i].size = 1;
+ env->sc_pf->pft[i].esize = sizeof(env->sc_pf->pfte[i]);
+ env->sc_pf->pft[i].array = &env->sc_pf->pfte[i];
+
+ bzero(&env->sc_pf->pfte[i], sizeof(env->sc_pf->pfte[i]));
+ (void)strlcpy(env->sc_pf->pfte[i].anchor,
+ anchor, PF_ANCHOR_NAME_SIZE);
+ env->sc_pf->pfte[i].rs_num = i;
+ if (ioctl(env->sc_pf->dev, DIOCXBEGIN,
+ &env->sc_pf->pft[i]) == -1)
+ return (-1);
+ }
+#endif
return (0);
}
int
transaction_commit(struct relayd *env)
{
+#ifndef __FreeBSD__
if (ioctl(env->sc_pf->dev, DIOCXCOMMIT,
&env->sc_pf->pft) == -1)
return (-1);
-
+#else
+ /* Old pf */
+ int i;
+
+ for (i = 0; i < PF_RULESET_MAX; i++) {
+ if (ioctl(env->sc_pf->dev, DIOCXCOMMIT,
+ &env->sc_pf->pft[i]) == -1)
+ return (-1);
+ }
+#endif
return (0);
}
@@ -365,10 +413,18 @@
sync_ruleset(struct relayd *env, struct rdr *rdr, int enable)
{
struct pfioc_rule rio;
+#ifdef __FreeBSD__
+ /* Old pf */
+ struct pfioc_pooladdr pio;
+#endif
struct sockaddr_in *sain;
struct sockaddr_in6 *sain6;
struct address *address;
char anchor[PF_ANCHOR_NAME_SIZE];
+#ifdef __FreeBSD__
+ /* Old pf */
+ int rs = 0;
+#endif
struct table *t = rdr->table;
if ((env->sc_flags & F_NEEDPF) == 0)
@@ -397,8 +453,14 @@
TAILQ_FOREACH(address, &rdr->virts, entry) {
memset(&rio, 0, sizeof(rio));
+#ifdef __FreeBSD__
+ /* Old pf */
+ memset(&pio, 0, sizeof(pio));
+#endif
(void)strlcpy(rio.anchor, anchor, sizeof(rio.anchor));
+#ifndef __FreeBSD__
+ /* New pf */
if (rdr->conf.flags & F_MATCH) {
rio.rule.action = PF_MATCH;
rio.rule.quick = 0;
@@ -409,28 +471,61 @@
rio.rule.direction = PF_IN;
rio.rule.keep_state = PF_STATE_NORMAL;
+#endif
switch (t->conf.fwdmode) {
case FWD_NORMAL:
+#ifndef __FreeBSD__
/* traditional redirection */
if (address->ipproto == IPPROTO_TCP) {
rio.rule.flags = TH_SYN;
rio.rule.flagset = (TH_SYN|TH_ACK);
}
+#else
+ /* Old pf */
+ /* traditional redirection in the rdr-anchor */
+ rs = PF_RULESET_RDR;
+ rio.rule.action = PF_RDR;
+#endif
break;
case FWD_ROUTE:
/* re-route with pf for DSR (direct server return) */
+#ifdef __FreeBSD__
+ /* Old pf */
+ rs = PF_RULESET_FILTER;
+ rio.rule.action = PF_PASS;
+#endif
rio.rule.rt = PF_ROUTETO;
+#ifdef __FreeBSD__
+ /* Old pf */
+ rio.rule.direction = PF_IN;
+ rio.rule.quick = 1; /* force first match */
+#endif
/* Use sloppy state handling for half connections */
+#ifdef __FreeBSD__
+ /* Old pf */
+ rio.rule.keep_state = PF_STATE_NORMAL;
+#endif
+#ifdef PFRULE_STATESLOPPY
rio.rule.rule_flag = PFRULE_STATESLOPPY;
+#endif
break;
default:
fatalx("sync_ruleset: invalid forward mode");
/* NOTREACHED */
}
+#ifndef __FreeBSD__
rio.ticket = env->sc_pf->pfte.ticket;
+#else
+ /* Old pf */
+ rio.ticket = env->sc_pf->pfte[rs].ticket;
+ if (ioctl(env->sc_pf->dev, DIOCBEGINADDRS, &pio) == -1)
+ fatal("sync_ruleset: cannot initialise address pool");
+
+ rio.pool_ticket = pio.ticket;
+#endif
rio.rule.af = address->ss.ss_family;
rio.rule.proto = address->ipproto;
rio.rule.src.addr.type = PF_ADDR_ADDRMASK;
@@ -438,7 +533,9 @@
rio.rule.dst.port_op = address->port.op;
rio.rule.dst.port[0] = address->port.val[0];
rio.rule.dst.port[1] = address->port.val[1];
+#ifndef __FreeBSD__
rio.rule.rtableid = -1; /* stay in the main routing table */
+#endif
if (rio.rule.proto == IPPROTO_TCP)
rio.rule.timeout[PFTM_TCP_ESTABLISHED] =
@@ -466,18 +563,36 @@
memset(&rio.rule.dst.addr.v.a.mask.addr8, 0xff, 16);
}
+#ifndef __FreeBSD__
rio.rule.nat.addr.type = PF_ADDR_NONE;
rio.rule.rdr.addr.type = PF_ADDR_TABLE;
+#else
+ /* Old pf */
+ pio.addr.addr.type = PF_ADDR_TABLE;
+#endif
if (strlen(t->conf.ifname))
+#ifndef __FreeBSD__
(void)strlcpy(rio.rule.rdr.ifname, t->conf.ifname,
sizeof(rio.rule.rdr.ifname));
if (strlcpy(rio.rule.rdr.addr.v.tblname, rdr->conf.name,
sizeof(rio.rule.rdr.addr.v.tblname)) >=
sizeof(rio.rule.rdr.addr.v.tblname))
fatal("sync_ruleset: table name too long");
+#else
+ /* Old pf */
+ (void)strlcpy(pio.addr.ifname, t->conf.ifname,
+ sizeof(pio.addr.ifname));
+ if (strlcpy(pio.addr.addr.v.tblname, rdr->conf.name,
+ sizeof(pio.addr.addr.v.tblname)) >=
+ sizeof(pio.addr.addr.v.tblname))
+ fatal("sync_ruleset: table name too long");
+ if (ioctl(env->sc_pf->dev, DIOCADDADDR, &pio) == -1)
+ fatal("sync_ruleset: cannot add address to pool");
+#endif
if (address->port.op == PF_OP_EQ ||
rdr->table->conf.flags & F_PORT) {
+#ifndef __FreeBSD__
rio.rule.rdr.proxy_port[0] =
ntohs(rdr->table->conf.port);
rio.rule.rdr.port_op = PF_OP_EQ;
@@ -491,10 +606,27 @@
sizeof(rio.rule.route));
rio.rule.rdr.addr.type = PF_ADDR_NONE;
}
+#else
+ /* Old pf */
+ rio.rule.rpool.proxy_port[0] =
+ ntohs(rdr->table->conf.port);
+ rio.rule.rpool.port_op = PF_OP_EQ;
+ }
+ rio.rule.rpool.opts = PF_POOL_ROUNDROBIN;
+ if (rdr->conf.flags & F_STICKY)
+ rio.rule.rpool.opts |= PF_POOL_STICKYADDR;
+#endif
if (ioctl(env->sc_pf->dev, DIOCADDRULE, &rio) == -1)
fatal("cannot add rule");
+#ifndef __FreeBSD__
log_debug("%s: rule added to anchor \"%s\"", __func__, anchor);
+#else
+ /* Old pf */
+ log_debug("%s: rule added to %sanchor \"%s\"", __func__,
+ rdr->table->conf.fwdmode == FWD_ROUTE ?
+ "" : "rdr-", anchor);
+#endif
}
if (transaction_commit(env) == -1)
log_warn("%s: add rules transaction failed", __func__);

View File

@ -1,249 +0,0 @@
--- relayd/relay.c.orig 2011-05-20 11:43:53.000000000 +0200
+++ relayd/relay.c 2011-05-22 10:41:40.085208004 +0200
@@ -16,7 +16,11 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#else
#include <sys/types.h>
+#endif
#include <sys/queue.h>
#include <sys/time.h>
#include <sys/stat.h>
@@ -77,7 +81,9 @@
void relay_write(struct bufferevent *, void *);
void relay_read(struct bufferevent *, void *);
+#ifndef __FreeBSD__
int relay_splicelen(struct ctl_relay_event *);
+#endif
void relay_error(struct bufferevent *, short, void *);
void relay_dump(struct ctl_relay_event *, const void *, size_t);
@@ -494,6 +500,7 @@
return (0);
}
+#ifndef __FreeBSD__
in_port_t
relay_socket_getport(struct sockaddr_storage *ss)
{
@@ -509,6 +516,7 @@
/* NOTREACHED */
return (0);
}
+#endif
int
relay_socket(struct sockaddr_storage *ss, in_port_t port,
@@ -577,6 +585,7 @@
&val, sizeof(val)) == -1)
goto bad;
}
+#ifndef __FreeBSD__
if (proto->tcpflags & (TCPFLAG_SACK|TCPFLAG_NSACK)) {
if (proto->tcpflags & TCPFLAG_NSACK)
val = 0;
@@ -586,6 +595,7 @@
&val, sizeof(val)) == -1)
goto bad;
}
+#endif
return (s);
@@ -675,6 +685,7 @@
}
break;
case RELAY_PROTO_TCP:
+#ifndef __FreeBSD__
if ((proto->tcpflags & TCPFLAG_NSPLICE) ||
(rlay->rl_conf.flags & (F_SSL|F_SSLCLIENT)))
break;
@@ -692,6 +703,7 @@
return;
}
con->se_out.splicelen = 0;
+#endif
break;
default:
fatalx("relay_input: unknown protocol");
@@ -935,12 +947,20 @@
}
if (strstr(val, "$TIMEOUT") != NULL) {
snprintf(ibuf, sizeof(ibuf), "%lu",
+#ifdef __FreeBSD__
+ (unsigned long)rlay->rl_conf.timeout.tv_sec);
+#else
rlay->rl_conf.timeout.tv_sec);
+#endif
if (expand_string(buf, len, "$TIMEOUT", ibuf) != 0)
return (NULL);
}
+#ifndef __FreeBSD__
return (buf);
+#else
+ return (char *)(buf);
+#endif
}
int
@@ -1552,7 +1572,11 @@
switch (type) {
case DIGEST_SHA1:
case DIGEST_MD5:
+#ifdef __FreeBSD__
+ if ((md = digeststr(type, (u_int8_t*)val, strlen(val), NULL)) == NULL) {
+#else
if ((md = digeststr(type, val, strlen(val), NULL)) == NULL) {
+#endif
relay_close_http(con, 500,
"failed to allocate digest", 0);
goto fail;
@@ -1841,6 +1865,7 @@
}
}
+#ifndef __FreeBSD__
int
relay_splicelen(struct ctl_relay_event *cre)
{
@@ -1859,6 +1884,7 @@
}
return (0);
}
+#endif
void
relay_error(struct bufferevent *bev, short error, void *arg)
@@ -1866,9 +1892,12 @@
struct ctl_relay_event *cre = (struct ctl_relay_event *)arg;
struct rsession *con = cre->con;
struct evbuffer *dst;
+#ifndef __FreeBSD__
struct timeval tv, tv_now;
+#endif
if (error & EVBUFFER_TIMEOUT) {
+#ifndef __FreeBSD__
if (gettimeofday(&tv_now, NULL) == -1) {
relay_close(con, strerror(errno));
return;
@@ -1882,6 +1911,9 @@
relay_close(con, "buffer event timeout");
else
bufferevent_enable(cre->bev, EV_READ);
+#else
+ relay_close(con, "buffer event timeout");
+#endif
return;
}
if (error & (EVBUFFER_READ|EVBUFFER_WRITE|EVBUFFER_EOF)) {
@@ -1934,8 +1966,10 @@
con->se_out.dst = &con->se_in;
con->se_in.con = con;
con->se_out.con = con;
+#ifndef __FreeBSD__
con->se_in.splicelen = -1;
con->se_out.splicelen = -1;
+#endif
con->se_relay = rlay;
con->se_id = ++relay_conid;
con->se_relayid = rlay->rl_conf.id;
@@ -1981,6 +2015,7 @@
return;
}
+#ifndef __FreeBSD__
if (rlay->rl_conf.flags & F_DIVERT) {
slen = sizeof(con->se_out.ss);
if (getsockname(s, (struct sockaddr *)&con->se_out.ss,
@@ -1996,12 +2031,19 @@
con->se_out.port == rlay->rl_conf.port)
con->se_out.ss.ss_family = AF_UNSPEC;
} else if (rlay->rl_conf.flags & F_NATLOOK) {
+#else
+ if (rlay->rl_conf.flags & F_NATLOOK) {
+#endif
if ((cnl = (struct ctl_natlook *)
calloc(1, sizeof(struct ctl_natlook))) == NULL) {
relay_close(con, "failed to allocate nat lookup");
return;
}
+#ifdef __FreeBSD__
+ }
+ if (rlay->rl_conf.flags & F_NATLOOK && cnl != NULL) {
+#endif
con->se_cnl = cnl;
bzero(cnl, sizeof(*cnl));
cnl->in = -1;
@@ -2605,8 +2647,12 @@
goto err;
/* Set session context to the local relay name */
- if (!SSL_CTX_set_session_id_context(ctx, rlay->rl_conf.name,
- strlen(rlay->rl_conf.name)))
+ if (!SSL_CTX_set_session_id_context(ctx,
+#ifdef __FreeBSD__
+ (unsigned char*)rlay->rl_conf.name, strlen(rlay->rl_conf.name)))
+#else
+ rlay->rl_conf.name, strlen(rlay->rl_conf.name)))
+#endif
goto err;
return (ctx);
@@ -2623,7 +2669,7 @@
{
struct relay *rlay = (struct relay *)con->se_relay;
SSL *ssl;
- const SSL_METHOD *method;
+ SSL_METHOD *method;
void (*cb)(int, short, void *);
u_int flags = EV_TIMEOUT;
@@ -3069,7 +3115,11 @@
if (fstat(fd, &st) != 0)
goto fail;
size = st.st_size;
+#ifndef __FreeBSD__
if ((buf = (char *)calloc(1, size + 1)) == NULL)
+#else
+ if ((buf = (u_int8_t *)calloc(1, size + 1)) == NULL)
+#endif
goto fail;
if (read(fd, buf, size) != size)
goto fail;
@@ -3077,7 +3127,11 @@
close(fd);
*len = size;
+#ifndef __FreeBSD__
return (buf);
+#else
+ return (char *)(buf);
+#endif
fail:
if (buf != NULL)
@@ -3107,7 +3161,7 @@
return (-1);
if (snprintf(certfile, sizeof(certfile),
- "/etc/ssl/%s.crt", hbuf) == -1)
+ "%%PREFIX%%/etc/ssl/%s.crt", hbuf) == -1)
return (-1);
if ((rlay->rl_ssl_cert = relay_load_file(certfile,
&rlay->rl_conf.ssl_cert_len)) == NULL)
@@ -3115,7 +3169,7 @@
log_debug("%s: using certificate %s", __func__, certfile);
if (snprintf(certfile, sizeof(certfile),
- "/etc/ssl/private/%s.key", hbuf) == -1)
+ "%%PREFIX%%/etc/ssl/private/%s.key", hbuf) == -1)
return -1;
if ((rlay->rl_ssl_key = relay_load_file(certfile,
&rlay->rl_conf.ssl_key_len)) == NULL)

View File

@ -1,14 +0,0 @@
--- relayd.orig/relay_udp.c 2011-05-22 01:06:39.460142978 +0200
+++ relayd/relay_udp.c 2011-05-22 01:06:54.703144104 +0200
@@ -16,7 +16,11 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#else
#include <sys/types.h>
+#endif
#include <sys/queue.h>
#include <sys/time.h>
#include <sys/stat.h>

View File

@ -1,20 +0,0 @@
--- relayd.orig/relayd.8 2011-05-22 01:06:39.464157989 +0200
+++ relayd/relayd.8 2011-05-22 01:06:54.705151889 +0200
@@ -114,7 +114,7 @@
.It Fl f Ar file
Specify an alternative configuration file.
The default is
-.Pa /etc/relayd.conf .
+.Pa %%PREFIX%%/etc/relayd.conf .
.It Fl n
Configtest mode.
Only check the configuration file for validity.
@@ -123,7 +123,7 @@
.El
.Sh FILES
.Bl -tag -width "/var/run/relayd.sockXX" -compact
-.It /etc/relayd.conf
+.It %%PREFIX%%/etc/relayd.conf
Default configuration file.
.It /var/run/relayd.sock
.Ux Ns -domain

View File

@ -1,181 +0,0 @@
--- relayd/relayd.c.orig 2011-05-19 10:56:49.000000000 +0200
+++ relayd/relayd.c 2011-05-22 10:34:12.913164741 +0200
@@ -17,7 +17,12 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#include <openssl/rand.h>
+#else
#include <sys/types.h>
+#endif
#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/wait.h>
@@ -39,7 +44,11 @@
#include <unistd.h>
#include <ctype.h>
#include <pwd.h>
+#ifdef __FreeBSD__
+#include <sha.h>
+#else
#include <sha1.h>
+#endif
#include <md5.h>
#include <openssl/ssl.h>
@@ -150,6 +159,11 @@
struct relayd *env;
struct privsep *ps;
const char *conffile = CONF_FILE;
+#ifdef __FreeBSD__
+#if __FreeBSD_version > 800040
+ u_int32_t rnd[256];
+#endif
+#endif
while ((c = getopt(argc, argv, "dD:nf:v")) != -1) {
switch (c) {
@@ -220,6 +234,16 @@
else
log_info("startup");
+#ifdef __FreeBSD__
+#if __FreeBSD_version > 800040
+ arc4random_stir();
+ arc4random_buf(rnd, sizeof(rnd));
+ RAND_seed(rnd, sizeof(rnd));
+#else
+ RAND_load_file("/dev/random",2048);
+#endif
+#endif
+
ps->ps_instances[PROC_RELAY] = env->sc_prefork_relay;
proc_init(ps, procs, nitems(procs));
@@ -258,7 +282,9 @@
if (parent_configure(env) == -1)
fatalx("configuration failed");
+#ifndef __FreeBSD__
init_routes(env);
+#endif
event_dispatch();
@@ -273,7 +299,9 @@
{
struct table *tb;
struct rdr *rdr;
+#ifndef __FreeBSD__
struct router *rt;
+#endif
struct protocol *proto;
struct relay *rlay;
int id;
@@ -284,8 +312,10 @@
config_settable(env, tb);
TAILQ_FOREACH(rdr, env->sc_rdrs, entry)
config_setrdr(env, rdr);
+#ifndef __FreeBSD__
TAILQ_FOREACH(rt, env->sc_rts, rt_entry)
config_setrt(env, rt);
+#endif
TAILQ_FOREACH(proto, env->sc_protos, entry)
config_setproto(env, proto);
TAILQ_FOREACH(rlay, env->sc_relays, rl_entry)
@@ -359,9 +389,11 @@
proc_kill(env->sc_ps);
control_cleanup(&env->sc_ps->ps_csock);
+#ifndef __FreeBSD__
carp_demote_shutdown();
if (env->sc_flags & F_DEMOTE)
carp_demote_reset(env->sc_demote_group, 128);
+#endif
free(env->sc_ps);
free(env);
@@ -375,12 +407,15 @@
parent_dispatch_pfe(int fd, struct privsep_proc *p, struct imsg *imsg)
{
struct relayd *env = p->p_env;
+#ifndef __FreeBSD__
struct ctl_demote demote;
struct ctl_netroute crt;
+#endif
u_int v;
char *str = NULL;
switch (imsg->hdr.type) {
+#ifndef __FreeBSD__
case IMSG_DEMOTE:
IMSG_SIZE_CHECK(imsg, &demote);
memcpy(&demote, imsg->data, sizeof(demote));
@@ -391,6 +426,7 @@
memcpy(&crt, imsg->data, sizeof(crt));
pfe_route(env, &crt);
break;
+#endif
case IMSG_CTL_RESET:
IMSG_SIZE_CHECK(imsg, &v);
memcpy(&v, imsg->data, sizeof(v));
@@ -432,9 +468,11 @@
proc_compose_imsg(ps, PROC_HCE, -1, IMSG_SCRIPT,
-1, &scr, sizeof(scr));
break;
+#ifndef __FreeBSD__
case IMSG_SNMPSOCK:
(void)snmp_setsock(env, p->p_id);
break;
+#endif
case IMSG_CFG_DONE:
if (env->sc_reload)
env->sc_reload--;
@@ -645,6 +683,7 @@
return (NULL);
}
+#ifndef __FreeBSD__
struct netroute *
route_find(struct relayd *env, objid_t id)
{
@@ -666,6 +705,7 @@
return (rt);
return (NULL);
}
+#endif
struct host *
host_findbyname(struct relayd *env, const char *name)
@@ -840,7 +880,11 @@
{
switch (type) {
case DIGEST_SHA1:
+#ifdef __FreeBSD__
+ return (SHA1_Data(data, len, buf));
+#else
return (SHA1Data(data, len, buf));
+#endif
break;
case DIGEST_MD5:
return (MD5Data(data, len, buf));
@@ -1077,9 +1121,17 @@
bnd->bnd_proto == IPPROTO_TCP ? SOCK_STREAM : SOCK_DGRAM,
bnd->bnd_proto)) == -1)
goto fail;
+#ifdef SO_BINDANY
if (setsockopt(s, SOL_SOCKET, SO_BINDANY,
&v, sizeof(v)) == -1)
goto fail;
+#else
+#ifdef IP_BINDANY
+ if (setsockopt(s, IPPROTO_IP, IP_BINDANY,
+ &v, sizeof(v)) == -1)
+ goto fail;
+#endif
+#endif
if (bind(s, (struct sockaddr *)&bnd->bnd_ss,
bnd->bnd_ss.ss_len) == -1)
goto fail;

View File

@ -1,244 +0,0 @@
--- relayd/relayd.conf.5.orig 2011-05-05 12:20:24.000000000 +0200
+++ relayd/relayd.conf.5 2011-05-22 12:52:42.026190316 +0200
@@ -43,7 +43,7 @@
in a similar fashion to
.Xr pf 4
tables.
-They are used for relay, redirection, and router target selection with
+They are used for relay and redirection target selection with
the described options and health checking on the host they contain.
.It Sy Redirections
Redirections are translated to
@@ -55,9 +55,6 @@
general purpose TCP proxying on layer 7.
.It Sy Protocols
Protocols are predefined protocol handlers and settings for relays.
-.It Sy Routers
-Routers are used to insert routes with health-checked gateways for
-(WAN) link balancing.
.El
.Pp
Within the sections,
@@ -86,7 +83,7 @@
.Ic include
keyword, for example:
.Bd -literal -offset indent
-include "/etc/relayd.conf.local"
+include "%%PREFIX%%/etc/relayd.conf.local"
.Ed
.Sh MACROS
Macros can be defined that will later be expanded in context.
@@ -111,17 +108,6 @@
.Sh GLOBAL CONFIGURATION
Here are the settings that can be set globally:
.Bl -tag -width Ds
-.It Ic demote Ar group
-Enable the global
-.Xr carp 4
-demotion option, resetting the carp demotion counter for the
-specified interface group to zero on startup and to 128 on shutdown of
-the daemon.
-For more information on interface groups,
-see the
-.Ic group
-keyword in
-.Xr ifconfig 8 .
.It Ic interval Ar number
Set the interval in seconds at which the hosts will be checked.
The default interval is 10 seconds.
@@ -151,15 +137,6 @@
.Xr relayd 8
runs 5 relay processes by default and every process will handle
all configured relays.
-.It Ic send trap
-Send an SNMP trap when the state of a host changes.
-.Xr relayd 8
-will try to connect to
-.Xr snmpd 8
-and request it send a trap to the registered trap receivers;
-see
-.Xr snmpd.conf 5
-for more information about the configuration.
.It Ic timeout Ar number
Set the global timeout in milliseconds for checks.
This can be overridden by the timeout value in the table definitions.
@@ -363,17 +340,6 @@
.Pp
The following general table options are available:
.Bl -tag -width Ds
-.It Ic demote Ar group
-Enable the per-table
-.Xr carp 4
-demotion option.
-This will increment the carp demotion counter for the
-specified interface group if all hosts in the table are down.
-For more information on interface groups,
-see the
-.Ic group
-keyword in
-.Xr ifconfig 8 .
.It Ic interval Ar number
Override the global interval and specify one for this table.
It must be a multiple of the global interval.
@@ -605,7 +571,7 @@
.Ic destination
.Ar options ...
.Xc
-When redirecting connections with a divert-to rule in
+When redirecting connections with a rdr-to rule in
.Xr pf.conf 5
to a relay listening on localhost, this directive will
look up the real destination address of the intended target host,
@@ -613,14 +579,7 @@
If an additional
.Ic forward to
directive to a specified address or table is present,
-it will be used as a backup if the lookup failed.
-.It Xo
-.Ic forward to
-.Ic nat lookup
-.Ar options ...
-.Xc
-Like the previous directive, but for redirections with rdr-to in
-.Xr pf.conf 5 .
+it will be used as a backup if the NAT lookup failed.
.It Xo
.Ic listen on Ar address
.Op Ic port Ar port
@@ -639,9 +598,9 @@
keyword is present, the relay will accept connections using the
encrypted SSL protocol.
The relay will look up a private key in
-.Pa /etc/ssl/private/address.key
+.Pa %%PREFIX%%/etc/ssl/private/address.key
and a public certificate in
-.Pa /etc/ssl/address.crt ,
+.Pa %%PREFIX%%/etc/ssl/address.crt ,
where
.Ar address
is the specified IP address of the relay to listen on.
@@ -990,9 +949,6 @@
This option enables CA verification in SSL client mode.
The daemon will load the CA (Certificate Authority) certificates from
the specified path to verify the server certificates.
-.Ox
-provides a default CA bundle in
-.Pa /etc/ssl/cert.pem .
.It Ic ciphers Ar string
Set the string defining the SSL cipher suite.
If not specified, the default value
@@ -1068,89 +1024,22 @@
Set the socket-level buffer size for input and output for this
connection.
This will affect the TCP window size.
-.It Xo
-.Op Ic no
-.Ic splice
-.Xc
-Use socket splicing for zero-copy data transfer.
-This option is enabled by default.
.El
.El
-.Sh ROUTERS
-Routers represent routing table entries in the kernel forwarding
-database, see
-.Xr route 4 ,
-and a table of associated gateways.
-They are used to dynamically insert or remove routes with gateways
-based on their availability and health-check results.
-A router can include multiple network statements and a single forward
-statement with a table of one or more gateways.
-All entries in a single router directive must match the same address
-family, either IPv4 or IPv6.
-.Pp
-The kernel supports multipath routing when multiple gateways exist to
-the same destination address.
-The multipath routing behaviour can be changed globally using the
-.Xr sysctl 8
-variables
-.Va net.inet.ip.multipath
-and
-.Va net.inet6.ip6.multipath .
-With the default setting of 0,
-the first route selected will be used for subsequent packets to that
-destination regardless of source.
-Setting it to 1 will enable load balancing based on the packet source
-address across gateways; multiple routes with the same priority are
-used equally.
-The kernel will also check the link state of the related network
-interface and try a different route if it is not active.
-.Pp
-The configuration directives that are valid in the
-.Ic routers
-context are described below:
-.Bl -tag -width Ds
-.It Xo
-.Ic forward to
-.Aq Ar table
-.Ic port Ar number
-.Ar options ...
-.Xc
-Specify the table of target gateways to be used; see the
-.Sx TABLES
-section above for information about table options.
-This entry is mandatory and must be specified once.
-.It Xo
-.Ic route
-.Ar address Ns Li / Ns Ar prefix
-.Xc
-Specify the network address and prefix length of a route destination
-that is reachable via the active gateways.
-This entry must be specified at least once in a router directive.
-.It Ic rtable Ar id
-Add the routes to the kernel routing table with the specified
-.Ar id .
-.It Ic rtlabel Ar label
-Add the routes with the specified
-.Ar label
-to the kernel routing table.
-.El
.Sh FILES
-.Bl -tag -width "/etc/ssl/private/address.keyXX" -compact
-.It Pa /etc/relayd.conf
+.Bl -tag -width "%%PREFIX%%/etc/ssl/private/address.keyXX" -compact
+.It Pa %%PREFIX%%/etc/relayd.conf
.Xr relayd 8
configuration file.
.Pp
.It Pa /etc/services
Service name database.
.Pp
-.It Pa /etc/ssl/address.crt
-.It Pa /etc/ssl/private/address.key
+.It Pa %%PREFIX%%/etc/ssl/address.crt
+.It Pa %%PREFIX%%/etc/ssl/private/address.key
Location of the relay SSL server certificates, where
.Ar address
is the configured IP address of the relay.
-.It Pa /etc/ssl/cert.pem
-Default location of the CA bundle that can be used with
-.Xr relayd 8 .
.El
.Sh EXAMPLES
This configuration file would create a redirection service
@@ -1242,20 +1131,9 @@
forward to shell.example.com port 22
}
.Ed
-.Pp
-The next simple router configuration example can be used to run
-redundant, health-checked WAN links:
-.Bd -literal -offset indent
-table \*(Ltgateways\*(Gt { $gw1 ip ttl 1, $gw2 ip ttl 1 }
-router "uplinks" {
- route 0.0.0.0/0
- forward to \*(Ltgateways\*(Gt check icmp
-}
-.Ed
.Sh SEE ALSO
.Xr relayctl 8 ,
.Xr relayd 8 ,
-.Xr snmpd 8 ,
.Xr ssl 8
.Sh HISTORY
The

View File

@ -1,189 +0,0 @@
--- relayd/relayd.h.orig 2011-05-26 18:42:14.000000000 +0200
+++ relayd/relayd.h 2011-05-26 18:44:44.868614096 +0200
@@ -21,10 +21,18 @@
#include <sys/tree.h>
#include <sys/param.h> /* MAXHOSTNAMELEN */
+#ifdef __FreeBSD__
+#include <sys/queue.h>
+#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
+#endif
#include <limits.h>
#include <imsg.h>
+#ifdef __FreeBSD__
+#define CONF_FILE "%%PREFIX%%/etc/relayd.conf"
+#else
#define CONF_FILE "/etc/relayd.conf"
+#endif
#define RELAYD_SOCKET "/var/run/relayd.sock"
#define PF_SOCKET "/dev/pf"
#define RELAYD_USER "_relayd"
@@ -63,7 +71,18 @@
#define SMALL_READ_BUF_SIZE 1024
#define ICMP_BUF_SIZE 64
+#ifndef __FreeBSD__
#define SNMP_RECONNECT_TIMEOUT { 3, 0 } /* sec, usec */
+#else
+#define SIMPLEQ_HEAD STAILQ_HEAD
+#define SIMPLEQ_FIRST STAILQ_FIRST
+#define SIMPLEQ_REMOVE_HEAD STAILQ_REMOVE_HEAD
+#define SIMPLEQ_ENTRY STAILQ_ENTRY
+#define SIMPLEQ_INIT STAILQ_INIT
+#define SIMPLEQ_EMPTY STAILQ_EMPTY
+#define SIMPLEQ_NEXT STAILQ_NEXT
+#define SIMPLEQ_INSERT_TAIL STAILQ_INSERT_TAIL
+#endif
#if DEBUG > 1
#define DPRINTF log_debug
@@ -626,6 +645,7 @@
};
#define RELAY_DSTMODE_DEFAULT RELAY_DSTMODE_ROUNDROBIN
+#ifndef __FreeBSD__
struct router;
struct netroute_config {
objid_t id;
@@ -672,6 +692,7 @@
struct netroute_config nr;
struct router_config rt;
};
+#endif
/* initially control.h */
struct control_sock {
@@ -757,12 +778,18 @@
IMSG_HOST_STATUS, /* notifies from hce to pfe */
IMSG_SYNC,
IMSG_NATLOOK,
+#ifndef __FreeBSD__
IMSG_DEMOTE,
+#endif
IMSG_STATISTICS,
IMSG_SCRIPT,
+#ifndef __FreeBSD__
IMSG_SNMPSOCK,
+#endif
IMSG_BINDANY,
+#ifndef __FreeBSD__
IMSG_RTMSG, /* from pfe to parent */
+#endif
IMSG_CFG_TABLE, /* configuration from parent */
IMSG_CFG_HOST,
IMSG_CFG_RDR,
@@ -830,14 +857,18 @@
u_int32_t sc_flags;
const char *sc_conffile;
struct pfdata *sc_pf;
+#ifndef __FreeBSD__
int sc_rtsock;
int sc_rtseq;
+#endif
int sc_tablecount;
int sc_rdrcount;
int sc_protocount;
int sc_relaycount;
+#ifndef __FreeBSD__
int sc_routercount;
int sc_routecount;
+#endif
struct timeval sc_interval;
struct timeval sc_timeout;
struct table sc_empty_table;
@@ -847,8 +878,10 @@
struct rdrlist *sc_rdrs;
struct protolist *sc_protos;
struct relaylist *sc_relays;
+#ifndef __FreeBSD__
struct routerlist *sc_rts;
struct netroutelist *sc_routes;
+#endif
u_int16_t sc_prefork_relay;
char sc_demote_group[IFNAMSIZ];
u_int16_t sc_id;
@@ -856,10 +889,11 @@
struct event sc_statev;
struct timeval sc_statinterval;
+#ifndef __FreeBSD__
int sc_snmp;
struct event sc_snmpto;
struct event sc_snmpev;
-
+#endif
int sc_has_icmp;
int sc_has_icmp6;
struct ctl_icmp_event sc_icmp_send;
@@ -927,10 +961,12 @@
u_int64_t
check_table(struct relayd *, struct rdr *, struct table *);
+#ifndef __FreeBSD__
/* pfe_route.c */
void init_routes(struct relayd *);
void sync_routes(struct relayd *, struct router *);
int pfe_route(struct relayd *, struct ctl_netroute *);
+#endif
/* hce.c */
pid_t hce(struct privsep *, struct privsep_proc *);
@@ -947,8 +983,10 @@
void relay_session(struct rsession *);
int relay_from_table(struct rsession *);
int relay_socket_af(struct sockaddr_storage *, in_port_t);
+#ifndef __FreeBSD__
in_port_t
relay_socket_getport(struct sockaddr_storage *);
+#endif
int relay_cmp_af(struct sockaddr_storage *,
struct sockaddr_storage *);
@@ -990,8 +1028,10 @@
struct host *host_find(struct relayd *, objid_t);
struct table *table_find(struct relayd *, objid_t);
struct rdr *rdr_find(struct relayd *, objid_t);
+#ifndef __FreeBSD__
struct netroute *route_find(struct relayd *, objid_t);
struct router *router_find(struct relayd *, objid_t);
+#endif
struct host *host_findbyname(struct relayd *, const char *);
struct table *table_findbyname(struct relayd *, const char *);
struct table *table_findbyconf(struct relayd *, struct table *);
@@ -1039,11 +1079,13 @@
void pn_unref(u_int16_t);
void pn_ref(u_int16_t);
+#ifndef __FreeBSD__
/* snmp.c */
void snmp_init(struct relayd *, enum privsep_procid);
int snmp_setsock(struct relayd *, enum privsep_procid);
int snmp_getsock(struct relayd *, struct imsg *);
void snmp_hosttrap(struct relayd *, struct table *, struct host *);
+#endif
/* shuffle.c */
void shuffle_init(struct shuffle *);
@@ -1096,9 +1138,11 @@
int config_setrdr(struct relayd *, struct rdr *);
int config_getrdr(struct relayd *, struct imsg *);
int config_getvirt(struct relayd *, struct imsg *);
+#ifndef __FreeBSD__
int config_setrt(struct relayd *, struct router *);
int config_getrt(struct relayd *, struct imsg *);
int config_getroute(struct relayd *, struct imsg *);
+#endif
int config_setproto(struct relayd *env, struct protocol *);
int config_getproto(struct relayd *, struct imsg *);
int config_setprotonode(struct relayd *, enum privsep_procid,
@@ -1106,3 +1150,9 @@
int config_getprotonode(struct relayd *, struct imsg *);
int config_setrelay(struct relayd *env, struct relay *);
int config_getrelay(struct relayd *, struct imsg *);
+
+#ifdef __FreeBSD__
+#if __FreeBSD_version < 800041
+u_int32_t arc4random_uniform(u_int32_t upper_bound);
+#endif
+#endif

View File

@ -1,3 +1,5 @@
This is the FreeBSD port of the OpenBSD relayd and relayctl.
relayd is a daemon to relay and dynamically redirect incoming connections
to a target host. Its main purposes are to run as a load-balancer,
application layer gateway, or transparent proxy. The daemon is able to
@ -13,4 +15,6 @@ carp
routers
snmp
WWW: http://spootnik.org/relayd/
The relayctl program controls the relayd(8) daemon.
WWW: https://github.com/mmatuska/relayd

View File

@ -1,4 +1,4 @@
@unexec if cmp -s %D/etc/relayd.conf %D/etc/relayd.conf.sample; then rm -f %D/etc/relayd.conf; fi
etc/relayd.conf.sample
sbin/relayctl
sbin/relayd
@unexec echo "Warning: If you will *NOT* use this package anymore, please remove the _relayd user manually."