]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - ip/ipxfrm.c
Merge branch 'iproute2-master' into iproute2-next
[mirror_iproute2.git] / ip / ipxfrm.c
index d5eb22e25476a38d990766bed9e1bc9d0333acb0..2dea4e37f209ee49643debbd679e75a373d81a58 100644 (file)
 #include "ip_common.h"
 
 #define STRBUF_SIZE    (128)
-#define STRBUF_CAT(buf, str) \
-       do { \
-               int rest = sizeof(buf) - 1 - strlen(buf); \
-               if (rest > 0) { \
-                       int len = strlen(str); \
-                       if (len > rest) \
-                               len = rest; \
-                       strncat(buf, str, len); \
-                       buf[sizeof(buf) - 1] = '\0'; \
-               } \
-       } while (0);
 
 struct xfrm_filter filter;
 
@@ -197,7 +186,7 @@ const char *strxf_algotype(int type)
        return str;
 }
 
-const char *strxf_mask8(__u8 mask)
+static const char *strxf_mask8(__u8 mask)
 {
        static char str[16];
        const int sn = sizeof(mask) * 8 - 1;
@@ -220,7 +209,7 @@ const char *strxf_mask32(__u32 mask)
        return str;
 }
 
-const char *strxf_share(__u8 share)
+static const char *strxf_share(__u8 share)
 {
        static char str[32];
 
@@ -281,7 +270,7 @@ const char *strxf_ptype(__u8 ptype)
        return str;
 }
 
-void xfrm_id_info_print(xfrm_address_t *saddr, struct xfrm_id *id,
+static void xfrm_id_info_print(xfrm_address_t *saddr, struct xfrm_id *id,
                        __u8 mode, __u32 reqid, __u16 family, int force_spi,
                        FILE *fp, const char *prefix, const char *title)
 {
@@ -348,7 +337,8 @@ static const char *strxf_limit(__u64 limit)
        return str;
 }
 
-void xfrm_stats_print(struct xfrm_stats *s, FILE *fp, const char *prefix)
+static void xfrm_stats_print(struct xfrm_stats *s, FILE *fp,
+                            const char *prefix)
 {
        if (prefix)
                fputs(prefix, fp);
@@ -382,7 +372,7 @@ static const char *strxf_time(__u64 time)
        return str;
 }
 
-void xfrm_lifetime_print(struct xfrm_lifetime_cfg *cfg,
+static void xfrm_lifetime_print(struct xfrm_lifetime_cfg *cfg,
                         struct xfrm_lifetime_cur *cur,
                         FILE *fp, const char *prefix)
 {
@@ -648,6 +638,13 @@ static void xfrm_tmpl_print(struct xfrm_user_tmpl *tmpls, int len,
        }
 }
 
+static void xfrm_output_mark_print(struct rtattr *tb[], FILE *fp)
+{
+       __u32 output_mark = rta_getattr_u32(tb[XFRMA_OUTPUT_MARK]);
+
+       fprintf(fp, "output-mark 0x%x", output_mark);
+}
+
 int xfrm_parse_mark(struct xfrm_mark *mark, int *argcp, char ***argvp)
 {
        int argc = *argcp;
@@ -688,7 +685,15 @@ void xfrm_xfrma_print(struct rtattr *tb[], __u16 family,
                struct rtattr *rta = tb[XFRMA_MARK];
                struct xfrm_mark *m = RTA_DATA(rta);
 
-               fprintf(fp, "\tmark %#x/%#x", m->v, m->m);
+               fprintf(fp, "\tmark %#x/%#x ", m->v, m->m);
+
+               if (tb[XFRMA_OUTPUT_MARK])
+                       xfrm_output_mark_print(tb, fp);
+               fprintf(fp, "%s", _SL_);
+       } else if (tb[XFRMA_OUTPUT_MARK]) {
+               fprintf(fp, "\t");
+
+               xfrm_output_mark_print(tb, fp);
                fprintf(fp, "%s", _SL_);
        }
 
@@ -902,8 +907,8 @@ void xfrm_state_info_print(struct xfrm_usersa_info *xsinfo,
                           prefix, title);
 
        if (prefix)
-               STRBUF_CAT(buf, prefix);
-       STRBUF_CAT(buf, "\t");
+               strlcat(buf, prefix, sizeof(buf));
+       strlcat(buf, "\t", sizeof(buf));
 
        fputs(buf, fp);
        fprintf(fp, "replay-window %u ", xsinfo->replay_window);
@@ -944,7 +949,7 @@ void xfrm_state_info_print(struct xfrm_usersa_info *xsinfo,
                char sbuf[STRBUF_SIZE];
 
                memcpy(sbuf, buf, sizeof(sbuf));
-               STRBUF_CAT(sbuf, "sel ");
+               strlcat(sbuf, "sel ", sizeof(sbuf));
 
                xfrm_selector_print(&xsinfo->sel, xsinfo->family, fp, sbuf);
        }
@@ -992,8 +997,8 @@ void xfrm_policy_info_print(struct xfrm_userpolicy_info *xpinfo,
        }
 
        if (prefix)
-               STRBUF_CAT(buf, prefix);
-       STRBUF_CAT(buf, "\t");
+               strlcat(buf, prefix, sizeof(buf));
+       strlcat(buf, "\t", sizeof(buf));
 
        fputs(buf, fp);
        if (xpinfo->dir >= XFRM_POLICY_MAX) {