]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - ip/xfrm_state.c
ipnetns: parse nsid as a signed integer
[mirror_iproute2.git] / ip / xfrm_state.c
index 85d959cc4f44f12578f830623f5a5097558eb55e..e8c0174629161db1f43a6ee0304740bd7cf507c9 100644 (file)
@@ -61,6 +61,7 @@ static void usage(void)
        fprintf(stderr, "        [ flag FLAG-LIST ] [ sel SELECTOR ] [ LIMIT-LIST ] [ encap ENCAP ]\n");
        fprintf(stderr, "        [ coa ADDR[/PLEN] ] [ ctx CTX ] [ extra-flag EXTRA-FLAG-LIST ]\n");
        fprintf(stderr, "        [ offload [dev DEV] dir DIR ]\n");
+       fprintf(stderr, "        [ output-mark OUTPUT-MARK ]\n");
        fprintf(stderr, "Usage: ip xfrm state allocspi ID [ mode MODE ] [ mark MARK [ mask MASK ] ]\n");
        fprintf(stderr, "        [ reqid REQID ] [ seq SEQ ] [ min SPI max SPI ]\n");
        fprintf(stderr, "Usage: ip xfrm state { delete | get } ID [ mark MARK [ mask MASK ] ]\n");
@@ -322,6 +323,7 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
                struct xfrm_user_sec_ctx sctx;
                char    str[CTX_BUF_SIZE];
        } ctx = {};
+       __u32 output_mark = 0;
 
        while (argc > 0) {
                if (strcmp(*argv, "mode") == 0) {
@@ -437,6 +439,10 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
                                invarg("value after \"offload dir\" is invalid", *argv);
                                is_offload = false;
                        }
+               } else if (strcmp(*argv, "output-mark") == 0) {
+                       NEXT_ARG();
+                       if (get_u32(&output_mark, *argv, 0))
+                               invarg("value after \"output-mark\" is invalid", *argv);
                } else {
                        /* try to assume ALGO */
                        int type = xfrm_algotype_getbyname(*argv);
@@ -720,6 +726,9 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
                }
        }
 
+       if (output_mark)
+               addattr32(&req.n, sizeof(req.buf), XFRMA_OUTPUT_MARK, output_mark);
+
        if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0)
                exit(1);
 
@@ -860,7 +869,7 @@ static int xfrm_state_allocspi(int argc, char **argv)
        if (rtnl_talk(&rth, &req.n, &answer) < 0)
                exit(2);
 
-       if (xfrm_state_print(NULL, answer, (void *)stdout) < 0) {
+       if (xfrm_state_print(answer, (void *)stdout) < 0) {
                fprintf(stderr, "An error :-)\n");
                exit(1);
        }
@@ -899,8 +908,7 @@ static int xfrm_state_filter_match(struct xfrm_usersa_info *xsinfo)
        return 1;
 }
 
-int xfrm_state_print(const struct sockaddr_nl *who, struct nlmsghdr *n,
-                    void *arg)
+int xfrm_state_print(struct nlmsghdr *n, void *arg)
 {
        FILE *fp = (FILE *)arg;
        struct rtattr *tb[XFRMA_MAX+1];
@@ -920,7 +928,7 @@ int xfrm_state_print(const struct sockaddr_nl *who, struct nlmsghdr *n,
        }
 
        if (n->nlmsg_type == XFRM_MSG_DELSA) {
-               /* Dont blame me for this .. Herbert made me do it */
+               /* Don't blame me for this .. Herbert made me do it */
                xsid = NLMSG_DATA(n);
                len -= NLMSG_SPACE(sizeof(*xsid));
        } else if (n->nlmsg_type == XFRM_MSG_EXPIRE) {
@@ -1054,7 +1062,7 @@ static int xfrm_state_get_or_delete(int argc, char **argv, int delete)
                if (rtnl_talk(&rth, &req.n, &answer) < 0)
                        exit(2);
 
-               if (xfrm_state_print(NULL, answer, (void *)stdout) < 0) {
+               if (xfrm_state_print(answer, (void *)stdout) < 0) {
                        fprintf(stderr, "An error :-)\n");
                        exit(1);
                }
@@ -1071,9 +1079,7 @@ static int xfrm_state_get_or_delete(int argc, char **argv, int delete)
  * With an existing state of nlmsg, make new nlmsg for deleting the state
  * and store it to buffer.
  */
-static int xfrm_state_keep(const struct sockaddr_nl *who,
-                          struct nlmsghdr *n,
-                          void *arg)
+static int xfrm_state_keep(struct nlmsghdr *n, void *arg)
 {
        struct xfrm_buffer *xb = (struct xfrm_buffer *)arg;
        struct rtnl_handle *rth = xb->rth;