netlink: Add a macro to set policy message with format string
authorShay Agroskin <shayagr@amazon.com>
Thu, 23 Mar 2023 16:36:04 +0000 (18:36 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 28 Mar 2023 02:49:58 +0000 (19:49 -0700)
Similar to NL_SET_ERR_MSG_FMT, add a macro which sets netlink policy
error message with a format string.

Signed-off-by: Shay Agroskin <shayagr@amazon.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/linux/netlink.h

index 3e874325216752c0907c2c59f8b7ea811fdb7dc1..19c0791ed9d56f1b6ffe5d1bde79b3332de77f51 100644 (file)
@@ -161,9 +161,31 @@ struct netlink_ext_ack {
        }                                                       \
 } while (0)
 
+#define NL_SET_ERR_MSG_ATTR_POL_FMT(extack, attr, pol, fmt, args...) do {      \
+       struct netlink_ext_ack *__extack = (extack);                            \
+                                                                               \
+       if (!__extack)                                                          \
+               break;                                                          \
+                                                                               \
+       if (snprintf(__extack->_msg_buf, NETLINK_MAX_FMTMSG_LEN,                \
+                    "%s" fmt "%s", "", ##args, "") >=                          \
+           NETLINK_MAX_FMTMSG_LEN)                                             \
+               net_warn_ratelimited("%s" fmt "%s", "truncated extack: ",       \
+                                    ##args, "\n");                             \
+                                                                               \
+       do_trace_netlink_extack(__extack->_msg_buf);                            \
+                                                                               \
+       __extack->_msg = __extack->_msg_buf;                                    \
+       __extack->bad_attr = (attr);                                            \
+       __extack->policy = (pol);                                               \
+} while (0)
+
 #define NL_SET_ERR_MSG_ATTR(extack, attr, msg)         \
        NL_SET_ERR_MSG_ATTR_POL(extack, attr, NULL, msg)
 
+#define NL_SET_ERR_MSG_ATTR_FMT(extack, attr, msg, args...) \
+       NL_SET_ERR_MSG_ATTR_POL_FMT(extack, attr, NULL, msg, ##args)
+
 #define NL_SET_ERR_ATTR_MISS(extack, nest, type)  do { \
        struct netlink_ext_ack *__extack = (extack);    \
                                                        \