summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2022-04-10 14:11:46 +0200
committerMaria Matejka <mq@ucw.cz>2022-05-04 15:37:41 +0200
commitde86040b2cf4ec9bfbb64f0e208a19d4d7e51adc (patch)
tree930de20f9c75a4a2e4f9bb281dd1499888ae8b6a /lib
parent0b871c170472202770691af8995766ee57920fdc (diff)
Attribute list normalization cleanup
Diffstat (limited to 'lib')
-rw-r--r--lib/attrs.h10
-rw-r--r--lib/birdlib.h1
-rw-r--r--lib/route.h18
3 files changed, 16 insertions, 13 deletions
diff --git a/lib/attrs.h b/lib/attrs.h
index 97a9630f..fcb70230 100644
--- a/lib/attrs.h
+++ b/lib/attrs.h
@@ -17,6 +17,8 @@ typedef struct adata {
byte data[0];
} adata;
+#define ADATA_SIZE(s) BIRD_CPU_ALIGN(sizeof(struct adata) + s)
+
extern const adata null_adata; /* adata of length 0 */
static inline struct adata *
@@ -27,6 +29,14 @@ lp_alloc_adata(struct linpool *pool, uint len)
return ad;
}
+static inline struct adata *
+lp_store_adata(struct linpool *pool, const void *buf, uint len)
+{
+ struct adata *ad = lp_alloc_adata(pool, len);
+ memcpy(ad->data, buf, 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)); }
diff --git a/lib/birdlib.h b/lib/birdlib.h
index 81d4908a..6f0bab96 100644
--- a/lib/birdlib.h
+++ b/lib/birdlib.h
@@ -19,6 +19,7 @@ struct align_probe { char x; long int y; };
#define SKIP_BACK(s, i, p) ((s *)((char *)p - OFFSETOF(s, i)))
#define BIRD_ALIGN(s, a) (((s)+a-1)&~(a-1))
#define CPU_STRUCT_ALIGN (sizeof(struct align_probe))
+#define BIRD_CPU_ALIGN(s) BIRD_ALIGN((s), CPU_STRUCT_ALIGN)
/* Utility macros */
diff --git a/lib/route.h b/lib/route.h
index 8e60f749..eda5b9ad 100644
--- a/lib/route.h
+++ b/lib/route.h
@@ -204,24 +204,16 @@ ea_get_int(ea_list *e, unsigned id, u32 def)
}
void ea_dump(ea_list *);
-void ea_sort(ea_list *); /* Sort entries in all sub-lists */
-unsigned ea_scan(ea_list *); /* How many bytes do we need for merged ea_list */
-void ea_merge(ea_list *from, ea_list *to); /* Merge sub-lists to allocated buffer */
int ea_same(ea_list *x, ea_list *y); /* Test whether two ea_lists are identical */
uint ea_hash(ea_list *e); /* Calculate 16-bit hash value */
ea_list *ea_append(ea_list *to, ea_list *what);
void ea_format_bitfield(const struct eattr *a, byte *buf, int bufsize, const char **names, int min, int max);
-#define ea_normalize(ea) do { \
- if (ea->next) { \
- ea_list *t = alloca(ea_scan(ea)); \
- ea_merge(ea, t); \
- ea = t; \
- } \
- ea_sort(ea); \
- if (ea->count == 0) \
- ea = NULL; \
-} while(0) \
+/* Normalize ea_list; allocates the result from tmp_linpool */
+ea_list *ea_normalize(const ea_list *e);
+
+uint ea_list_size(ea_list *);
+void ea_list_copy(ea_list *dest, ea_list *src, uint size);
struct ea_one_attr_list {
ea_list l;