summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2018-09-23 17:24:59 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2018-09-23 17:24:59 +0200
commit259ce5e3de215c1354c1f74924336adc83312850 (patch)
tree795d4abef3bf9b6187931c040b73a6f8a6102b6b
parent1d4a36c69913f117516b0f062745fe95d35545ba (diff)
downloadplan9front-259ce5e3de215c1354c1f74924336adc83312850.tar.xz
devip: make updating ra6 router parameters atomic
when we fail to parse and validate the command, no update should take place.
-rw-r--r--sys/src/9/ip/ipifc.c45
1 files changed, 26 insertions, 19 deletions
diff --git a/sys/src/9/ip/ipifc.c b/sys/src/9/ip/ipifc.c
index 302d72df7..df0402109 100644
--- a/sys/src/9/ip/ipifc.c
+++ b/sys/src/9/ip/ipifc.c
@@ -753,37 +753,42 @@ ipifcconnect(Conv* c, char **argv, int argc)
char*
ipifcra6(Ipifc *ifc, char **argv, int argc)
{
- int i, argsleft, vmax = ifc->rp.maxraint, vmin = ifc->rp.minraint;
+ int i, argsleft;
+ uchar sendra, recvra;
+ Routerparams rp;
- argsleft = argc - 1;
i = 1;
-
- if(argsleft % 2 != 0)
+ argsleft = argc - 1;
+ if((argsleft % 2) != 0)
return Ebadarg;
+ sendra = ifc->sendra6;
+ recvra = ifc->recvra6;
+ rp = ifc->rp;
+
while (argsleft > 1) {
if(strcmp(argv[i], "recvra") == 0)
- ifc->recvra6 = (atoi(argv[i+1]) != 0);
+ recvra = (atoi(argv[i+1]) != 0);
else if(strcmp(argv[i], "sendra") == 0)
- ifc->sendra6 = (atoi(argv[i+1]) != 0);
+ sendra = (atoi(argv[i+1]) != 0);
else if(strcmp(argv[i], "mflag") == 0)
- ifc->rp.mflag = (atoi(argv[i+1]) != 0);
+ rp.mflag = (atoi(argv[i+1]) != 0);
else if(strcmp(argv[i], "oflag") == 0)
- ifc->rp.oflag = (atoi(argv[i+1]) != 0);
+ rp.oflag = (atoi(argv[i+1]) != 0);
else if(strcmp(argv[i], "maxraint") == 0)
- ifc->rp.maxraint = atoi(argv[i+1]);
+ rp.maxraint = atoi(argv[i+1]);
else if(strcmp(argv[i], "minraint") == 0)
- ifc->rp.minraint = atoi(argv[i+1]);
+ rp.minraint = atoi(argv[i+1]);
else if(strcmp(argv[i], "linkmtu") == 0)
- ifc->rp.linkmtu = atoi(argv[i+1]);
+ rp.linkmtu = atoi(argv[i+1]);
else if(strcmp(argv[i], "reachtime") == 0)
- ifc->rp.reachtime = atoi(argv[i+1]);
+ rp.reachtime = atoi(argv[i+1]);
else if(strcmp(argv[i], "rxmitra") == 0)
- ifc->rp.rxmitra = atoi(argv[i+1]);
+ rp.rxmitra = atoi(argv[i+1]);
else if(strcmp(argv[i], "ttl") == 0)
- ifc->rp.ttl = atoi(argv[i+1]);
+ rp.ttl = atoi(argv[i+1]);
else if(strcmp(argv[i], "routerlt") == 0)
- ifc->rp.routerlt = atoi(argv[i+1]);
+ rp.routerlt = atoi(argv[i+1]);
else
return Ebadarg;
@@ -792,11 +797,13 @@ ipifcra6(Ipifc *ifc, char **argv, int argc)
}
/* consistency check */
- if(ifc->rp.maxraint < ifc->rp.minraint) {
- ifc->rp.maxraint = vmax;
- ifc->rp.minraint = vmin;
+ if(rp.maxraint < rp.minraint)
return Ebadarg;
- }
+
+ ifc->rp = rp;
+ ifc->sendra6 = sendra;
+ ifc->recvra6 = recvra;
+
return nil;
}