ref: 6e4a1fda8c6105bc18aa7c26ff1fd28e18fec986
parent: d2a7d886624c56673a6d7ba7d6a7958d2be5b867
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Mar 13 13:16:54 EDT 2022
devip: allow setting the "trans" flag on a logical interface This makes the interface route have the "t"-flag, which causes packets routed to the interface to get source translated.
--- a/sys/src/9/ip/ipifc.c
+++ b/sys/src/9/ip/ipifc.c
@@ -465,8 +465,10 @@
memset(rem, 0, IPaddrlen);
switch(argc){
case 6:
- if(strcmp(argv[5], "proxy") == 0)
+ if(strstr(argv[5], "proxy") != 0)
type |= Rproxy;
+ if(strstr(argv[5], "trans") != 0)
+ type |= Rtrans;
/* fall through */
case 5:
mtu = strtoul(argv[4], 0, 0);
@@ -523,7 +525,7 @@
if(!lifc->onlink && lifcp->onlink){
lifc->onlink = 1;
addroute(f, lifc->remote, lifc->mask, ip, IPallbits,
- lifc->remote, lifc->type, ifc, tifc);
+ lifc->remote, lifc->type&~Rtrans, ifc, tifc);
if(v6addrtype(ip) != linklocalv6)
addroute(f, lifc->remote, lifc->mask, ip, IPnoaddr,
lifc->remote, lifc->type, ifc, tifc);
@@ -569,7 +571,7 @@
/* add route for this logical interface */
if(lifc->onlink){
- addroute(f, rem, mask, ip, IPallbits, rem, type, ifc, tifc);
+ addroute(f, rem, mask, ip, IPallbits, rem, type&~Rtrans, ifc, tifc);
if(v6addrtype(ip) != linklocalv6)
addroute(f, rem, mask, ip, IPnoaddr, rem, type, ifc, tifc);
}
@@ -664,7 +666,7 @@
if(lifc->onlink){
remroute(f, lifc->remote, lifc->mask,
lifc->local, IPallbits,
- lifc->remote, lifc->type, ifc, tifc);
+ lifc->remote, lifc->type&~Rtrans, ifc, tifc);
if(v6addrtype(lifc->local) != linklocalv6)
remroute(f, lifc->remote, lifc->mask,
lifc->local, IPnoaddr,
@@ -907,6 +909,8 @@
int h;
type |= (lifc->type & Rv4);
+ type &= ~Rtrans;
+
qlock(f->self);
if(waserror()){
qunlock(f->self);