> On 24 Jun 2015, at 10:38 am, David Gwynne <[email protected]> wrote:
>
>>
>> On 22 Jun 2015, at 18:20, Reyk Floeter <[email protected]> wrote:
>>
>> Hi,
>>
>> On Thu, May 14, 2015 at 09:44:22PM +1000, David Gwynne wrote:
>>> i want relayd to check teh availability of some services and inject
>>> routes when the service is available. if it is available, i want
>>> to advertise the routes using ospfd, but i also want the local
>>> machine to be able to contact the service even if it isnt the carp
>>> master.
>>>
>>> to do that i need to inject the routes twice, once on my real
>>> interface and again on my carp interfaces. the route on the real
>>> interface needs to be a higher priority than the carp route.
>>>
>>> this shuffles relayd to accomodate this.
>>>
>>> it mostly adds stuff to the route statements in routers, but i also
>>> take priorities away from hosts in tables so i can specify them on
>>> routes.
>>>
>>
>> I'm generally ok with extending the use cases of router, but it seems
>> that you're replacing one narrow use case with another one.
>>
>> The router code was mostly done for something like "link balancing",
>> you have two or more uplink gateways and want to select the route
>> based on their availability. I'm afraid that moving the priority from
>> hosts to routes, and changing the semantics, breaks this original use
>> case somehow.
>>
>> table <gateways> {
>> $gw1 ip ttl 1 priority 8,
>> $gw2 ip ttl 1 priority 52
>> }
>> router "uplinks" {
>> route 0.0.0.0/0
>> forward to <gateways> check icmp
>> }
>>
>> But maybe even multiple routes for something internal:
>>
>> router "srvlan" {
>> route 10.10.0.0/16
>> route 10.40.0.0/16
>> forward to <srvgateways> check icmp
>> }
>>
>> Sometimes different gateways can even be connected via the same interface!
>> (e.g. with an intermediate switch and a single cable to the OpenBSD box)
>>
>>> this is an example config:
>>>
>>> rns_nogal=130.102.71.227
>>> rns_neem=130.102.71.229
>>>
>>> table <rns> { $rns_nogal ip ttl 1, $rns_neem ip ttl 1 }
>>>
>>> router "rns" {
>>> route 130.102.71.160/31 interface vlan888 priority 8
>>> route 130.102.71.160/31 interface carp40888 priority 16
>>> forward to <rns> check icmp
>>> }
>>>
>>
>> I'm wondering, how would you translate my examples above?
>
> hrm.
>
> we could allow priorities on both the route statements and on the host
> statements in the table and combine them somehow when the actual routes are
> inserted into the kernel. or allow a relative priorities to be specified with
> a + or - prefix. eg:
>
> table <gateways> {
> $gw1 priority +1,
> $gw2
> }
>
> router "uplinks" {
> route 0.0.0.0/0 priority 16
> forward to <gateways> check icmp
> }
>
> if you add increase the priority of a route, should its numeric value get
> higher or lower?
>
> anyway, allowing priorities in both tables and router blocks would cover both
> use cases i think.
another option could be
table <gw1> { $gw1 }
table <gw2> { $gw2 }
router "hipri-uplink" {
route 0.0.0.0/0 priority 8
forward to <gw1> check icmp
}
router "lopri-uplink" {
route 0.0.0.0/0 priority 52
forward to <gw2> check icmp
}
dlg
>
>>
>>> redirect "dns" {
>>> listen on 130.102.71.160 tcp port 53
>>> listen on 130.102.71.160 udp port 53
>>> listen on 130.102.71.161 tcp port 53
>>> listen on 130.102.71.161 udp port 53
>>>
>>> match pftag rns
>>> forward to <rns> port 53 check icmp
>>> }
>>>
>>> i wish redirects took a prefix. maybe thats a diff for another day.
>>>
>>
>> Would make sense.
>>
>>> anyway, here's the diff.
>>>
>>> thoughts? tweaks? ok?
>>>
>>
>> In addition to my general concern, see comments inline below.
>>
>> Reyk
>>
>>> Index: parse.y
>>> ===================================================================
>>> RCS file: /cvs/src/usr.sbin/relayd/parse.y,v
>>> retrieving revision 1.204
>>> diff -u -p -r1.204 parse.y
>>> --- parse.y 2 May 2015 13:15:24 -0000 1.204
>>> +++ parse.y 14 May 2015 11:30:28 -0000
>>> @@ -173,6 +173,7 @@ typedef struct {
>>> %token ROUTER RTLABEL TRANSPARENT TRAP UPDATES URL VIRTUAL WITH TTL
>>> RTABLE
>>> %token MATCH PARAMS RANDOM LEASTSTATES SRCHASH KEY CERTIFICATE
>>> PASSWORD ECDH
>>> %token EDH CURVE
>>> +%token NONE LOCAL CONNECTED STATIC OSPF ISIS RIP BGP DEFAULT
>>
>> A lot of keywords for basically an "enum". See below.
>>
>>> %token <v.string> STRING
>>> %token <v.number> NUMBER
>>> %type <v.string> hostname interface table value optstring
>>> @@ -182,6 +183,7 @@ typedef struct {
>>> %type <v.number> redirect_proto relay_proto match
>>> %type <v.number> action ruleaf key_option
>>> %type <v.number> tlsdhparams tlsecdhcurve
>>> +%type <v.number> rtprio
>>> %type <v.port> port
>>> %type <v.host> host
>>> %type <v.addr> address
>>> @@ -1864,8 +1866,8 @@ router : ROUTER STRING {
>>> router = rt;
>>>
>>> tableport = -1;
>>> - } '{' optnl routeopts_l '}' {
>>> - if (!router->rt_conf.nroutes) {
>>> + } '{' optnl routeropts_l '}' {
>>> + if (TAILQ_EMPTY(&router->rt_netroutes)) {
>>> yyerror("router %s without routes",
>>> router->rt_conf.name);
>>> free(router);
>>> @@ -1881,11 +1883,11 @@ router : ROUTER STRING {
>>> }
>>> ;
>>>
>>> -routeopts_l : routeopts_l routeoptsl nl
>>> - | routeoptsl optnl
>>> +routeropts_l : routeropts_l routeroptsl nl
>>> + | routeroptsl optnl
>>> ;
>>>
>>> -routeoptsl : ROUTE address '/' NUMBER {
>>> +routeroptsl : ROUTE address '/' NUMBER {
>>> struct netroute *nr;
>>>
>>> if (router->rt_conf.af == AF_UNSPEC)
>>> @@ -1914,15 +1916,15 @@ routeoptsl : ROUTE address '/' NUMBER {
>>> YYERROR;
>>> }
>>> nr->nr_conf.prefixlen = $4;
>>> + nr->nr_conf.priority = RTP_DEFAULT;
>>> nr->nr_conf.routerid = router->rt_conf.id;
>>> nr->nr_router = router;
>>> bcopy(&$2.ss, &nr->nr_conf.ss, sizeof($2.ss));
>>>
>>> - router->rt_conf.nroutes++;
>>> - conf->sc_routecount++;
>>> TAILQ_INSERT_TAIL(&router->rt_netroutes, nr, nr_entry);
>>> + conf->sc_routecount++;
>>> TAILQ_INSERT_TAIL(conf->sc_routes, nr, nr_route);
>>> - }
>>> + } routeopts_l
>>> | FORWARD TO tablespec {
>>> free(hashkey);
>>> hashkey = NULL;
>>> @@ -1950,18 +1952,74 @@ routeoptsl : ROUTE address '/' NUMBER {
>>> }
>>> router->rt_conf.rtable = $2;
>>> }
>>> - | RTLABEL STRING {
>>> - if (strlcpy(router->rt_conf.label, $2,
>>> - sizeof(router->rt_conf.label)) >=
>>> - sizeof(router->rt_conf.label)) {
>>> - yyerror("route label truncated");
>>> + | DISABLE { rlay->rl_conf.flags |= F_DISABLE; }
>>> + | include
>>> + ;
>>> +
>>> +routeopts_l : routeopts_l routeoptsl
>>> + | routeoptsl
>>> + | /* empty */
>>> + ;
>>> +
>>> +routeoptsl : INTERFACE STRING {
>>> + struct netroute *nr =
>>> + TAILQ_LAST(&router->rt_netroutes, netroutelist);
>>> + struct netroute_config *c = &nr->nr_conf;
>>> + size_t len;
>>> +
>>> + if (strlen(c->ifname)) {
>>> + yyerror("interface name already defined");
>>> free($2);
>>> YYERROR;
>>> }
>>> +
>>> + len = strlcpy(c->ifname, $2, sizeof(c->ifname));
>>> free($2);
>>> +
>>> + if (len >= sizeof(c->ifname)) {
>>> + yyerror("interface name truncated");
>>> + YYERROR;
>>> + }
>>> + }
>>> + | PRIORITY rtprio {
>>> + struct netroute *nr =
>>> + TAILQ_LAST(&router->rt_netroutes, netroutelist);
>>> + struct netroute_config *c = &nr->nr_conf;
>>> +
>>> + c->priority = $2;
>>> + }
>>> + | RTLABEL STRING {
>>> + struct netroute *nr =
>>> + TAILQ_LAST(&router->rt_netroutes, netroutelist);
>>> + struct netroute_config *c = &nr->nr_conf;
>>> + size_t len;
>>> +
>>> + len = strlcpy(c->label, $2, sizeof(c->label));
>>> + free($2);
>>> +
>>> + if (len >= sizeof(c->label)) {
>>> + yyerror("route label truncated");
>>> + YYERROR;
>>> + }
>>> + }
>>> + ;
>>> +
>>> +rtprio : NONE { $$ = RTP_NONE; }
>>> + | LOCAL { $$ = RTP_LOCAL; }
>>> + | CONNECTED { $$ = RTP_CONNECTED; }
>>> + | STATIC { $$ = RTP_STATIC; }
>>> + | OSPF { $$ = RTP_OSPF; }
>>> + | ISIS { $$ = RTP_ISIS; }
>>> + | RIP { $$ = RTP_RIP; }
>>> + | BGP { $$ = RTP_BGP; }
>>> + | DEFAULT { $$ = RTP_DEFAULT; }
>>
>> We try to avoid such lists of keywords for enums. With our common
>> parse.y, every keyword adds a potential conflict with strings that
>> will have to be quoted. So such enums should use STRING+strcmp instead:
>
> personally i would prefer to stop turning unknown tokens into STRINGs. that
> would mean you would have to use "" around any string argument, but i would
> argue that improves the readability of a config (because strings are more
> explicit) and help future proof configs against new features which create new
> keywords.
>
> i suspect the tide is against me on that one though.
>
>>
>> rtprio : STRING {
>> if (strcasecmp("none", $1) == 0) {
>> ...
>> } else if ( ...
>>
>> free($1);
>> }
>>
>>> + | NUMBER {
>>> + if ($1 < 0 || $1 > RTP_MAX) {
>>> + yyerror("invalid priority value: %d\n", $1);
>>> + YYERROR;
>>> + }
>>> + $$ = $1;
>>> }
>>> - | DISABLE { rlay->rl_conf.flags |= F_DISABLE; }
>>> - | include
>>> ;
>>>
>>> dstaf : /* empty */ {
>>> @@ -2039,17 +2097,6 @@ hostflags : RETRY NUMBER {
>>> }
>>> hst->conf.parentid = $2;
>>> }
>>> - | PRIORITY NUMBER {
>>> - if (hst->conf.priority) {
>>> - yyerror("priority already set");
>>> - YYERROR;
>>> - }
>>> - if ($2 < 0 || $2 > RTP_MAX) {
>>> - yyerror("invalid priority value: %d\n", $2);
>>> - YYERROR;
>>> - }
>>> - hst->conf.priority = $2;
>>> - }
>>> | IP TTL NUMBER {
>>> if (hst->conf.ttl) {
>>> yyerror("ttl value already set");
>>> @@ -2160,6 +2207,7 @@ lookup(char *s)
>>> { "append", APPEND },
>>> { "backlog", BACKLOG },
>>> { "backup", BACKUP },
>>> + { "bgp", BGP },
>>> { "block", BLOCK },
>>> { "buffer", BUFFER },
>>> { "ca", CA },
>>> @@ -2168,8 +2216,10 @@ lookup(char *s)
>>> { "check", CHECK },
>>> { "ciphers", CIPHERS },
>>> { "code", CODE },
>>> + { "connected", CONNECTED },
>>> { "cookie", COOKIE },
>>> { "curve", CURVE },
>>> + { "default", DEFAULT },
>>> { "demote", DEMOTE },
>>> { "destination", DESTINATION },
>>> { "digest", DIGEST },
>>> @@ -2192,11 +2242,13 @@ lookup(char *s)
>>> { "interface", INTERFACE },
>>> { "interval", INTERVAL },
>>> { "ip", IP },
>>> + { "isis", ISIS },
>>> { "key", KEY },
>>> { "label", LABEL },
>>> { "least-states", LEASTSTATES },
>>> { "listen", LISTEN },
>>> { "loadbalance", LOADBALANCE },
>>> + { "local", LOCAL },
>>> { "log", LOG },
>>> { "lookup", LOOKUP },
>>> { "match", MATCH },
>>> @@ -2205,8 +2257,10 @@ lookup(char *s)
>>> { "nat", NAT },
>>> { "no", NO },
>>> { "nodelay", NODELAY },
>>> + { "none", NONE },
>>> { "nothing", NOTHING },
>>> { "on", ON },
>>> + { "ospf", OSPF },
>>> { "params", PARAMS },
>>> { "parent", PARENT },
>>> { "pass", PASS },
>>> @@ -2228,6 +2282,7 @@ lookup(char *s)
>>> { "response", RESPONSE },
>>> { "retry", RETRY },
>>> { "return", RETURN },
>>> + { "rip", RIP },
>>> { "roundrobin", ROUNDROBIN },
>>> { "route", ROUTE },
>>> { "router", ROUTER },
>>> @@ -2243,6 +2298,7 @@ lookup(char *s)
>>> { "source-hash", SRCHASH },
>>> { "splice", SPLICE },
>>> { "ssl", SSL },
>>> + { "static", STATIC },
>>> { "sticky-address", STICKYADDR },
>>> { "style", STYLE },
>>> { "table", TABLE },
>>> Index: pfe_route.c
>>> ===================================================================
>>> RCS file: /cvs/src/usr.sbin/relayd/pfe_route.c,v
>>> retrieving revision 1.9
>>> diff -u -p -r1.9 pfe_route.c
>>> --- pfe_route.c 22 Jan 2015 17:42:09 -0000 1.9
>>> +++ pfe_route.c 14 May 2015 11:30:28 -0000
>>> @@ -21,6 +21,7 @@
>>> #include <sys/socket.h>
>>>
>>> #include <netinet/in.h>
>>> +#include <net/if_dl.h>
>>> #include <net/route.h>
>>> #include <arpa/inet.h>
>>>
>>> @@ -39,13 +40,11 @@ struct relay_rtmsg {
>>> struct sockaddr_in rm_dst;
>>> struct sockaddr_in rm_gateway;
>>> struct sockaddr_in rm_netmask;
>>> - struct sockaddr_rtlabel rm_label;
>>> } u4;
>>> struct {
>>> struct sockaddr_in6 rm_dst;
>>> struct sockaddr_in6 rm_gateway;
>>> struct sockaddr_in6 rm_netmask;
>>> - struct sockaddr_rtlabel rm_label;
>>> } u6;
>>> } rm_u;
>>> };
>>> @@ -90,7 +89,7 @@ sync_routes(struct relayd *env, struct r
>>> rt->rt_conf.name, buf, nr->nr_conf.prefixlen,
>>> host->conf.name,
>>> HOST_ISUP(host->up) ? "up" : "down",
>>> - host->conf.priority);
>>> + nr->nr_conf.priority);
>>>
>>> crt.up = host->up;
>>> memcpy(&crt.nr, &nr->nr_conf, sizeof(nr->nr_conf));
>>> @@ -106,44 +105,35 @@ sync_routes(struct relayd *env, struct r
>>> int
>>> pfe_route(struct relayd *env, struct ctl_netroute *crt)
>>> {
>>> + struct iovec iov[3];
>>> + int iovcnt = 0;
>>> +
>>> struct relay_rtmsg rm;
>>> struct sockaddr_rtlabel sr;
>>> + struct sockaddr_dl sdl;
>>> struct sockaddr_storage *gw;
>>> struct sockaddr_in *s4;
>>> struct sockaddr_in6 *s6;
>>> - size_t len = 0;
>>> + size_t len;
>>> char *gwname;
>>> int i = 0;
>>>
>>> gw = &crt->host.ss;
>>> gwname = crt->host.name;
>>>
>>> - bzero(&rm, sizeof(rm));
>>> - bzero(&sr, sizeof(sr));
>>> + memset(&rm, 0, sizeof(rm));
>>>
>>> - rm.rm_hdr.rtm_msglen = len;
>>> rm.rm_hdr.rtm_version = RTM_VERSION;
>>> rm.rm_hdr.rtm_type = HOST_ISUP(crt->up) ? RTM_ADD : RTM_DELETE;
>>> rm.rm_hdr.rtm_flags = RTF_STATIC | RTF_GATEWAY | RTF_MPATH;
>>> rm.rm_hdr.rtm_seq = env->sc_rtseq++;
>>> - rm.rm_hdr.rtm_addrs = RTA_DST | RTA_GATEWAY;
>>> + rm.rm_hdr.rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
>>> rm.rm_hdr.rtm_tableid = crt->rt.rtable;
>>> - rm.rm_hdr.rtm_priority = crt->host.priority;
>>> -
>>> - if (strlen(crt->rt.label)) {
>>> - rm.rm_hdr.rtm_addrs |= RTA_LABEL;
>>> - sr.sr_len = sizeof(sr);
>>> - if (snprintf(sr.sr_label, sizeof(sr.sr_label),
>>> - "%s", crt->rt.label) == -1)
>>> - goto bad;
>>> - }
>>> -
>>> - if (crt->nr.ss.ss_family == AF_INET) {
>>> - rm.rm_hdr.rtm_msglen = len =
>>> - sizeof(rm.rm_hdr) + sizeof(rm.rm_u.u4);
>>> -
>>> - bcopy(&sr, &rm.rm_u.u4.rm_label, sizeof(sr));
>>> + rm.rm_hdr.rtm_priority = crt->nr.priority;
>>> + len = sizeof(rm.rm_hdr);
>>>
>>> + switch (crt->nr.ss.ss_family) {
>>> + case AF_INET:
>>> s4 = &rm.rm_u.u4.rm_dst;
>>> s4->sin_family = AF_INET;
>>> s4->sin_len = sizeof(rm.rm_u.u4.rm_dst);
>>> @@ -156,7 +146,6 @@ pfe_route(struct relayd *env, struct ctl
>>> s4->sin_addr.s_addr =
>>> ((struct sockaddr_in *)gw)->sin_addr.s_addr;
>>>
>>> - rm.rm_hdr.rtm_addrs |= RTA_NETMASK;
>>> s4 = &rm.rm_u.u4.rm_netmask;
>>> s4->sin_family = AF_INET;
>>> s4->sin_len = sizeof(rm.rm_u.u4.rm_netmask);
>>> @@ -165,12 +154,11 @@ pfe_route(struct relayd *env, struct ctl
>>> htonl(0xffffffff << (32 - crt->nr.prefixlen));
>>> else if (crt->nr.prefixlen < 0)
>>> rm.rm_hdr.rtm_flags |= RTF_HOST;
>>> - } else if (crt->nr.ss.ss_family == AF_INET6) {
>>> - rm.rm_hdr.rtm_msglen = len =
>>> - sizeof(rm.rm_hdr) + sizeof(rm.rm_u.u6);
>>>
>>> - bcopy(&sr, &rm.rm_u.u6.rm_label, sizeof(sr));
>>> + len += sizeof(rm.rm_u.u4);
>>> + break;
>>>
>>> + case AF_INET6:
>>> s6 = &rm.rm_u.u6.rm_dst;
>>> bcopy(((struct sockaddr_in6 *)&crt->nr.ss),
>>> s6, sizeof(*s6));
>>> @@ -182,7 +170,6 @@ pfe_route(struct relayd *env, struct ctl
>>> s6->sin6_family = AF_INET6;
>>> s6->sin6_len = sizeof(*s6);
>>>
>>> - rm.rm_hdr.rtm_addrs |= RTA_NETMASK;
>>> s6 = &rm.rm_u.u6.rm_netmask;
>>> s6->sin6_family = AF_INET6;
>>> s6->sin6_len = sizeof(*s6);
>>> @@ -195,11 +182,64 @@ pfe_route(struct relayd *env, struct ctl
>>> / 8] = 0xff00 >> i;
>>> } else if (crt->nr.prefixlen < 0)
>>> rm.rm_hdr.rtm_flags |= RTF_HOST;
>>> - } else
>>> +
>>> + len += sizeof(rm.rm_u.u6);
>>> + break;
>>> +
>>> + default:
>>> fatal("pfe_route: invalid address family");
>>> + }
>>> +
>>> + iov[iovcnt].iov_base = &rm;
>>> + iov[iovcnt].iov_len = len;
>>> + iovcnt++;
>>> +
>>> + if (strlen(crt->nr.ifname)) {
>>> + i = if_nametoindex(crt->nr.ifname);
>>> + if (i == 0) {
>>> + log_debug("%s: gateway %s: interface %s does not exist",
>>> + __func__, gwname, crt->nr.ifname);
>>> + return (-1);
>>> + }
>>> +
>>> + memset(&sdl, 0, sizeof(sdl));
>>> +
>>> + sdl.sdl_family = AF_LINK;
>>> + sdl.sdl_len = sizeof(sdl);
>>> + sdl.sdl_index = i;
>>> +
>>> + rm.rm_hdr.rtm_addrs |= RTA_IFP;
>>> + iov[iovcnt].iov_base = &sdl;
>>> + iov[iovcnt].iov_len = sizeof(sdl);
>>> + iovcnt++;
>>> +
>>> + len += sizeof(sdl);
>>> + }
>>> +
>>> + if (strlen(crt->nr.label)) {
>>> + memset(&sr, 0, sizeof(sr));
>>> +
>>> + sr.sr_family = AF_UNSPEC;
>>> + sr.sr_len = sizeof(sr);
>>> + if (strlcpy(sr.sr_label, crt->nr.label,
>>> + sizeof(sr.sr_label)) >= sizeof(sr.sr_label)) {
>>> + log_debug("%s: gateway %s: label is too long",
>>> + __func__, gwname);
>>> + return (-1);
>>> + }
>>> +
>>> + rm.rm_hdr.rtm_addrs |= RTA_LABEL;
>>> + iov[iovcnt].iov_base = &sr;
>>> + iov[iovcnt].iov_len = sizeof(sr);
>>> + iovcnt++;
>>> +
>>> + len += sizeof(sr);
>>> + }
>>> +
>>> + rm.rm_hdr.rtm_msglen = len;
>>>
>>> retry:
>>> - if (write(env->sc_rtsock, &rm, len) == -1) {
>>> + if (writev(env->sc_rtsock, iov, iovcnt) == -1) {
>>> switch (errno) {
>>> case EEXIST:
>>> case ESRCH:
>>> Index: relayd.conf.5
>>> ===================================================================
>>> RCS file: /cvs/src/usr.sbin/relayd/relayd.conf.5,v
>>> retrieving revision 1.161
>>> diff -u -p -r1.161 relayd.conf.5
>>> --- relayd.conf.5 9 Mar 2015 17:20:38 -0000 1.161
>>> +++ relayd.conf.5 14 May 2015 11:30:28 -0000
>>> @@ -204,12 +204,6 @@ starting with 1; it can be shown with th
>>> .Xr relayctl 8
>>> .Ic show summary
>>> commands.
>>> -.It Ic priority Ar number
>>> -Change the route priority used when adding a route.
>>> -If not specified, the kernel will set a priority of 8 (RTP_STATIC).
>>> -In ordinary use, a fallback route should be added statically with a very
>>> -high (e.g. 52) priority.
>>> -Unused in all other modes.
>>> .It Ic retry Ar number
>>> The optional retry option adds a tolerance for failed host checks;
>>> the check will be retried for
>>> @@ -1384,10 +1378,16 @@ This entry is mandatory and must be spec
>>> .It Xo
>>> .Ic route
>>> .Ar address Ns Li / Ns Ar prefix
>>> +.Op Ic interface Ar name
>>> +.Op Ic priority Ar number
>>> +.Op Ic rtlabel Ar label
>>> .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.
>>> +An interface, a priority, and a route label can optionally be specified
>>> +for the route.
>>> +.Pp
>>> +At least one route must be specified in a router directive.
>>
>> You replaced it with a very brief description of "priority".
>>
>>> .It Ic rtable Ar id
>>> Add the routes to the kernel routing table with the specified
>>> .Ar id .
>>> Index: relayd.h
>>> ===================================================================
>>> RCS file: /cvs/src/usr.sbin/relayd/relayd.h,v
>>> retrieving revision 1.209
>>> diff -u -p -r1.209 relayd.h
>>> --- relayd.h 2 May 2015 13:15:24 -0000 1.209
>>> +++ relayd.h 14 May 2015 11:30:28 -0000
>>> @@ -398,7 +399,6 @@ struct host_config {
>>> char name[HOST_NAME_MAX+1];
>>> struct sockaddr_storage ss;
>>> int ttl;
>>> - int priority;
>>> };
>>>
>>> struct host {
>>> @@ -803,6 +803,9 @@ struct netroute_config {
>>> objid_t id;
>>> struct sockaddr_storage ss;
>>> int prefixlen;
>>> + char ifname[IFNAMSIZ];
>>> + char label[RT_LABEL_SIZE];
>>> + int priority;
>>> objid_t routerid;
>>> };
>>>
>>> @@ -820,8 +823,6 @@ struct router_config {
>>> objid_t id;
>>> u_int32_t flags;
>>> char name[HOST_NAME_MAX+1];
>>> - char label[RT_LABEL_SIZE];
>>> - int nroutes;
>>
>> Why are you removing nroutes? It is good for statistics etc.
>
> i cant remember :(
>
>>
>>> objid_t gwtable;
>>> in_port_t gwport;
>>> int rtable;
>>> Index: snmp.c
>>> ===================================================================
>>> RCS file: /cvs/src/usr.sbin/relayd/snmp.c,v
>>> retrieving revision 1.23
>>> diff -u -p -r1.23 snmp.c
>>> --- snmp.c 22 Jan 2015 17:42:09 -0000 1.23
>>> +++ snmp.c 14 May 2015 11:30:28 -0000
>>> @@ -1380,8 +1380,7 @@ snmp_router(struct relayd *env, struct s
>>> break;
>>> case 5: /* pf label */
>>> if (snmp_agentx_varbind(resp, oid,
>>> - AGENTX_OCTET_STRING, router->rt_conf.label,
>>> - strlen(router->rt_conf.label)) == -1)
>>> + AGENTX_OCTET_STRING, "", 0) == -1)
>>
>> The snmp part would need more work.
>>
>>> return (-1);
>>> break;
>>> case 6: /* rtable */
>>>
>>
>> --