Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 82 additions & 1 deletion include/net/kparser.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
* data path.
*
* return: kParser error code as defined in include/uapi/linux/kparser.h
* NOTE: This API supports multiple networking namespaces by using the skb's
* "struct net" member.
*/
extern int kparser_parse(struct sk_buff *skb,
const struct kparser_hkey *kparser_key,
Expand Down Expand Up @@ -96,12 +98,91 @@ extern const void *kparser_get_parser(const struct kparser_hkey *kparser_key,
*/
extern bool kparser_put_parser(const void *parser, bool avoid_ref);

/* __kparser_parse_ns(): Function to parse a void * packet buffer using a parser instance key
*
* The only difference between __kparser_parse_ns() and __kparser_parse() is,
* __kparser_parse_ns() supports multiple namespaces if "struct net" parameter
* is provided. If not, then there is no difference between these two APIs.
*
* net: the net structure from which namespace can be obtained using kernel API
* get_net(). If passed NULL, then no namespace will be used.
* parser: Non NULL kparser_get_parser() returned and cached opaque pointer
* referencing a valid parser instance.
* _hdr: input packet buffer
* parse_len: length of input packet buffer
* _metadata: User provided metadata buffer. It must be same as configured
* metadata objects in CLI.
* metadata_len: Total length of the user provided metadata buffer.
*
* return: kParser error code as defined in include/uapi/linux/kparser.h
*/
extern int __kparser_parse_ns(struct net *net, const void *parser, void *_hdr,
size_t parse_len, void *_metadata, size_t metadata_len);

/* kparser_get_parser_ns(): Function to get an opaque reference of a parser instance and mark it
* immutable so that while actively using, it can not be deleted. The parser is identified by a key.
* It marks the associated parser and whole parse tree immutable so that when it is locked, it can
* not be deleted.
*
* The only difference between kparser_get_parser_ns() and kparser_get_parser() is,
* kparser_get_parser_ns() supports multiple namespaces if "struct net" parameter
* is provided. If not, then there is no difference between these two APIs.
*
* net: the net structure from which namespace can be obtained using kernel API
* get_net(). If passed NULL, then no namespace will be used.
* kparser_key: key of the associated kParser parser object which must be
* already created via CLI.
* avoid_ref: Set this flag in case caller wants to avoid holding the reference
* of the active parser object to save performance on the data path.
* But please be advised, caller should hold the reference of the
* parser object while using this data path. In this case, the CLI
* can be used in advance to get the reference, and caller will also
* need to release the reference via CLI once it is done with the
* data path.
*
* return: NULL if key not found, else an opaque parser instance pointer which
* can be used in the following APIs 3 and 4.
*
* NOTE: This call makes the whole parser tree immutable. If caller calls this
* more than once, later caller will need to release the same parser exactly that
* many times using the API kparser_put_parser().
*/
extern const void *kparser_get_parser_ns(struct net *net,
const struct kparser_hkey *kparser_key,
bool avoid_ref);

/* kparser_put_parser_ns(): Function to return and undo the read only operation done previously by
* kparser_get_parser(). The parser instance is identified by using a previously obtained opaque
* parser pointer via API kparser_get_parser(). This undo the immutable change so that any component
* of the whole parse tree can be deleted again.
*
* The only difference between kparser_put_parser_ns() and kparser_put_parser() is,
* kparser_put_parser_ns() supports multiple namespaces if "struct net" parameter
* is provided. If not, then there is no difference between these two APIs.
*
* net: the net structure from which namespace can be obtained using kernel API
* get_net(). If passed NULL, then no namespace will be used.
* parser: void *, Non NULL opaque pointer which was previously returned by kparser_get_parser().
* Caller can use cached opaque pointer as long as system does not restart and kparser.ko is not
* reloaded.
* avoid_ref: Set this flag only when this was used in the prio call to
* kparser_get_parser(). Incorrect usage of this flag might cause
* error and make the parser state unstable.
*
* return: boolean, true if put operation is success, else false.
*
* NOTE: This call makes the whole parser tree deletable for the very last call.
*/
extern bool kparser_put_parser_ns(struct net *net,
const void *parser, bool avoid_ref);

/* net/core/filter.c's callback hook structure to use kParser APIs if kParser enabled */
struct get_kparser_funchooks {
const void * (*kparser_get_parser_hook)(const struct kparser_hkey
*kparser_key, bool avoid_ref);
int (*__kparser_parse_hook)(const void *parser, void *_hdr,
size_t parse_len, void *_metadata, size_t metadata_len);
size_t parse_len, void *_metadata,
size_t metadata_len);
bool (*kparser_put_parser_hook)(const void *parser, bool avoid_ref);
};

Expand Down
4 changes: 4 additions & 0 deletions include/net/net_namespace.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,10 @@ struct net {
#if IS_ENABLED(CONFIG_SMC)
struct netns_smc smc;
#endif

#if IS_ENABLED(CONFIG_KPARSER)
void *kparser_ns;
#endif
} __randomize_layout;

#include <linux/seq_file_net.h>
Expand Down
2 changes: 2 additions & 0 deletions include/uapi/linux/kparser.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,8 @@ struct kparser_conf_metadata {
size_t add_off;
struct kparser_hkey counterkey;
struct kparser_hkey counter_data_key;
__u8 right_shift;
__u32 mask;
};

/* *********************** metadata list/table *********************** */
Expand Down
44 changes: 35 additions & 9 deletions net/kparser/kparser.h
Original file line number Diff line number Diff line change
Expand Up @@ -277,19 +277,23 @@ static inline __u32 kparser_generic_obj_hashfn_id(const void *obj, __u32 key_len
/* internal shared functions */
int kparser_init(void);
int kparser_deinit(void);
int kparser_config_handler_add(const void *cmdarg, size_t cmdarglen,
int kparser_config_handler_add(void *netns,
const void *cmdarg, size_t cmdarglen,
struct kparser_cmd_rsp_hdr **rsp,
size_t *rsp_len,
void *extack, int *err);
int kparser_config_handler_update(const void *cmdarg, size_t cmdarglen,
int kparser_config_handler_update(void *netns,
const void *cmdarg, size_t cmdarglen,
struct kparser_cmd_rsp_hdr **rsp,
size_t *rsp_len,
void *extack, int *err);
int kparser_config_handler_read(const void *cmdarg, size_t cmdarglen,
int kparser_config_handler_read(void *netns,
const void *cmdarg, size_t cmdarglen,
struct kparser_cmd_rsp_hdr **rsp,
size_t *rsp_len,
void *extack, int *err);
int kparser_config_handler_delete(const void *cmdarg, size_t cmdarglen,
int kparser_config_handler_delete(void *netns,
const void *cmdarg, size_t cmdarglen,
struct kparser_cmd_rsp_hdr **rsp,
size_t *rsp_len,
void *extack, int *err);
Expand All @@ -312,16 +316,17 @@ int kparser_namespace_insert(enum kparser_global_namespace_ids ns_id,
struct rhash_head *obj_name);

/* Generic kParser KMOD's netlink msg handler's definitions for create */
typedef int kparser_obj_create_update(const struct kparser_conf_cmd *conf,
typedef int kparser_obj_create_update(void *netns,
const struct kparser_conf_cmd *conf,
size_t conf_len,
struct kparser_cmd_rsp_hdr **rsp,
size_t *rsp_len, const char *op,
void *extack, int *err);
/* Generic kParser KMOD's netlink msg handler's definitions for read and delete */
typedef int kparser_obj_read_del(const struct kparser_hkey *key,
struct kparser_cmd_rsp_hdr **rsp,
size_t *rsp_len, __u8 recursive_read,
const char *op, void *extack, int *err);
typedef int kparser_obj_read_del(void *netns, const struct kparser_hkey *key,
struct kparser_cmd_rsp_hdr **rsp,
size_t *rsp_len, __u8 recursive_read,
const char *op, void *extack, int *err);
/* Generic kParser KMOD's netlink msg handler's free callbacks */
typedef void kparser_free_obj(void *ptr, void *arg);
int kparser_link_attach(const void *owner_obj,
Expand Down Expand Up @@ -415,4 +420,25 @@ do { \
} \
while (0)

/* kParser KMOD's namespace definitions */
struct kparser_mod_namespaces {
enum kparser_global_namespace_ids namespace_id;
const char *name;
struct kparser_htbl htbl_name;
struct kparser_htbl htbl_id;
kparser_obj_create_update *create_handler;
kparser_obj_create_update *update_handler;
kparser_obj_read_del *read_handler;
kparser_obj_read_del *del_handler;
kparser_free_obj *free_handler;
size_t bv_len;
unsigned long *bv;
};

struct kparser_ns_ds_ctx {
struct kparser_mod_namespaces **kparser_ns_ctx;
};

struct kparser_ns_ds_ctx * kparser_alloc_global_ns_ctx(void);

#endif /* __KPARSER_H */
Loading