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