0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-11-18 17:18:42 +00:00

Moved filter value union to lib

This commit is contained in:
Maria Matejka 2022-03-31 19:29:17 +02:00
parent 3fb70b26fa
commit 0b871c1704
4 changed files with 40 additions and 35 deletions

View File

@ -16,20 +16,7 @@
/* Filter value; size of this affects filter memory consumption */ /* Filter value; size of this affects filter memory consumption */
struct f_val { struct f_val {
btype type; /* T_* */ btype type; /* T_* */
union { union bval_long val;
union bval bval;
BVAL_ITEMS;
u64 ec;
lcomm lc;
ip_addr ip;
const net_addr *net;
const char *s;
const struct f_tree *t;
const struct f_trie *ti;
const struct f_path_mask *path_mask;
struct f_path_mask_item pmi;
} val;
}; };
#define fputip(a) ({ ip_addr *ax = falloc(sizeof(*ax)); *ax = (a); ax; }) #define fputip(a) ({ ip_addr *ax = falloc(sizeof(*ax)); *ax = (a); ax; })

View File

@ -11,7 +11,25 @@
#include <stdint.h> #include <stdint.h>
#include "lib/unaligned.h" #include "lib/unaligned.h"
#include "lib/route.h"
typedef struct adata {
uint length; /* Length of data */
byte data[0];
} adata;
extern const adata null_adata; /* adata of length 0 */
static inline struct adata *
lp_alloc_adata(struct linpool *pool, uint len)
{
struct adata *ad = lp_alloc(pool, sizeof(struct adata) + len);
ad->length = len;
return ad;
}
static inline int adata_same(const struct adata *a, const struct adata *b)
{ return (a->length == b->length && !memcmp(a->data, b->data, a->length)); }
/* a-path.c */ /* a-path.c */

View File

@ -10,6 +10,8 @@
#ifndef _BIRD_LIB_ROUTE_H_ #ifndef _BIRD_LIB_ROUTE_H_
#define _BIRD_LIB_ROUTE_H_ #define _BIRD_LIB_ROUTE_H_
#include "lib/type.h"
struct network; struct network;
struct proto; struct proto;
struct cli; struct cli;
@ -163,25 +165,6 @@ const char *ea_custom_name(uint ea);
#define EA_BIT(n) ((n) << 24) /* Used in bitfield accessors */ #define EA_BIT(n) ((n) << 24) /* Used in bitfield accessors */
#define EA_BIT_GET(ea) ((ea) >> 24) #define EA_BIT_GET(ea) ((ea) >> 24)
typedef struct adata {
uint length; /* Length of data */
byte data[0];
} adata;
extern const adata null_adata; /* adata of length 0 */
static inline struct adata *
lp_alloc_adata(struct linpool *pool, uint len)
{
struct adata *ad = lp_alloc(pool, sizeof(struct adata) + len);
ad->length = len;
return ad;
}
static inline int adata_same(const struct adata *a, const struct adata *b)
{ return (a->length == b->length && !memcmp(a->data, b->data, a->length)); }
typedef struct ea_list { typedef struct ea_list {
struct ea_list *next; /* In case we have an override list */ struct ea_list *next; /* In case we have an override list */
byte flags; /* Flags: EALF_... */ byte flags; /* Flags: EALF_... */

View File

@ -10,6 +10,7 @@
#define _BIRD_TYPE_H_ #define _BIRD_TYPE_H_
#include "lib/birdlib.h" #include "lib/birdlib.h"
#include "lib/attrs.h"
union bval { union bval {
#define BVAL_ITEMS \ #define BVAL_ITEMS \
@ -18,9 +19,25 @@ union bval {
const struct adata *ptr; /* Generic attribute data inherited from eattrs */ \ const struct adata *ptr; /* Generic attribute data inherited from eattrs */ \
const struct adata *ad; /* Generic attribute data inherited from filters */ \ const struct adata *ad; /* Generic attribute data inherited from filters */ \
BVAL_ITEMS BVAL_ITEMS;
}; };
union bval_long {
union bval bval; /* For direct assignments */
BVAL_ITEMS; /* For item-wise access */
u64 ec;
lcomm lc;
ip_addr ip;
const net_addr *net;
const char *s;
const struct f_tree *t;
const struct f_trie *ti;
const struct f_path_mask *path_mask;
struct f_path_mask_item pmi;
};
/* Internal types */ /* Internal types */
enum btype { enum btype {
/* Nothing. Simply nothing. */ /* Nothing. Simply nothing. */