u16 userlocks;
        u32 ifindex;
        u32 mark;
+#ifdef CONFIG_SOCK_CGROUP_DATA
+       u64 cgroup_id;
+#endif
 };
 
 static DEFINE_MUTEX(inet_diag_table_mutex);
                                yes = 0;
                        break;
                }
+#ifdef CONFIG_SOCK_CGROUP_DATA
+               case INET_DIAG_BC_CGROUP_COND: {
+                       u64 cgroup_id;
+
+                       cgroup_id = get_unaligned((const u64 *)(op + 1));
+                       if (cgroup_id != entry->cgroup_id)
+                               yes = 0;
+                       break;
+               }
+#endif
                }
 
                if (yes) {
                entry.mark = inet_rsk(inet_reqsk(sk))->ir_mark;
        else
                entry.mark = 0;
+#ifdef CONFIG_SOCK_CGROUP_DATA
+       entry.cgroup_id = cgroup_id(sock_cgroup_ptr(&sk->sk_cgrp_data));
+#endif
 
        return inet_diag_bc_run(bc, &entry);
 }
        return len >= *min_len;
 }
 
+#ifdef CONFIG_SOCK_CGROUP_DATA
+static bool valid_cgroupcond(const struct inet_diag_bc_op *op, int len,
+                            int *min_len)
+{
+       *min_len += sizeof(u64);
+       return len >= *min_len;
+}
+#endif
+
 static int inet_diag_bc_audit(const struct nlattr *attr,
                              const struct sk_buff *skb)
 {
                        if (!valid_markcond(bc, len, &min_len))
                                return -EINVAL;
                        break;
+#ifdef CONFIG_SOCK_CGROUP_DATA
+               case INET_DIAG_BC_CGROUP_COND:
+                       if (!valid_cgroupcond(bc, len, &min_len))
+                               return -EINVAL;
+                       break;
+#endif
                case INET_DIAG_BC_AUTO:
                case INET_DIAG_BC_JMP:
                case INET_DIAG_BC_NOP: