]> rtime.felk.cvut.cz Git - lisovros/iproute2_canprio.git/blobdiff - ip/ipxfrm.c
Add reference to tc-codel(8) to the SEE ALSO section
[lisovros/iproute2_canprio.git] / ip / ipxfrm.c
index cc4dc803cd7207be82afd71ff843a342a0a004e7..c7b342060b932a2aa5519a2436ce30490cf806bc 100644 (file)
@@ -59,8 +59,8 @@ static void usage(void) __attribute__((noreturn));
 static void usage(void)
 {
        fprintf(stderr,
-               "Usage: ip xfrm XFRM_OBJECT { COMMAND | help }\n"
-               "where  XFRM_OBJECT := { state | policy | monitor }\n");
+               "Usage: ip xfrm XFRM-OBJECT { COMMAND | help }\n"
+               "where  XFRM-OBJECT := state | policy | monitor\n");
        exit(-1);
 }
 
@@ -155,6 +155,7 @@ const char *strxf_xfrmproto(__u8 proto)
 static const struct typeent algo_types[]= {
        { "enc", XFRMA_ALG_CRYPT }, { "auth", XFRMA_ALG_AUTH },
        { "comp", XFRMA_ALG_COMP }, { "aead", XFRMA_ALG_AEAD },
+       { "auth-trunc", XFRMA_ALG_AUTH_TRUNC },
        { NULL, -1 }
 };
 
@@ -570,6 +571,25 @@ static void xfrm_aead_print(struct xfrm_algo_aead *algo, int len,
        fprintf(fp, "%s", _SL_);
 }
 
+static void xfrm_auth_trunc_print(struct xfrm_algo_auth *algo, int len,
+                                 FILE *fp, const char *prefix)
+{
+       struct {
+               struct xfrm_algo algo;
+               char key[algo->alg_key_len / 8];
+       } base;
+
+       memcpy(base.algo.alg_name, algo->alg_name, sizeof(base.algo.alg_name));
+       base.algo.alg_key_len = algo->alg_key_len;
+       memcpy(base.algo.alg_key, algo->alg_key, algo->alg_key_len / 8);
+
+       __xfrm_algo_print(&base.algo, XFRMA_ALG_AUTH_TRUNC, len, fp, prefix, 0);
+
+       fprintf(fp, " %d", algo->alg_trunc_len);
+
+       fprintf(fp, "%s", _SL_);
+}
+
 static void xfrm_tmpl_print(struct xfrm_user_tmpl *tmpls, int len,
                            __u16 family, FILE *fp, const char *prefix)
 {
@@ -677,12 +697,18 @@ void xfrm_xfrma_print(struct rtattr *tb[], __u16 family,
                fprintf(fp, "\tmark %d/0x%x\n", m->v, m->m);
        }
 
-       if (tb[XFRMA_ALG_AUTH]) {
+       if (tb[XFRMA_ALG_AUTH] && !tb[XFRMA_ALG_AUTH_TRUNC]) {
                struct rtattr *rta = tb[XFRMA_ALG_AUTH];
                xfrm_algo_print((struct xfrm_algo *) RTA_DATA(rta),
                                XFRMA_ALG_AUTH, RTA_PAYLOAD(rta), fp, prefix);
        }
 
+       if (tb[XFRMA_ALG_AUTH_TRUNC]) {
+               struct rtattr *rta = tb[XFRMA_ALG_AUTH_TRUNC];
+               xfrm_auth_trunc_print((struct xfrm_algo_auth *) RTA_DATA(rta),
+                                     RTA_PAYLOAD(rta), fp, prefix);
+       }
+
        if (tb[XFRMA_ALG_AEAD]) {
                struct rtattr *rta = tb[XFRMA_ALG_AEAD];
                xfrm_aead_print((struct xfrm_algo_aead *)RTA_DATA(rta),
@@ -780,7 +806,7 @@ void xfrm_xfrma_print(struct rtattr *tb[], __u16 family,
                        return;
                }
 
-               lastused = *(__u64 *)RTA_DATA(tb[XFRMA_LASTUSED]);
+               lastused = rta_getattr_u64(tb[XFRMA_LASTUSED]);
 
                fprintf(fp, "%s", strxf_time(lastused));
                fprintf(fp, "%s", _SL_);
@@ -828,6 +854,7 @@ void xfrm_state_info_print(struct xfrm_usersa_info *xsinfo,
                XFRM_FLAG_PRINT(fp, flags, XFRM_STATE_WILDRECV, "wildrecv");
                XFRM_FLAG_PRINT(fp, flags, XFRM_STATE_ICMP, "icmp");
                XFRM_FLAG_PRINT(fp, flags, XFRM_STATE_AF_UNSPEC, "af-unspec");
+               XFRM_FLAG_PRINT(fp, flags, XFRM_STATE_ALIGN4, "align4");
                if (flags)
                        fprintf(fp, "%x", flags);
        }
@@ -954,6 +981,7 @@ void xfrm_policy_info_print(struct xfrm_userpolicy_info *xpinfo,
 
                fprintf(fp, "flag ");
                XFRM_FLAG_PRINT(fp, flags, XFRM_POLICY_LOCALOK, "localok");
+               XFRM_FLAG_PRINT(fp, flags, XFRM_POLICY_ICMP, "icmp");
                if (flags)
                        fprintf(fp, "%x", flags);
        }
@@ -1012,7 +1040,7 @@ int xfrm_id_parse(xfrm_address_t *saddr, struct xfrm_id *id, __u16 *family,
 
                        ret = xfrm_xfrmproto_getbyname(*argv);
                        if (ret < 0)
-                               invarg("\"XFRM_PROTO\" is invalid", *argv);
+                               invarg("\"XFRM-PROTO\" is invalid", *argv);
 
                        id->proto = (__u8)ret;
 
@@ -1044,7 +1072,7 @@ int xfrm_id_parse(xfrm_address_t *saddr, struct xfrm_id *id, __u16 *family,
                invarg("the same address family is required between \"src\" and \"dst\"", *argv);
 
        if (loose == 0 && id->proto == 0)
-               missarg("XFRM_PROTO");
+               missarg("XFRM-PROTO");
        if (argc == *argcp)
                missarg("ID");