ematch.h

00001 /*
00002  * netlink/route/cls/ematch.h           Extended Matches
00003  *
00004  *      This library is free software; you can redistribute it and/or
00005  *      modify it under the terms of the GNU Lesser General Public
00006  *      License as published by the Free Software Foundation version 2.1
00007  *      of the License.
00008  *
00009  * Copyright (c) 2008-2010 Thomas Graf <tgraf@suug.ch>
00010  */
00011 
00012 #ifndef NETLINK_CLS_EMATCH_H_
00013 #define NETLINK_CLS_EMATCH_H_
00014 
00015 #include <netlink/netlink.h>
00016 #include <netlink/msg.h>
00017 #include <netlink/route/classifier.h>
00018 #include <linux/pkt_cls.h>
00019 
00020 #ifdef __cplusplus
00021 extern "C" {
00022 #endif
00023 
00024 /* FIXME: Should be moved to the kernel header at some point */
00025 #define RTNL_EMATCH_PROGID      2
00026 
00027 struct rtnl_ematch;
00028 struct rtnl_ematch_tree;
00029 
00030 /**
00031  * Extended Match Operations
00032  */
00033 struct rtnl_ematch_ops
00034 {
00035         int                     eo_kind;
00036         const char *            eo_name;
00037         size_t                  eo_minlen;
00038         size_t                  eo_datalen;
00039 
00040         int                   (*eo_parse)(struct rtnl_ematch *, void *, size_t);
00041         void                  (*eo_dump)(struct rtnl_ematch *,
00042                                          struct nl_dump_params *);
00043         int                   (*eo_fill)(struct rtnl_ematch *, struct nl_msg *);
00044         void                  (*eo_free)(struct rtnl_ematch *);
00045         struct nl_list_head     eo_list;
00046 };
00047 
00048 extern int                      rtnl_ematch_register(struct rtnl_ematch_ops *);
00049 extern struct rtnl_ematch_ops * rtnl_ematch_lookup_ops(int);
00050 extern struct rtnl_ematch_ops * rtnl_ematch_lookup_ops_by_name(const char *);
00051 
00052 extern struct rtnl_ematch *     rtnl_ematch_alloc(void);
00053 extern int                      rtnl_ematch_add_child(struct rtnl_ematch *,
00054                                                       struct rtnl_ematch *);
00055 extern void                     rtnl_ematch_unlink(struct rtnl_ematch *);
00056 extern void                     rtnl_ematch_free(struct rtnl_ematch *);
00057 
00058 extern void *                   rtnl_ematch_data(struct rtnl_ematch *);
00059 extern void                     rtnl_ematch_set_flags(struct rtnl_ematch *,
00060                                                       uint16_t);
00061 extern void                     rtnl_ematch_unset_flags(struct rtnl_ematch *,
00062                                                         uint16_t);
00063 extern uint16_t                 rtnl_ematch_get_flags(struct rtnl_ematch *);
00064 extern int                      rtnl_ematch_set_ops(struct rtnl_ematch *,
00065                                                     struct rtnl_ematch_ops *);
00066 extern int                      rtnl_ematch_set_kind(struct rtnl_ematch *,
00067                                                      uint16_t);
00068 extern int                      rtnl_ematch_set_name(struct rtnl_ematch *,
00069                                                      const char *);
00070 
00071 extern struct rtnl_ematch_tree *rtnl_ematch_tree_alloc(uint16_t);
00072 extern void                     rtnl_ematch_tree_free(struct rtnl_ematch_tree *);
00073 extern void                     rtnl_ematch_tree_add(struct rtnl_ematch_tree *,
00074                                                      struct rtnl_ematch *);
00075 
00076 extern int                      rtnl_ematch_parse_attr(struct nlattr *,
00077                                                        struct rtnl_ematch_tree **);
00078 extern int                      rtnl_ematch_fill_attr(struct nl_msg *, int,
00079                                                       struct rtnl_ematch_tree *);
00080 extern void                     rtnl_ematch_tree_dump(struct rtnl_ematch_tree *,
00081                                                       struct nl_dump_params *);
00082 
00083 
00084 extern int                      rtnl_ematch_parse_expr(const char *, char **,
00085                                                        struct rtnl_ematch_tree **);
00086 
00087 extern char *                   rtnl_ematch_offset2txt(uint8_t, uint16_t,
00088                                                        char *, size_t);
00089 extern char *                   rtnl_ematch_opnd2txt(uint8_t, char *, size_t);
00090 
00091 #ifdef __cplusplus
00092 }
00093 #endif
00094 
00095 #endif