DTS Application Library  0.2.3
Application library containing referenced objects and interfaces to common libraries
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
Queue interface

Interface to linux netfilter queue interface. More...

Files

file  nf_queue.c
 Linux netfilter queue interface.
 

Data Structures

struct  nfq_struct
 
struct  nfq_queue
 
struct  nfq_list
 

Typedefs

typedef struct nfq_queue nfq_queue
 Forward decleration of structure. More...
 
typedef struct nfq_data nfq_data
 Forward decleration of structure. More...
 
typedef struct nfqnl_msg_packet_hdr nfqnl_msg_packet_hdr
 Forward decleration of structure. More...
 
typedef uint32_t(* nfqueue_cb )(struct nfq_data *, struct nfqnl_msg_packet_hdr *, char *, uint32_t, void *, uint32_t *, void **)
 

Enumerations

enum  NF_QUEUE_FLAGS { NFQUEUE_DONE = 1 << 0 }
 

Functions

struct nfq_queuenfqueue_attach (uint16_t pf, uint16_t num, uint8_t mode, uint32_t range, nfqueue_cb cb, void *data)
 
uint16_t snprintf_pkt (struct nfq_data *tb, struct nfqnl_msg_packet_hdr *ph, uint8_t *pkt, char *buff, uint16_t len)
 

Detailed Description

Interface to linux netfilter queue interface.

Typedef Documentation

typedef struct nfq_data nfq_data

Forward decleration of structure.

Definition at line 201 of file dtsapp.h.

typedef struct nfq_queue nfq_queue

Forward decleration of structure.

Definition at line 197 of file dtsapp.h.

Forward decleration of structure.

Definition at line 209 of file dtsapp.h.

typedef uint32_t(* nfqueue_cb)(struct nfq_data *, struct nfqnl_msg_packet_hdr *, char *, uint32_t, void *, uint32_t *, void **)

Definition at line 300 of file dtsapp.h.

Enumeration Type Documentation

Enumerator
NFQUEUE_DONE 

Definition at line 43 of file nf_queue.c.

43  {
44  NFQUEUE_DONE = 1 << 0
45 };

Function Documentation

struct nfq_queue* nfqueue_attach ( uint16_t  pf,
uint16_t  num,
uint8_t  mode,
uint32_t  range,
nfqueue_cb  cb,
void *  data 
)

Definition at line 231 of file nf_queue.c.

References bucket_list_find_key(), nfq_queue::cb, nfq_queue::data, nfq_struct::h, nfq_queue::nfq, objalloc(), objlock(), objunlock(), objunref(), and nfq_queue::qh.

231  {
232  struct nfq_queue *nfq_q;
233 
234  if (!(nfq_q = objalloc(sizeof(*nfq_q), nfqueue_close_q))) {
235  return (NULL);
236  }
237 
238  objlock(nfqueues);
239  if (!(nfqueues && (nfq_q->nfq = bucket_list_find_key(nfqueues->queues, &pf))) &&
240  !(nfq_q->nfq || (nfq_q->nfq = nfqueue_init(pf)))) {
241  objunlock(nfqueues);
242  objunref(nfq_q);
243  return (NULL);
244  }
245  objunlock(nfqueues);
246 
247  if (!(nfq_q->qh = nfq_create_queue(nfq_q->nfq->h, num, &nfqueue_callback, nfq_q))) {
248  objunref(nfq_q);
249  return (NULL);
250  }
251 
252  if (cb) {
253  nfq_q->cb = cb;
254  }
255 
256  if (data) {
257  nfq_q->data = data;
258  }
259 
260  nfq_set_mode(nfq_q->qh, mode, range);
261 
262  return (nfq_q);
263 }
void * data
Definition: nf_queue.c:58
struct nfq_struct * nfq
Definition: nf_queue.c:55
int objlock(void *data)
Lock the reference.
Definition: refobj.c:269
void * objalloc(int size, objdestroy)
Allocate a referenced lockable object.
Definition: refobj.c:129
struct nfq_handle * h
Definition: nf_queue.c:48
int objunlock(void *data)
Unlock a reference.
Definition: refobj.c:301
void * bucket_list_find_key(struct bucket_list *list, const void *key)
Find and return a reference to a item matching supplied key.
Definition: refobj.c:572
int objunref(void *data)
Drop reference held.
Definition: refobj.c:184
nfqueue_cb cb
Definition: nf_queue.c:57
struct nfq_q_handle * qh
Definition: nf_queue.c:56
uint16_t num
Definition: nf_queue.c:59
uint16_t snprintf_pkt ( struct nfq_data tb,
struct nfqnl_msg_packet_hdr ph,
uint8_t *  pkt,
char *  buff,
uint16_t  len 
)

Definition at line 265 of file nf_queue.c.

References inet_ntop().

265  {
266  struct iphdr *ip = (struct iphdr *)pkt;
267  char *tmp = buff;
268  uint32_t id, mark, ifi;
269  uint16_t tlen, left = len;
270  char saddr[INET_ADDRSTRLEN], daddr[INET_ADDRSTRLEN];
271 
272  if (ph) {
273  id = ntohl(ph->packet_id);
274  snprintf(tmp, left, "hw_protocol=0x%04x hook=%u id=%u ",
275  ntohs(ph->hw_protocol), ph->hook, id);
276  tlen = strlen(tmp);
277  tmp += tlen;
278  left -= tlen;
279  }
280 
281  if ((mark = nfq_get_nfmark(tb))) {
282  snprintf(tmp, left, "mark=%u ", mark);
283  tlen = strlen(tmp);
284  tmp += tlen;
285  left -= tlen;
286  }
287 
288  if ((ifi = nfq_get_indev(tb))) {
289  snprintf(tmp, left, "indev=%u ", ifi);
290  tlen = strlen(tmp);
291  tmp += tlen;
292  left -= tlen;
293  }
294 
295  if ((ifi = nfq_get_outdev(tb))) {
296  snprintf(tmp, left, "outdev=%u ", ifi);
297  tlen = strlen(tmp);
298  tmp += tlen;
299  left -= tlen;
300  }
301 
302  if (pkt && (ip->version == 4)) {
303  union l4hdr *l4 = (union l4hdr *)(pkt + (ip->ihl*4));
304 
305  inet_ntop(AF_INET, &ip->saddr, saddr, INET_ADDRSTRLEN);
306  inet_ntop(AF_INET, &ip->daddr, daddr, INET_ADDRSTRLEN);
307 
308  snprintf(tmp, left, "src=%s dst=%s proto=%i ", saddr, daddr, ip->protocol);
309  tlen = strlen(tmp);
310  tmp += tlen;
311  left -= tlen;
312 
313  switch(ip->protocol) {
314  case IPPROTO_TCP:
315  snprintf(tmp, left, "sport=%i dport=%i ", ntohs(l4->tcp.source), ntohs(l4->tcp.dest));
316  break;
317  case IPPROTO_UDP:
318  snprintf(tmp, left, "sport=%i dport=%i ", ntohs(l4->udp.source), ntohs(l4->udp.dest));
319  break;
320  case IPPROTO_ICMP:
321  snprintf(tmp, left, "type=%i code=%i id=%i ", l4->icmp.type, l4->icmp.code, ntohs(l4->icmp.un.echo.id));
322  break;
323  }
324  tlen = strlen(tmp);
325  tmp += tlen;
326  left -= tlen;
327  }
328 
329  return (len - left);
330 }
const char * inet_ntop(int af, const void *src, char *dest, socklen_t size)
Win32 implementation of inet_ntop.
Definition: winiface.cpp:43