Blame tc/m_ematch.h

Packit d3f73b
/* SPDX-License-Identifier: GPL-2.0 */
Packit d3f73b
#ifndef __TC_EMATCH_H_
Packit d3f73b
#define __TC_EMATCH_H_
Packit d3f73b
Packit d3f73b
#include <ctype.h>
Packit d3f73b
#include <stdlib.h>
Packit d3f73b
#include <string.h>
Packit d3f73b
#include <limits.h>
Packit d3f73b
Packit d3f73b
#include "utils.h"
Packit d3f73b
#include "tc_util.h"
Packit d3f73b
Packit d3f73b
#define EMATCHKINDSIZ 16
Packit d3f73b
Packit d3f73b
struct bstr {
Packit d3f73b
	char	*data;
Packit d3f73b
	unsigned int	len;
Packit d3f73b
	int		quoted;
Packit d3f73b
	struct bstr	*next;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
struct bstr *bstr_alloc(const char *text);
Packit d3f73b
Packit d3f73b
static inline struct bstr *bstr_new(char *data, unsigned int len)
Packit d3f73b
{
Packit d3f73b
	struct bstr *b = calloc(1, sizeof(*b));
Packit d3f73b
Packit d3f73b
	if (b == NULL)
Packit d3f73b
		return NULL;
Packit d3f73b
Packit d3f73b
	b->data = data;
Packit d3f73b
	b->len = len;
Packit d3f73b
Packit d3f73b
	return b;
Packit d3f73b
}
Packit d3f73b
Packit d3f73b
static inline int bstrcmp(const struct bstr *b, const char *text)
Packit d3f73b
{
Packit d3f73b
	int len = strlen(text);
Packit d3f73b
	int d = b->len - len;
Packit d3f73b
Packit d3f73b
	if (d == 0)
Packit d3f73b
		return strncmp(b->data, text, len);
Packit d3f73b
Packit d3f73b
	return d;
Packit d3f73b
}
Packit d3f73b
Packit d3f73b
static inline struct bstr *bstr_next(struct bstr *b)
Packit d3f73b
{
Packit d3f73b
	return b->next;
Packit d3f73b
}
Packit d3f73b
Packit d3f73b
unsigned long bstrtoul(const struct bstr *b);
Packit d3f73b
Packit d3f73b
struct ematch {
Packit d3f73b
	struct bstr	*args;
Packit d3f73b
	int		index;
Packit d3f73b
	int		inverted;
Packit d3f73b
	int		relation;
Packit d3f73b
	int		child_ref;
Packit d3f73b
	struct ematch	*child;
Packit d3f73b
	struct ematch	*next;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
static inline struct ematch *new_ematch(struct bstr *args, int inverted)
Packit d3f73b
{
Packit d3f73b
	struct ematch *e = calloc(1, sizeof(*e));
Packit d3f73b
Packit d3f73b
	if (e == NULL)
Packit d3f73b
		return NULL;
Packit d3f73b
Packit d3f73b
	e->args = args;
Packit d3f73b
	e->inverted = inverted;
Packit d3f73b
Packit d3f73b
	return e;
Packit d3f73b
}
Packit d3f73b
Packit d3f73b
void print_ematch_tree(const struct ematch *tree);
Packit d3f73b
Packit d3f73b
struct ematch_util {
Packit d3f73b
	char			kind[EMATCHKINDSIZ];
Packit d3f73b
	int			kind_num;
Packit d3f73b
	int	(*parse_eopt)(struct nlmsghdr *, struct tcf_ematch_hdr *,
Packit d3f73b
			      struct bstr *);
Packit d3f73b
	int	(*parse_eopt_argv)(struct nlmsghdr *, struct tcf_ematch_hdr *,
Packit d3f73b
				   int, char **);
Packit d3f73b
	int	(*print_eopt)(FILE *, struct tcf_ematch_hdr *, void *, int);
Packit d3f73b
	void	(*print_usage)(FILE *);
Packit d3f73b
	struct ematch_util	*next;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
static inline int parse_layer(const struct bstr *b)
Packit d3f73b
{
Packit d3f73b
	if (*((char *) b->data) == 'l')
Packit d3f73b
		return TCF_LAYER_LINK;
Packit d3f73b
	else if (*((char *) b->data) == 'n')
Packit d3f73b
		return TCF_LAYER_NETWORK;
Packit d3f73b
	else if (*((char *) b->data) == 't')
Packit d3f73b
		return TCF_LAYER_TRANSPORT;
Packit d3f73b
	else
Packit d3f73b
		return INT_MAX;
Packit d3f73b
}
Packit d3f73b
Packit d3f73b
__attribute__((format(printf, 5, 6)))
Packit d3f73b
int em_parse_error(int err, struct bstr *args, struct bstr *carg,
Packit d3f73b
		   struct ematch_util *, char *fmt, ...);
Packit d3f73b
int print_ematch(FILE *, const struct rtattr *);
Packit d3f73b
int parse_ematch(int *, char ***, int, struct nlmsghdr *);
Packit d3f73b
Packit d3f73b
#endif