idiag: deprecate IDIAG_ATTR_* enumeration
IDIAG_ATTR_* were a copy of the INET_DIAG_* extension kernel flags. Redefining them is wrong, user space should continue to use the values provided via the kernel headers. Also they were misused as change flags (ce_mask), which they are not. Deprecate the IDIAG_ATTR_* flags and redefine them to what the originally are: INET_DIAG_*. Also deprecated idiagnl_attrs2str() because there is already idiagnl_exts2str(). idiagnl_attrs2str() in the sense of libnl change flags (ce_mask) makes no sense. Acked-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: Thomas Haller <thaller@redhat.com>
This commit is contained in:
parent
cd8cd2dae2
commit
22eb2569a5
3 changed files with 76 additions and 78 deletions
|
@ -55,25 +55,26 @@ enum {
|
||||||
/**
|
/**
|
||||||
* Inet Diag extended attributes
|
* Inet Diag extended attributes
|
||||||
* @ingroup idiag
|
* @ingroup idiag
|
||||||
*/
|
* @deprecated These attributes should not be used. They mirror the
|
||||||
|
* INET_DIAG_* extension flags from kernel headers. Use those instead. */
|
||||||
enum {
|
enum {
|
||||||
IDIAG_ATTR_NONE,
|
IDIAG_ATTR_NONE = 0, /* INET_DIAG_NONE */
|
||||||
IDIAG_ATTR_MEMINFO,
|
IDIAG_ATTR_MEMINFO = 1, /* INET_DIAG_MEMINFO */
|
||||||
IDIAG_ATTR_INFO,
|
IDIAG_ATTR_INFO = 2, /* INET_DIAG_INFO */
|
||||||
IDIAG_ATTR_VEGASINFO,
|
IDIAG_ATTR_VEGASINFO = 3, /* INET_DIAG_VEGASINFO */
|
||||||
IDIAG_ATTR_CONG,
|
IDIAG_ATTR_CONG = 4, /* INET_DIAG_CONG */
|
||||||
IDIAG_ATTR_TOS,
|
IDIAG_ATTR_TOS = 5, /* INET_DIAG_TOS */
|
||||||
IDIAG_ATTR_TCLASS,
|
IDIAG_ATTR_TCLASS = 6, /* INET_DIAG_TCLASS */
|
||||||
IDIAG_ATTR_SKMEMINFO,
|
IDIAG_ATTR_SKMEMINFO = 7, /* INET_DIAG_SKMEMINFO */
|
||||||
IDIAG_ATTR_SHUTDOWN,
|
IDIAG_ATTR_SHUTDOWN = 8, /* INET_DIAG_SHUTDOWN */
|
||||||
IDIAG_ATTR_MAX,
|
|
||||||
|
/* IDIAG_ATTR_MAX was wrong, because it did not correspond to
|
||||||
|
* INET_DIAG_MAX. Anyway, freeze it to the previous value. */
|
||||||
|
IDIAG_ATTR_MAX = 9,
|
||||||
|
|
||||||
|
IDIAG_ATTR_ALL = (1<<IDIAG_ATTR_MAX) - 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Macro to represent all socket attributes.
|
|
||||||
* @ingroup idiag
|
|
||||||
*/
|
|
||||||
#define IDIAG_ATTR_ALL ((1<<IDIAG_ATTR_MAX)-1)
|
|
||||||
|
|
||||||
/* Keep these only for compatibility, DO NOT USE THEM */
|
/* Keep these only for compatibility, DO NOT USE THEM */
|
||||||
#define IDIAG_SK_MEMINFO_RMEM_ALLOC SK_MEMINFO_RMEM_ALLOC
|
#define IDIAG_SK_MEMINFO_RMEM_ALLOC SK_MEMINFO_RMEM_ALLOC
|
||||||
|
|
|
@ -159,27 +159,41 @@ int idiagnl_str2timer(const char *name)
|
||||||
return __str2type(name, idiag_timers, ARRAY_SIZE(idiag_timers));
|
return __str2type(name, idiag_timers, ARRAY_SIZE(idiag_timers));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct trans_tbl idiag_attrs[] = {
|
static const struct trans_tbl idiag_exts[] = {
|
||||||
__ADD(IDIAG_ATTR_NONE, none),
|
__ADD(INET_DIAG_NONE, none),
|
||||||
__ADD(IDIAG_ATTR_MEMINFO, meminfo),
|
__ADD(INET_DIAG_MEMINFO, meminfo),
|
||||||
__ADD(IDIAG_ATTR_INFO, info),
|
__ADD(INET_DIAG_INFO, info),
|
||||||
__ADD(IDIAG_ATTR_VEGASINFO, vegasinfo),
|
__ADD(INET_DIAG_VEGASINFO, vegasinfo),
|
||||||
__ADD(IDIAG_ATTR_CONG, congestion),
|
__ADD(INET_DIAG_CONG, congestion),
|
||||||
__ADD(IDIAG_ATTR_TOS, tos),
|
__ADD(INET_DIAG_TOS, tos),
|
||||||
__ADD(IDIAG_ATTR_TCLASS, tclass),
|
__ADD(INET_DIAG_TCLASS, tclass),
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert inetdiag extended attributes to strings.
|
* Convert inet diag extension flags to a string.
|
||||||
* @arg attrs inetdiag attribute (e.g., IDIAG_ATTR_MEMINFO)
|
* @arg attrs inet diag extension flag (e.g., INET_DIAG_MEMINFO)
|
||||||
* @arg buf output buffer which will hold string result
|
* @arg buf output buffer which will hold string result
|
||||||
* @arg len length in bytes of the output buffer
|
* @arg len length in bytes of the output buffer
|
||||||
*
|
*
|
||||||
* @return string representation of attrs or an empty string.
|
* @return string representation of attrs or an empty string.
|
||||||
|
* @deprecated This function returns almost the same as idiagnl_exts2str(),
|
||||||
|
* except that the latter only supports @attrs of uint8_t.
|
||||||
*/
|
*/
|
||||||
char *idiagnl_attrs2str(int attrs, char *buf, size_t len)
|
char *idiagnl_attrs2str(int attrs, char *buf, size_t len)
|
||||||
{
|
{
|
||||||
return __type2str(attrs, buf, len, idiag_attrs, ARRAY_SIZE(idiag_attrs));
|
return __flags2str(attrs, buf, len, idiag_exts, ARRAY_SIZE(idiag_exts));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert inet diag extension flags to a string.
|
||||||
|
* @arg attrs inet diag extension flags (e.g., (INET_DIAG_MEMINFO |
|
||||||
|
* INET_DIAG_CONG | INET_DIAG_TOS))
|
||||||
|
* @arg buf Output buffer to hold string representation
|
||||||
|
* @arg len length in bytes of the output buffer
|
||||||
|
*/
|
||||||
|
char *idiagnl_exts2str(uint8_t attrs, char *buf, size_t len)
|
||||||
|
{
|
||||||
|
return __flags2str(attrs, buf, len, idiag_exts, ARRAY_SIZE(idiag_exts));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct trans_tbl idiagnl_tcpstates[] = {
|
static const struct trans_tbl idiagnl_tcpstates[] = {
|
||||||
|
@ -248,27 +262,5 @@ char * idiagnl_shutdown2str(uint8_t shutdown, char *buf, size_t len)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct trans_tbl idiag_exts[] = {
|
|
||||||
__ADD(IDIAG_ATTR_NONE, none),
|
|
||||||
__ADD(IDIAG_ATTR_MEMINFO, meminfo),
|
|
||||||
__ADD(IDIAG_ATTR_INFO, info),
|
|
||||||
__ADD(IDIAG_ATTR_VEGASINFO, vegasinfo),
|
|
||||||
__ADD(IDIAG_ATTR_CONG, congestion),
|
|
||||||
__ADD(IDIAG_ATTR_TOS, tos),
|
|
||||||
__ADD(IDIAG_ATTR_TCLASS, tclass),
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert inet diag extension flags to a string.
|
|
||||||
* @arg attrs inet diag extension flags (e.g., (IDIAG_ATTR_MEMINFO |
|
|
||||||
* IDIAG_ATTR_CONG | IDIAG_ATTR_TOS))
|
|
||||||
* @arg buf Output buffer to hold string representation
|
|
||||||
* @arg len length in bytes of the output buffer
|
|
||||||
*/
|
|
||||||
char *idiagnl_exts2str(uint8_t attrs, char *buf, size_t len)
|
|
||||||
{
|
|
||||||
return __flags2str(attrs, buf, len, idiag_exts, ARRAY_SIZE(idiag_exts));
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -16,6 +16,9 @@
|
||||||
#include <netlink/idiag/vegasinfo.h>
|
#include <netlink/idiag/vegasinfo.h>
|
||||||
#include <linux/inet_diag.h>
|
#include <linux/inet_diag.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define _INET_DIAG_ALL ((1<<(INET_DIAG_MAX+1))-1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup idiag
|
* @ingroup idiag
|
||||||
* @defgroup idiagnl_msg Inet Diag Messages
|
* @defgroup idiagnl_msg Inet Diag Messages
|
||||||
|
@ -61,7 +64,7 @@ static int idiagnl_request_update(struct nl_cache *cache, struct nl_sock *sk)
|
||||||
int family = cache->c_iarg1;
|
int family = cache->c_iarg1;
|
||||||
int states = cache->c_iarg2;
|
int states = cache->c_iarg2;
|
||||||
|
|
||||||
return idiagnl_send_simple(sk, 0, family, states, IDIAG_ATTR_ALL);
|
return idiagnl_send_simple(sk, 0, family, states, _INET_DIAG_ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nl_cache_ops idiagnl_msg_ops = {
|
static struct nl_cache_ops idiagnl_msg_ops = {
|
||||||
|
@ -579,16 +582,16 @@ static int idiagnl_msg_clone(struct nl_object *_dst, struct nl_object *_src)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nla_policy ext_policy[IDIAG_ATTR_MAX] = {
|
static struct nla_policy ext_policy[INET_DIAG_MAX+1] = {
|
||||||
[IDIAG_ATTR_MEMINFO] = { .minlen = sizeof(struct inet_diag_meminfo) },
|
[INET_DIAG_MEMINFO] = { .minlen = sizeof(struct inet_diag_meminfo) },
|
||||||
[IDIAG_ATTR_INFO] = { .minlen = sizeof(struct tcp_info) },
|
[INET_DIAG_INFO] = { .minlen = sizeof(struct tcp_info) },
|
||||||
[IDIAG_ATTR_VEGASINFO] = { .minlen = sizeof(struct tcpvegas_info) },
|
[INET_DIAG_VEGASINFO] = { .minlen = sizeof(struct tcpvegas_info) },
|
||||||
[IDIAG_ATTR_CONG] = { .type = NLA_STRING },
|
[INET_DIAG_CONG] = { .type = NLA_STRING },
|
||||||
[IDIAG_ATTR_TOS] = { .type = NLA_U8 },
|
[INET_DIAG_TOS] = { .type = NLA_U8 },
|
||||||
[IDIAG_ATTR_TCLASS] = { .type = NLA_U8 },
|
[INET_DIAG_TCLASS] = { .type = NLA_U8 },
|
||||||
/* Older kernel doesn't have SK_MEMINFO_BACKLOG */
|
/* Older kernel doesn't have SK_MEMINFO_BACKLOG */
|
||||||
[IDIAG_ATTR_SKMEMINFO] = { .minlen = (sizeof(uint32_t) * (SK_MEMINFO_OPTMEM + 1)) },
|
[INET_DIAG_SKMEMINFO] = { .minlen = (sizeof(uint32_t) * (SK_MEMINFO_OPTMEM + 1)) },
|
||||||
[IDIAG_ATTR_SHUTDOWN] = { .type = NLA_U8 },
|
[INET_DIAG_SHUTDOWN] = { .type = NLA_U8 },
|
||||||
};
|
};
|
||||||
|
|
||||||
int idiagnl_msg_parse(struct nlmsghdr *nlh, struct idiagnl_msg **result)
|
int idiagnl_msg_parse(struct nlmsghdr *nlh, struct idiagnl_msg **result)
|
||||||
|
@ -596,14 +599,14 @@ int idiagnl_msg_parse(struct nlmsghdr *nlh, struct idiagnl_msg **result)
|
||||||
struct idiagnl_msg *msg = NULL;
|
struct idiagnl_msg *msg = NULL;
|
||||||
struct inet_diag_msg *raw_msg = NULL;
|
struct inet_diag_msg *raw_msg = NULL;
|
||||||
struct nl_addr *src = NULL, *dst = NULL;
|
struct nl_addr *src = NULL, *dst = NULL;
|
||||||
struct nlattr *tb[IDIAG_ATTR_MAX];
|
struct nlattr *tb[INET_DIAG_MAX+1];
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
msg = idiagnl_msg_alloc();
|
msg = idiagnl_msg_alloc();
|
||||||
if (!msg)
|
if (!msg)
|
||||||
goto errout_nomem;
|
goto errout_nomem;
|
||||||
|
|
||||||
err = nlmsg_parse(nlh, sizeof(struct inet_diag_msg), tb, IDIAG_ATTR_MAX - 1,
|
err = nlmsg_parse(nlh, sizeof(struct inet_diag_msg), tb, INET_DIAG_MAX,
|
||||||
ext_policy);
|
ext_policy);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto errout;
|
goto errout;
|
||||||
|
@ -644,23 +647,23 @@ int idiagnl_msg_parse(struct nlmsghdr *nlh, struct idiagnl_msg **result)
|
||||||
|
|
||||||
nl_addr_put(src);
|
nl_addr_put(src);
|
||||||
|
|
||||||
if (tb[IDIAG_ATTR_TOS])
|
if (tb[INET_DIAG_TOS])
|
||||||
msg->idiag_tos = nla_get_u8(tb[IDIAG_ATTR_TOS]);
|
msg->idiag_tos = nla_get_u8(tb[INET_DIAG_TOS]);
|
||||||
|
|
||||||
if (tb[IDIAG_ATTR_TCLASS])
|
if (tb[INET_DIAG_TCLASS])
|
||||||
msg->idiag_tclass = nla_get_u8(tb[IDIAG_ATTR_TCLASS]);
|
msg->idiag_tclass = nla_get_u8(tb[INET_DIAG_TCLASS]);
|
||||||
|
|
||||||
if (tb[IDIAG_ATTR_SHUTDOWN])
|
if (tb[INET_DIAG_SHUTDOWN])
|
||||||
msg->idiag_shutdown = nla_get_u8(tb[IDIAG_ATTR_SHUTDOWN]);
|
msg->idiag_shutdown = nla_get_u8(tb[INET_DIAG_SHUTDOWN]);
|
||||||
|
|
||||||
if (tb[IDIAG_ATTR_CONG])
|
if (tb[INET_DIAG_CONG])
|
||||||
msg->idiag_cong = nla_strdup(tb[IDIAG_ATTR_CONG]);
|
msg->idiag_cong = nla_strdup(tb[INET_DIAG_CONG]);
|
||||||
|
|
||||||
if (tb[IDIAG_ATTR_INFO])
|
if (tb[INET_DIAG_INFO])
|
||||||
nla_memcpy(&msg->idiag_tcpinfo, tb[IDIAG_ATTR_INFO],
|
nla_memcpy(&msg->idiag_tcpinfo, tb[INET_DIAG_INFO],
|
||||||
sizeof(msg->idiag_tcpinfo));
|
sizeof(msg->idiag_tcpinfo));
|
||||||
|
|
||||||
if (tb[IDIAG_ATTR_MEMINFO]) {
|
if (tb[INET_DIAG_MEMINFO]) {
|
||||||
struct idiagnl_meminfo *minfo = idiagnl_meminfo_alloc();
|
struct idiagnl_meminfo *minfo = idiagnl_meminfo_alloc();
|
||||||
struct inet_diag_meminfo *raw_minfo = NULL;
|
struct inet_diag_meminfo *raw_minfo = NULL;
|
||||||
|
|
||||||
|
@ -668,7 +671,7 @@ int idiagnl_msg_parse(struct nlmsghdr *nlh, struct idiagnl_msg **result)
|
||||||
goto errout_nomem;
|
goto errout_nomem;
|
||||||
|
|
||||||
raw_minfo = (struct inet_diag_meminfo *)
|
raw_minfo = (struct inet_diag_meminfo *)
|
||||||
nla_data(tb[IDIAG_ATTR_MEMINFO]);
|
nla_data(tb[INET_DIAG_MEMINFO]);
|
||||||
|
|
||||||
idiagnl_meminfo_set_rmem(minfo, raw_minfo->idiag_rmem);
|
idiagnl_meminfo_set_rmem(minfo, raw_minfo->idiag_rmem);
|
||||||
idiagnl_meminfo_set_wmem(minfo, raw_minfo->idiag_wmem);
|
idiagnl_meminfo_set_wmem(minfo, raw_minfo->idiag_wmem);
|
||||||
|
@ -678,7 +681,7 @@ int idiagnl_msg_parse(struct nlmsghdr *nlh, struct idiagnl_msg **result)
|
||||||
msg->idiag_meminfo = minfo;
|
msg->idiag_meminfo = minfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tb[IDIAG_ATTR_VEGASINFO]) {
|
if (tb[INET_DIAG_VEGASINFO]) {
|
||||||
struct idiagnl_vegasinfo *vinfo = idiagnl_vegasinfo_alloc();
|
struct idiagnl_vegasinfo *vinfo = idiagnl_vegasinfo_alloc();
|
||||||
struct tcpvegas_info *raw_vinfo = NULL;
|
struct tcpvegas_info *raw_vinfo = NULL;
|
||||||
|
|
||||||
|
@ -686,7 +689,7 @@ int idiagnl_msg_parse(struct nlmsghdr *nlh, struct idiagnl_msg **result)
|
||||||
goto errout_nomem;
|
goto errout_nomem;
|
||||||
|
|
||||||
raw_vinfo = (struct tcpvegas_info *)
|
raw_vinfo = (struct tcpvegas_info *)
|
||||||
nla_data(tb[IDIAG_ATTR_VEGASINFO]);
|
nla_data(tb[INET_DIAG_VEGASINFO]);
|
||||||
|
|
||||||
idiagnl_vegasinfo_set_enabled(vinfo, raw_vinfo->tcpv_enabled);
|
idiagnl_vegasinfo_set_enabled(vinfo, raw_vinfo->tcpv_enabled);
|
||||||
idiagnl_vegasinfo_set_rttcnt(vinfo, raw_vinfo->tcpv_rttcnt);
|
idiagnl_vegasinfo_set_rttcnt(vinfo, raw_vinfo->tcpv_rttcnt);
|
||||||
|
@ -696,8 +699,8 @@ int idiagnl_msg_parse(struct nlmsghdr *nlh, struct idiagnl_msg **result)
|
||||||
msg->idiag_vegasinfo = vinfo;
|
msg->idiag_vegasinfo = vinfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tb[IDIAG_ATTR_SKMEMINFO])
|
if (tb[INET_DIAG_SKMEMINFO])
|
||||||
nla_memcpy(&msg->idiag_skmeminfo, tb[IDIAG_ATTR_SKMEMINFO],
|
nla_memcpy(&msg->idiag_skmeminfo, tb[INET_DIAG_SKMEMINFO],
|
||||||
sizeof(msg->idiag_skmeminfo));
|
sizeof(msg->idiag_skmeminfo));
|
||||||
|
|
||||||
*result = msg;
|
*result = msg;
|
||||||
|
@ -750,8 +753,10 @@ struct nl_object_ops idiagnl_msg_obj_ops = {
|
||||||
[NL_DUMP_STATS] = idiag_msg_dump_stats,
|
[NL_DUMP_STATS] = idiag_msg_dump_stats,
|
||||||
},
|
},
|
||||||
.oo_keygen = idiagnl_keygen,
|
.oo_keygen = idiagnl_keygen,
|
||||||
|
/* FIXME: using inet diag extended attributes as change flags (ce_mask)
|
||||||
|
* is very wrong. */
|
||||||
.oo_attrs2str = idiagnl_attrs2str,
|
.oo_attrs2str = idiagnl_attrs2str,
|
||||||
.oo_id_attrs = (IDIAG_ATTR_INFO)
|
.oo_id_attrs = (INET_DIAG_INFO)
|
||||||
};
|
};
|
||||||
/** @endcond */
|
/** @endcond */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue