Hi,

the following diff adds support for source-hash and random modes to
relayd's redirections.  It depends on the latest pf change.

Example:
---snip---
redirect foo {
        listen on 0.0.0.0 port 8080
        forward to <foo> check tcp port 80 mode source-hash
#       forward to <foo> check tcp port 80 mode source-hash "my-fixed-key"
}
---snap---

Reyk

Index: usr.sbin/relayd/parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/parse.y,v
retrieving revision 1.197
diff -u -p -u -p -r1.197 parse.y
--- usr.sbin/relayd/parse.y     18 Dec 2014 20:55:01 -0000      1.197
+++ usr.sbin/relayd/parse.y     19 Dec 2014 13:45:45 -0000
@@ -493,6 +493,9 @@ rdropts_l   : rdropts_l rdroptsl nl
 
 rdroptsl       : forwardmode TO tablespec interface    {
                        if (hashkey != NULL) {
+                               memcpy(&rdr->conf.key,
+                                   hashkey, sizeof(rdr->conf.key));
+                               rdr->conf.flags |= F_HASHKEY;
                                free(hashkey);
                                hashkey = NULL;
                        }
@@ -776,15 +779,15 @@ tableopts : CHECK tablecheck
                        switch ($2) {
                        case RELAY_DSTMODE_LOADBALANCE:
                        case RELAY_DSTMODE_HASH:
-                       case RELAY_DSTMODE_RANDOM:
-                       case RELAY_DSTMODE_SRCHASH:
                                if (rdr != NULL) {
                                        yyerror("mode not supported "
                                            "for redirections");
                                        YYERROR;
                                }
                                /* FALLTHROUGH */
+                       case RELAY_DSTMODE_RANDOM:
                        case RELAY_DSTMODE_ROUNDROBIN:
+                       case RELAY_DSTMODE_SRCHASH:
                                dstmode = $2;
                                break;
                        case RELAY_DSTMODE_LEASTSTATES:
Index: usr.sbin/relayd/pfe_filter.c
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/pfe_filter.c,v
retrieving revision 1.53
diff -u -p -u -p -r1.53 pfe_filter.c
--- usr.sbin/relayd/pfe_filter.c        27 Apr 2013 16:39:30 -0000      1.53
+++ usr.sbin/relayd/pfe_filter.c        19 Dec 2014 13:45:45 -0000
@@ -485,9 +485,15 @@ sync_ruleset(struct relayd *env, struct 
                }
 
                switch (rdr->conf.mode) {
+               case RELAY_DSTMODE_RANDOM:
+                       rio.rule.rdr.opts = PF_POOL_RANDOM;
+                       break;
                case RELAY_DSTMODE_ROUNDROBIN:
                        rio.rule.rdr.opts = PF_POOL_ROUNDROBIN;
                        break;
+               case RELAY_DSTMODE_SRCHASH:
+                       rio.rule.rdr.opts = PF_POOL_SRCHASH;
+                       break;
                case RELAY_DSTMODE_LEASTSTATES:
                        rio.rule.rdr.opts = PF_POOL_LEASTSTATES;
                        break;
@@ -497,6 +503,9 @@ sync_ruleset(struct relayd *env, struct 
                }
                if (rdr->conf.flags & F_STICKY)
                        rio.rule.rdr.opts |= PF_POOL_STICKYADDR;
+               if (rdr->conf.flags & F_HASHKEY)
+                       memcpy(rio.rule.rdr.key.key32, rdr->conf.key.data,
+                           sizeof(rio.rule.rdr.key.key32));
 
                if (rio.rule.rt == PF_ROUTETO) {
                        memcpy(&rio.rule.route, &rio.rule.rdr,
Index: usr.sbin/relayd/relayd.conf.5
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/relayd.conf.5,v
retrieving revision 1.155
diff -u -p -u -p -r1.155 relayd.conf.5
--- usr.sbin/relayd/relayd.conf.5       18 Dec 2014 21:26:09 -0000      1.155
+++ usr.sbin/relayd/relayd.conf.5       19 Dec 2014 13:45:45 -0000
@@ -413,7 +413,7 @@ the source IP address of the client, and
 This mode is only supported by relays.
 .It Ic mode random
 Distributes the outgoing connections randomly through all active hosts.
-This mode is only supported by relays.
+This mode is supported by redirections and relays.
 .It Ic mode roundrobin
 Distributes the outgoing connections using a round-robin scheduler
 through all active hosts.
@@ -423,7 +423,7 @@ This mode is supported by redirections a
 Balances the outgoing connections across the active hosts based on the
 .Ar key
 and the source IP address of the client.
-This mode is only supported by relays.
+This mode is supported by redirections and relays.
 .El
 .Pp
 The optional

Reply via email to