Also I wrote problem report 211717.
2016-08-07 02:28:55 <ERR> KRT: Error sending route 10.120.1.98/32 to kernel: Address family not supported by protocol family
got message of size 128 on Sun Aug 7 19:52:27 2016 RTM_ADD: Add Route: len 128, pid: 3683, seq 312, errno 22, flags:<UP,GATEWAY,HOST,PROTO1> locks: inits: sockaddrs: <DST,GATEWAY> pmsg_addrs: truncated route message, only 36 bytes left
Incorrect packing of route message to kernel.
--- ./sysdep/bsd/krt-sock.c.orig 2016-04-29 11:13:23.000000000 +0200 +++ ./sysdep/bsd/krt-sock.c 2016-08-08 00:12:32.516209000 +0200 @@ -167,13 +167,14 @@ struct ks_msg { struct rt_msghdr rtm; - struct sockaddr_storage buf[RTAX_MAX]; + struct sockaddr_in buf[RTAX_MAX]; }; #define ROUNDUP(a) \ ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) -#define NEXTADDR(w, u) \ +#define __NEXTADDR(w, u) \ if (msg.rtm.rtm_addrs & (w)) {\ l = ROUNDUP(((struct sockaddr *)&(u))->sa_len);\ memmove(body, &(u), l); body += l;} @@ -185,6 +186,17 @@ memcpy(p, body, (l > sizeof(*p) ? sizeof(*p) : l));\ body += l;} + +#define NEXTADDR(w, u) \ + if (msg.rtm.rtm_addrs & (w)) { \ + l = (((struct sockaddr *)&(u))->sa_len == 0) ? \ + sizeof(long) : \ + 1 + ((((struct sockaddr *)&(u))->sa_len - 1) \ + | (sizeof(long) - 1)); \ + memmove(body, &(u), l); body += l; \ + } + + static int krt_send_route(struct krt_proto *p, int cmd, rte *e) {
# route -nv monitor ... got message of size 140 on Sun Aug 7 16:57:43 2016 RTM_ADD: Add Route: len 140, pid: 8102, seq 82, errno 0, flags:<UP,GATEWAY,DONE,PROTO1> locks: inits: sockaddrs: <DST,GATEWAY,NETMASK> 10.255.252.172 192.168.58.1 255.255.255.252 got message of size 124 on Sun Aug 7 16:57:43 2016 RTM_ADD: Add Route: len 124, pid: 8102, seq 83, errno 0, flags:<UP,GATEWAY,HOST,DONE,PROTO1> locks: inits: sockaddrs: <DST,GATEWAY> 10.120.65.4 192.168.58.1