1e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/* 2e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * lib/netfilter/queue_obj.c Netfilter Queue 3e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * 4e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * This library is free software; you can redistribute it and/or 5e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * modify it under the terms of the GNU Lesser General Public 6e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * License as published by the Free Software Foundation version 2.1 7e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * of the License. 8e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * 9e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * Copyright (c) 2007, 2008 Patrick McHardy <kaber@trash.net> 10e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy */ 11e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 12e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** 13e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @ingroup nfnl 14e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @defgroup queue Queue 15e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @brief 16e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @{ 17e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy */ 18e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 19e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#include <netlink-local.h> 20e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#include <netlink/netfilter/nfnl.h> 21e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#include <netlink/netfilter/queue.h> 22e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 23e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @cond SKIP */ 24e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_ATTR_GROUP (1UL << 0) 25e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_ATTR_MAXLEN (1UL << 1) 26e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_ATTR_COPY_MODE (1UL << 2) 27e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define QUEUE_ATTR_COPY_RANGE (1UL << 3) 28e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @endcond */ 29e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 30e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 31d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Grafstatic void nfnl_queue_dump(struct nl_object *a, struct nl_dump_params *p) 32e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 33e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy struct nfnl_queue *queue = (struct nfnl_queue *) a; 34e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy char buf[64]; 35e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 36d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf nl_new_line(p); 37d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf 38e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy if (queue->ce_mask & QUEUE_ATTR_GROUP) 39d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf nl_dump(p, "group=%u ", queue->queue_group); 40e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 41e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy if (queue->ce_mask & QUEUE_ATTR_MAXLEN) 42d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf nl_dump(p, "maxlen=%u ", queue->queue_maxlen); 43e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 44e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy if (queue->ce_mask & QUEUE_ATTR_COPY_MODE) 45d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf nl_dump(p, "copy_mode=%s ", 46e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy nfnl_queue_copy_mode2str(queue->queue_copy_mode, 47e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy buf, sizeof(buf))); 48e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 49e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy if (queue->ce_mask & QUEUE_ATTR_COPY_RANGE) 50d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf nl_dump(p, "copy_range=%u ", queue->queue_copy_range); 51e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 52d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf nl_dump(p, "\n"); 53e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 54e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 55e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystatic struct trans_tbl copy_modes[] = { 56e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy __ADD(NFNL_QUEUE_COPY_NONE, none) 57e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy __ADD(NFNL_QUEUE_COPY_META, meta) 58e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy __ADD(NFNL_QUEUE_COPY_PACKET, packet) 59e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}; 60e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 61e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardychar *nfnl_queue_copy_mode2str(enum nfnl_queue_copy_mode copy_mode, char *buf, 62e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy size_t len) 63e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 64e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy return __type2str(copy_mode, buf, len, copy_modes, 65e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy ARRAY_SIZE(copy_modes)); 66e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 67e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 68e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyenum nfnl_queue_copy_mode nfnl_queue_str2copy_mode(const char *name) 69e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 70e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy return __str2type(name, copy_modes, ARRAY_SIZE(copy_modes)); 71e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 72e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 73e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** 74e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @name Allocation/Freeing 75e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @{ 76e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy */ 77e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 78e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystruct nfnl_queue *nfnl_queue_alloc(void) 79e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 80e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy return (struct nfnl_queue *) nl_object_alloc(&queue_obj_ops); 81e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 82e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 83e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_get(struct nfnl_queue *queue) 84e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 85e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy nl_object_get((struct nl_object *) queue); 86e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 87e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 88e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_put(struct nfnl_queue *queue) 89e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 90e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy nl_object_put((struct nl_object *) queue); 91e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 92e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 93e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @} */ 94e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 95e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** 96e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @name Attributes 97e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy * @{ 98e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy */ 99e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 100e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_set_group(struct nfnl_queue *queue, uint16_t group) 101e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 102e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy queue->queue_group = group; 103e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy queue->ce_mask |= QUEUE_ATTR_GROUP; 104e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 105e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 106e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_test_group(const struct nfnl_queue *queue) 107e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 108e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy return !!(queue->ce_mask & QUEUE_ATTR_GROUP); 109e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 110e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 111e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint16_t nfnl_queue_get_group(const struct nfnl_queue *queue) 112e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 113e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy return queue->queue_group; 114e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 115e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 116e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_set_maxlen(struct nfnl_queue *queue, uint32_t maxlen) 117e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 118e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy queue->queue_maxlen = maxlen; 119e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy queue->ce_mask |= QUEUE_ATTR_MAXLEN; 120e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 121e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 122e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_test_maxlen(const struct nfnl_queue *queue) 123e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 124e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy return !!(queue->ce_mask & QUEUE_ATTR_MAXLEN); 125e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 126e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 127e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint32_t nfnl_queue_get_maxlen(const struct nfnl_queue *queue) 128e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 129e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy return queue->queue_maxlen; 130e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 131e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 132e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_set_copy_mode(struct nfnl_queue *queue, enum nfnl_queue_copy_mode mode) 133e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 134e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy queue->queue_copy_mode = mode; 135e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy queue->ce_mask |= QUEUE_ATTR_COPY_MODE; 136e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 137e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 138e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_test_copy_mode(const struct nfnl_queue *queue) 139e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 140e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy return !!(queue->ce_mask & QUEUE_ATTR_COPY_MODE); 141e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 142e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 143e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyenum nfnl_queue_copy_mode nfnl_queue_get_copy_mode(const struct nfnl_queue *queue) 144e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 145e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy return queue->queue_copy_mode; 146e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 147e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 148e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyvoid nfnl_queue_set_copy_range(struct nfnl_queue *queue, uint32_t copy_range) 149e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 150e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy queue->queue_copy_range = copy_range; 151e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy queue->ce_mask |= QUEUE_ATTR_COPY_RANGE; 152e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 153e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 154e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyint nfnl_queue_test_copy_range(const struct nfnl_queue *queue) 155e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 156e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy return !!(queue->ce_mask & QUEUE_ATTR_COPY_RANGE); 157e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 158e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 159e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardyuint32_t nfnl_queue_get_copy_range(const struct nfnl_queue *queue) 160e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 161e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy return queue->queue_copy_range; 162e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 163e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 164e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystatic int nfnl_queue_compare(struct nl_object *_a, struct nl_object *_b, 165e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy uint32_t attrs, int flags) 166e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 167e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy struct nfnl_queue *a = (struct nfnl_queue *) _a; 168e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy struct nfnl_queue *b = (struct nfnl_queue *) _b; 169e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy int diff = 0; 170e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 171e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define NFNL_QUEUE_DIFF(ATTR, EXPR) \ 172e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy ATTR_DIFF(attrs, QUEUE_ATTR_##ATTR, a, b, EXPR) 173e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#define NFNL_QUEUE_DIFF_VAL(ATTR, FIELD) \ 174e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy NFNL_QUEUE_DIFF(ATTR, a->FIELD != b->FIELD) 175e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 176e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy diff |= NFNL_QUEUE_DIFF_VAL(GROUP, queue_group); 177e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy diff |= NFNL_QUEUE_DIFF_VAL(MAXLEN, queue_maxlen); 178e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy diff |= NFNL_QUEUE_DIFF_VAL(COPY_MODE, queue_copy_mode); 179e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy diff |= NFNL_QUEUE_DIFF_VAL(COPY_RANGE, queue_copy_range); 180e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 181e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#undef NFNL_QUEUE_DIFF 182e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy#undef NFNL_QUEUE_DIFF_VAL 183e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 184e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy return diff; 185e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 186e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 187e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystatic struct trans_tbl nfnl_queue_attrs[] = { 188e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy __ADD(QUEUE_ATTR_GROUP, group) 189e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy __ADD(QUEUE_ATTR_MAXLEN, maxlen) 190e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy __ADD(QUEUE_ATTR_COPY_MODE, copy_mode) 191e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy __ADD(QUEUE_ATTR_COPY_RANGE, copy_range) 192e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}; 193e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 194e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystatic char *nfnl_queue_attrs2str(int attrs, char *buf, size_t len) 195e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy{ 196e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy return __flags2str(attrs, buf, len, nfnl_queue_attrs, 197e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy ARRAY_SIZE(nfnl_queue_attrs)); 198e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy} 199e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 200e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @} */ 201e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 202e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardystruct nl_object_ops queue_obj_ops = { 203e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy .oo_name = "netfilter/queue", 204e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy .oo_size = sizeof(struct nfnl_queue), 205d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf .oo_dump = { 206d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf [NL_DUMP_LINE] = nfnl_queue_dump, 207d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf [NL_DUMP_DETAILS] = nfnl_queue_dump, 208d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf [NL_DUMP_STATS] = nfnl_queue_dump, 209d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf }, 210e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy .oo_compare = nfnl_queue_compare, 211e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy .oo_attrs2str = nfnl_queue_attrs2str, 212e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy .oo_id_attrs = QUEUE_ATTR_GROUP, 213e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy}; 214e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy 215e72cb033f2f7323b63f3e640a37e7a75558ab128Patrick McHardy/** @} */ 216