int nfnlmsg_exp_parse(struct nlmsghdr *nlh, struct nfnl_exp **result) { struct nfnl_exp *exp; struct nlattr *tb[CTA_MAX+1]; int err; exp = nfnl_exp_alloc(); if (!exp) return -NLE_NOMEM; exp->ce_msgtype = nlh->nlmsg_type; err = nlmsg_parse(nlh, sizeof(struct nfgenmsg), tb, CTA_EXPECT_MAX, exp_policy); if (err < 0) goto errout; nfnl_exp_set_family(exp, nfnlmsg_family(nlh)); if (tb[CTA_EXPECT_TUPLE]) { err = exp_parse_tuple(exp, NFNL_EXP_TUPLE_EXPECT, tb[CTA_EXPECT_TUPLE]); if (err < 0) goto errout; } if (tb[CTA_EXPECT_MASTER]) { err = exp_parse_tuple(exp, NFNL_EXP_TUPLE_MASTER, tb[CTA_EXPECT_MASTER]); if (err < 0) goto errout; } if (tb[CTA_EXPECT_MASK]) { err = exp_parse_tuple(exp, NFNL_EXP_TUPLE_MASK, tb[CTA_EXPECT_MASK]); if (err < 0) goto errout; } if (tb[CTA_EXPECT_NAT]) { err = exp_parse_nat(exp, tb[CTA_EXPECT_MASK]); if (err < 0) goto errout; } if (tb[CTA_EXPECT_CLASS]) nfnl_exp_set_class(exp, ntohl(nla_get_u32(tb[CTA_EXPECT_CLASS]))); if (tb[CTA_EXPECT_FN]) nfnl_exp_set_fn(exp, nla_data(tb[CTA_EXPECT_FN])); if (tb[CTA_EXPECT_TIMEOUT]) nfnl_exp_set_timeout(exp, ntohl(nla_get_u32(tb[CTA_EXPECT_TIMEOUT]))); if (tb[CTA_EXPECT_ID]) nfnl_exp_set_id(exp, ntohl(nla_get_u32(tb[CTA_EXPECT_ID]))); if (tb[CTA_EXPECT_HELP_NAME]) nfnl_exp_set_helper_name(exp, nla_data(tb[CTA_EXPECT_HELP_NAME])); if (tb[CTA_EXPECT_ZONE]) nfnl_exp_set_zone(exp, ntohs(nla_get_u16(tb[CTA_EXPECT_ZONE]))); if (tb[CTA_EXPECT_FLAGS]) nfnl_exp_set_flags(exp, ntohl(nla_get_u32(tb[CTA_EXPECT_FLAGS]))); *result = exp; return 0; errout: nfnl_exp_put(exp); return err; }
struct nfnl_log *nfnlmsg_log_parse(struct nlmsghdr *nlh) { struct nfnl_log *log; struct nlattr *tb[NFULA_MAX+1]; struct nlattr *attr; int err; log = nfnl_log_alloc(); if (!log) return NULL; log->ce_msgtype = nlh->nlmsg_type; err = nlmsg_parse(nlh, sizeof(struct nfgenmsg), tb, NFULA_MAX, log_policy); if (err < 0) goto errout; nfnl_log_set_family(log, nfnlmsg_family(nlh)); attr = tb[NFULA_PACKET_HDR]; if (attr) { struct nfulnl_msg_packet_hdr *hdr = nla_data(attr); nfnl_log_set_hwproto(log, hdr->hw_protocol); nfnl_log_set_hook(log, hdr->hook); } attr = tb[NFULA_MARK]; if (attr) nfnl_log_set_mark(log, ntohl(nla_get_u32(attr))); attr = tb[NFULA_TIMESTAMP]; if (attr) { struct nfulnl_msg_packet_timestamp *timestamp = nla_data(attr); struct timeval tv; tv.tv_sec = ntohll(timestamp->sec); tv.tv_usec = ntohll(timestamp->usec); nfnl_log_set_timestamp(log, &tv); } attr = tb[NFULA_IFINDEX_INDEV]; if (attr) nfnl_log_set_indev(log, ntohl(nla_get_u32(attr))); attr = tb[NFULA_IFINDEX_OUTDEV]; if (attr) nfnl_log_set_outdev(log, ntohl(nla_get_u32(attr))); attr = tb[NFULA_IFINDEX_PHYSINDEV]; if (attr) nfnl_log_set_physindev(log, ntohl(nla_get_u32(attr))); attr = tb[NFULA_IFINDEX_PHYSOUTDEV]; if (attr) nfnl_log_set_physoutdev(log, ntohl(nla_get_u32(attr))); attr = tb[NFULA_HWADDR]; if (attr) { struct nfulnl_msg_packet_hw *hw = nla_data(attr); nfnl_log_set_hwaddr(log, hw->hw_addr, ntohs(hw->hw_addrlen)); } attr = tb[NFULA_PAYLOAD]; if (attr) { err = nfnl_log_set_payload(log, nla_data(attr), nla_len(attr)); if (err < 0) goto errout; } attr = tb[NFULA_PREFIX]; if (attr) { err = nfnl_log_set_prefix(log, nla_data(attr)); if (err < 0) goto errout; } attr = tb[NFULA_UID]; if (attr) nfnl_log_set_uid(log, ntohl(nla_get_u32(attr))); attr = tb[NFULA_SEQ]; if (attr) nfnl_log_set_seq(log, ntohl(nla_get_u32(attr))); attr = tb[NFULA_SEQ_GLOBAL]; if (attr) nfnl_log_set_seq_global(log, ntohl(nla_get_u32(attr))); return log; errout: nfnl_log_put(log); return NULL; }
int nfnlmsg_ct_parse(struct nlmsghdr *nlh, struct nfnl_ct **result) { struct nfnl_ct *ct; struct nlattr *tb[CTA_MAX+1]; int err; ct = nfnl_ct_alloc(); if (!ct) return -NLE_NOMEM; ct->ce_msgtype = nlh->nlmsg_type; err = nlmsg_parse(nlh, sizeof(struct nfgenmsg), tb, CTA_MAX, ct_policy); if (err < 0) goto errout; nfnl_ct_set_family(ct, nfnlmsg_family(nlh)); if (tb[CTA_TUPLE_ORIG]) { err = ct_parse_tuple(ct, 0, tb[CTA_TUPLE_ORIG]); if (err < 0) goto errout; } if (tb[CTA_TUPLE_REPLY]) { err = ct_parse_tuple(ct, 1, tb[CTA_TUPLE_REPLY]); if (err < 0) goto errout; } if (tb[CTA_PROTOINFO]) { err = ct_parse_protoinfo(ct, tb[CTA_PROTOINFO]); if (err < 0) goto errout; } if (tb[CTA_STATUS]) nfnl_ct_set_status(ct, ntohl(nla_get_u32(tb[CTA_STATUS]))); if (tb[CTA_TIMEOUT]) nfnl_ct_set_timeout(ct, ntohl(nla_get_u32(tb[CTA_TIMEOUT]))); if (tb[CTA_MARK]) nfnl_ct_set_mark(ct, ntohl(nla_get_u32(tb[CTA_MARK]))); if (tb[CTA_USE]) nfnl_ct_set_use(ct, ntohl(nla_get_u32(tb[CTA_USE]))); if (tb[CTA_ID]) nfnl_ct_set_id(ct, ntohl(nla_get_u32(tb[CTA_ID]))); if (tb[CTA_ZONE]) nfnl_ct_set_zone(ct, ntohs(nla_get_u16(tb[CTA_ZONE]))); if (tb[CTA_COUNTERS_ORIG]) { err = ct_parse_counters(ct, 0, tb[CTA_COUNTERS_ORIG]); if (err < 0) goto errout; } if (tb[CTA_COUNTERS_REPLY]) { err = ct_parse_counters(ct, 1, tb[CTA_COUNTERS_REPLY]); if (err < 0) goto errout; } if (tb[CTA_TIMESTAMP]) { err = ct_parse_timestamp(ct, tb[CTA_TIMESTAMP]); if (err < 0) goto errout; } *result = ct; return 0; errout: nfnl_ct_put(ct); return err; }
int nfnlmsg_queue_msg_parse(struct nlmsghdr *nlh, struct nfnl_queue_msg **result) { struct nfnl_queue_msg *msg; struct nlattr *tb[NFQA_MAX+1]; struct nlattr *attr; int err; msg = nfnl_queue_msg_alloc(); if (!msg) return -NLE_NOMEM; msg->ce_msgtype = nlh->nlmsg_type; err = nlmsg_parse(nlh, sizeof(struct nfgenmsg), tb, NFQA_MAX, queue_policy); if (err < 0) goto errout; nfnl_queue_msg_set_group(msg, nfnlmsg_res_id(nlh)); nfnl_queue_msg_set_family(msg, nfnlmsg_family(nlh)); attr = tb[NFQA_PACKET_HDR]; if (attr) { struct nfqnl_msg_packet_hdr *hdr = nla_data(attr); nfnl_queue_msg_set_packetid(msg, ntohl(hdr->packet_id)); if (hdr->hw_protocol) nfnl_queue_msg_set_hwproto(msg, hdr->hw_protocol); nfnl_queue_msg_set_hook(msg, hdr->hook); } attr = tb[NFQA_MARK]; if (attr) nfnl_queue_msg_set_mark(msg, ntohl(nla_get_u32(attr))); attr = tb[NFQA_TIMESTAMP]; if (attr) { struct nfqnl_msg_packet_timestamp *timestamp = nla_data(attr); struct timeval tv; tv.tv_sec = ntohll(timestamp->sec); tv.tv_usec = ntohll(timestamp->usec); nfnl_queue_msg_set_timestamp(msg, &tv); } attr = tb[NFQA_IFINDEX_INDEV]; if (attr) nfnl_queue_msg_set_indev(msg, ntohl(nla_get_u32(attr))); attr = tb[NFQA_IFINDEX_OUTDEV]; if (attr) nfnl_queue_msg_set_outdev(msg, ntohl(nla_get_u32(attr))); attr = tb[NFQA_IFINDEX_PHYSINDEV]; if (attr) nfnl_queue_msg_set_physindev(msg, ntohl(nla_get_u32(attr))); attr = tb[NFQA_IFINDEX_PHYSOUTDEV]; if (attr) nfnl_queue_msg_set_physoutdev(msg, ntohl(nla_get_u32(attr))); attr = tb[NFQA_HWADDR]; if (attr) { struct nfqnl_msg_packet_hw *hw = nla_data(attr); nfnl_queue_msg_set_hwaddr(msg, hw->hw_addr, ntohs(hw->hw_addrlen)); } attr = tb[NFQA_PAYLOAD]; if (attr) { err = nfnl_queue_msg_set_payload(msg, nla_data(attr), nla_len(attr)); if (err < 0) goto errout; } *result = msg; return 0; errout: nfnl_queue_msg_put(msg); return err; }