1/* 2 * netlink/route/cls/ematch.h Extended Matches 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation version 2.1 7 * of the License. 8 * 9 * Copyright (c) 2008-2010 Thomas Graf <tgraf@suug.ch> 10 */ 11 12#ifndef NETLINK_CLS_EMATCH_H_ 13#define NETLINK_CLS_EMATCH_H_ 14 15#include <netlink/netlink.h> 16#include <netlink/msg.h> 17#include <netlink/route/classifier.h> 18#include <linux/pkt_cls.h> 19 20#ifdef __cplusplus 21extern "C" { 22#endif 23 24/* FIXME: Should be moved to the kernel header at some point */ 25#define RTNL_EMATCH_PROGID 2 26 27struct rtnl_ematch; 28struct rtnl_ematch_tree; 29 30/** 31 * Extended Match Operations 32 */ 33struct rtnl_ematch_ops 34{ 35 int eo_kind; 36 const char * eo_name; 37 size_t eo_minlen; 38 size_t eo_datalen; 39 40 int (*eo_parse)(struct rtnl_ematch *, void *, size_t); 41 void (*eo_dump)(struct rtnl_ematch *, 42 struct nl_dump_params *); 43 int (*eo_fill)(struct rtnl_ematch *, struct nl_msg *); 44 void (*eo_free)(struct rtnl_ematch *); 45 struct nl_list_head eo_list; 46}; 47 48extern int rtnl_ematch_register(struct rtnl_ematch_ops *); 49extern struct rtnl_ematch_ops * rtnl_ematch_lookup_ops(int); 50extern struct rtnl_ematch_ops * rtnl_ematch_lookup_ops_by_name(const char *); 51 52extern struct rtnl_ematch * rtnl_ematch_alloc(void); 53extern int rtnl_ematch_add_child(struct rtnl_ematch *, 54 struct rtnl_ematch *); 55extern void rtnl_ematch_unlink(struct rtnl_ematch *); 56extern void rtnl_ematch_free(struct rtnl_ematch *); 57 58extern void * rtnl_ematch_data(struct rtnl_ematch *); 59extern void rtnl_ematch_set_flags(struct rtnl_ematch *, 60 uint16_t); 61extern void rtnl_ematch_unset_flags(struct rtnl_ematch *, 62 uint16_t); 63extern uint16_t rtnl_ematch_get_flags(struct rtnl_ematch *); 64extern int rtnl_ematch_set_ops(struct rtnl_ematch *, 65 struct rtnl_ematch_ops *); 66extern int rtnl_ematch_set_kind(struct rtnl_ematch *, 67 uint16_t); 68extern int rtnl_ematch_set_name(struct rtnl_ematch *, 69 const char *); 70 71extern struct rtnl_ematch_tree *rtnl_ematch_tree_alloc(uint16_t); 72extern void rtnl_ematch_tree_free(struct rtnl_ematch_tree *); 73extern void rtnl_ematch_tree_add(struct rtnl_ematch_tree *, 74 struct rtnl_ematch *); 75 76extern int rtnl_ematch_parse_attr(struct nlattr *, 77 struct rtnl_ematch_tree **); 78extern int rtnl_ematch_fill_attr(struct nl_msg *, int, 79 struct rtnl_ematch_tree *); 80extern void rtnl_ematch_tree_dump(struct rtnl_ematch_tree *, 81 struct nl_dump_params *); 82 83 84extern int rtnl_ematch_parse_expr(const char *, char **, 85 struct rtnl_ematch_tree **); 86 87extern char * rtnl_ematch_offset2txt(uint8_t, uint16_t, 88 char *, size_t); 89extern char * rtnl_ematch_opnd2txt(uint8_t, char *, size_t); 90 91#ifdef __cplusplus 92} 93#endif 94 95#endif 96