libnetfilter_conntrack  1.0.6
expect/parse.c
1 /*
2  * (C) 2005-2011 by Pablo Neira Ayuso <pablo@netfilter.org>
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  */
9 
10 #include "internal/internal.h"
11 
12 int __parse_expect_message_type(const struct nlmsghdr *nlh)
13 {
14  uint16_t type = NFNL_MSG_TYPE(nlh->nlmsg_type);
15  uint16_t flags = nlh->nlmsg_flags;
16  int ret = NFCT_T_UNKNOWN;
17 
18  if (type == IPCTNL_MSG_EXP_NEW) {
19  if (flags & (NLM_F_CREATE|NLM_F_EXCL))
20  ret = NFCT_T_NEW;
21  else
22  ret = NFCT_T_UPDATE;
23  } else if (type == IPCTNL_MSG_EXP_DELETE)
24  ret = NFCT_T_DESTROY;
25 
26  return ret;
27 }
28 
29 void __parse_expect(const struct nlmsghdr *nlh,
30  struct nfattr *cda[],
31  struct nf_expect *exp)
32 {
33  struct nfgenmsg *nfhdr = NLMSG_DATA(nlh);
34 
35  /* XXX: this is ugly, clean it up, please */
36  exp->expected.orig.l3protonum = nfhdr->nfgen_family;
37  set_bit(ATTR_ORIG_L3PROTO, exp->expected.set);
38 
39  exp->mask.orig.l3protonum = nfhdr->nfgen_family;
40  set_bit(ATTR_ORIG_L3PROTO, exp->mask.set);
41 
42  exp->master.orig.l3protonum = nfhdr->nfgen_family;
43  set_bit(ATTR_ORIG_L3PROTO, exp->master.set);
44 
45  if (cda[CTA_EXPECT_MASTER-1]) {
46  __parse_tuple(cda[CTA_EXPECT_MASTER-1],
47  &exp->master.orig,
48  __DIR_ORIG,
49  exp->master.set);
50  set_bit(ATTR_EXP_MASTER, exp->set);
51  }
52  if (cda[CTA_EXPECT_TUPLE-1]) {
53  __parse_tuple(cda[CTA_EXPECT_TUPLE-1],
54  &exp->expected.orig,
55  __DIR_ORIG,
56  exp->expected.set);
57  set_bit(ATTR_EXP_EXPECTED, exp->set);
58  }
59  if (cda[CTA_EXPECT_MASK-1]) {
60  __parse_tuple(cda[CTA_EXPECT_MASK-1],
61  &exp->mask.orig,
62  __DIR_ORIG,
63  exp->mask.set);
64  set_bit(ATTR_EXP_MASK, exp->set);
65  }
66  if (cda[CTA_EXPECT_TIMEOUT-1]) {
67  exp->timeout =
68  ntohl(*(uint32_t *)NFA_DATA(cda[CTA_EXPECT_TIMEOUT-1]));
69  set_bit(ATTR_EXP_TIMEOUT, exp->set);
70  }
71 
72  if (cda[CTA_EXPECT_ZONE-1]) {
73  exp->zone =
74  ntohs(*(uint16_t *)NFA_DATA(cda[CTA_EXPECT_ZONE-1]));
75  set_bit(ATTR_EXP_ZONE, exp->set);
76  }
77  if (cda[CTA_EXPECT_FLAGS-1]) {
78  exp->flags =
79  ntohl(*(uint32_t *)NFA_DATA(cda[CTA_EXPECT_FLAGS-1]));
80  set_bit(ATTR_EXP_FLAGS, exp->set);
81  }
82  if (cda[CTA_EXPECT_HELP_NAME-1]) {
83  strncpy(exp->helper_name, NFA_DATA(cda[CTA_EXPECT_HELP_NAME-1]),
84  NFA_PAYLOAD(cda[CTA_EXPECT_HELP_NAME-1]));
85  set_bit(ATTR_EXP_HELPER_NAME, exp->set);
86  }
87  if (cda[CTA_EXPECT_CLASS-1]) {
88  exp->class =
89  ntohl(*(uint32_t *)NFA_DATA(cda[CTA_EXPECT_CLASS-1]));
90  set_bit(ATTR_EXP_CLASS, exp->set);
91  }
92  if (cda[CTA_EXPECT_NAT-1]) {
93  struct nfattr *tb[CTA_EXPECT_NAT_MAX];
94 
95  exp->nat.orig.l3protonum = nfhdr->nfgen_family;
96  set_bit(ATTR_ORIG_L3PROTO, exp->nat.set);
97 
98  nfnl_parse_nested(tb, CTA_EXPECT_NAT_MAX,
99  cda[CTA_EXPECT_NAT-1]);
100 
101  if (tb[CTA_EXPECT_NAT_TUPLE-1]) {
102  __parse_tuple(tb[CTA_EXPECT_NAT_TUPLE-1],
103  &exp->nat.orig,
104  __DIR_ORIG,
105  exp->nat.set);
106  set_bit(ATTR_EXP_NAT_TUPLE, exp->set);
107  }
108  if (tb[CTA_EXPECT_NAT_DIR-1]) {
109  exp->nat_dir =
110  ntohl(*((uint32_t *)
111  NFA_DATA(tb[CTA_EXPECT_NAT_DIR-1])));
112  set_bit(ATTR_EXP_NAT_DIR, exp->set);
113  }
114  }
115  if (cda[CTA_EXPECT_FN-1]) {
116  strcpy(exp->expectfn, NFA_DATA(cda[CTA_EXPECT_FN-1]));
117  exp->expectfn[__NFCT_EXPECTFN_MAX-1] = '\0';
118  set_bit(ATTR_EXP_FN, exp->set);
119  }
120 }