|
|
@@ -108,6 +108,7 @@ static size_t inet_sk_attr_size(struct sock *sk,
|
|
|
+ nla_total_size(1) /* INET_DIAG_TOS */
|
|
|
+ nla_total_size(1) /* INET_DIAG_TCLASS */
|
|
|
+ nla_total_size(4) /* INET_DIAG_MARK */
|
|
|
+ + nla_total_size(4) /* INET_DIAG_CLASS_ID */
|
|
|
+ nla_total_size(sizeof(struct inet_diag_meminfo))
|
|
|
+ nla_total_size(sizeof(struct inet_diag_msg))
|
|
|
+ nla_total_size(SK_MEMINFO_VARS * sizeof(u32))
|
|
|
@@ -287,12 +288,19 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk,
|
|
|
goto errout;
|
|
|
}
|
|
|
|
|
|
- if (ext & (1 << (INET_DIAG_CLASS_ID - 1))) {
|
|
|
+ if (ext & (1 << (INET_DIAG_CLASS_ID - 1)) ||
|
|
|
+ ext & (1 << (INET_DIAG_TCLASS - 1))) {
|
|
|
u32 classid = 0;
|
|
|
|
|
|
#ifdef CONFIG_SOCK_CGROUP_DATA
|
|
|
classid = sock_cgroup_classid(&sk->sk_cgrp_data);
|
|
|
#endif
|
|
|
+ /* Fallback to socket priority if class id isn't set.
|
|
|
+ * Classful qdiscs use it as direct reference to class.
|
|
|
+ * For cgroup2 classid is always zero.
|
|
|
+ */
|
|
|
+ if (!classid)
|
|
|
+ classid = sk->sk_priority;
|
|
|
|
|
|
if (nla_put_u32(skb, INET_DIAG_CLASS_ID, classid))
|
|
|
goto errout;
|