blobmsg: allow data/length iterator/accessor functions to work on non-blobmsg elements
This primarily helps with simplifying the ubus APIs. blobmsg header presence is indicated by the BLOB_ATTR_EXTENDED bit in the id_len field. This changes the format ABI, but not the API. Signed-off-by: Felix Fietkau <nbd@openwrt.org>
This commit is contained in:
parent
926121113b
commit
58aec3c59a
4 changed files with 17 additions and 5 deletions
5
blob.c
5
blob.c
|
@ -115,10 +115,9 @@ blob_fill_pad(struct blob_attr *attr)
|
||||||
void
|
void
|
||||||
blob_set_raw_len(struct blob_attr *attr, unsigned int len)
|
blob_set_raw_len(struct blob_attr *attr, unsigned int len)
|
||||||
{
|
{
|
||||||
int id = blob_id(attr);
|
|
||||||
len &= BLOB_ATTR_LEN_MASK;
|
len &= BLOB_ATTR_LEN_MASK;
|
||||||
len |= (id << BLOB_ATTR_ID_SHIFT) & BLOB_ATTR_ID_MASK;
|
attr->id_len &= ~cpu_to_be32(BLOB_ATTR_LEN_MASK);
|
||||||
attr->id_len = cpu_to_be32(len);
|
attr->id_len |= cpu_to_be32(len);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct blob_attr *
|
struct blob_attr *
|
||||||
|
|
9
blob.h
9
blob.h
|
@ -42,10 +42,11 @@ enum {
|
||||||
BLOB_ATTR_LAST
|
BLOB_ATTR_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
#define BLOB_ATTR_ID_MASK 0xff000000
|
#define BLOB_ATTR_ID_MASK 0x7f000000
|
||||||
#define BLOB_ATTR_ID_SHIFT 24
|
#define BLOB_ATTR_ID_SHIFT 24
|
||||||
#define BLOB_ATTR_LEN_MASK 0x00ffffff
|
#define BLOB_ATTR_LEN_MASK 0x00ffffff
|
||||||
#define BLOB_ATTR_ALIGN 4
|
#define BLOB_ATTR_ALIGN 4
|
||||||
|
#define BLOB_ATTR_EXTENDED 0x80000000
|
||||||
|
|
||||||
struct blob_attr {
|
struct blob_attr {
|
||||||
uint32_t id_len;
|
uint32_t id_len;
|
||||||
|
@ -85,6 +86,12 @@ blob_id(const struct blob_attr *attr)
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
blob_is_extended(const struct blob_attr *attr)
|
||||||
|
{
|
||||||
|
return !!(attr->id_len & cpu_to_be32(BLOB_ATTR_EXTENDED));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* blob_len: returns the length of the attribute's payload
|
* blob_len: returns the length of the attribute's payload
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -181,6 +181,7 @@ blobmsg_new(struct blob_buf *buf, int type, const char *name, int payload_len, v
|
||||||
if (!attr)
|
if (!attr)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
attr->id_len |= be32_to_cpu(BLOB_ATTR_EXTENDED);
|
||||||
hdr = blob_data(attr);
|
hdr = blob_data(attr);
|
||||||
hdr->namelen = cpu_to_be16(namelen);
|
hdr->namelen = cpu_to_be16(namelen);
|
||||||
strcpy((char *) hdr->name, (const char *)name);
|
strcpy((char *) hdr->name, (const char *)name);
|
||||||
|
|
|
@ -65,7 +65,12 @@ static inline int blobmsg_type(const struct blob_attr *attr)
|
||||||
static inline void *blobmsg_data(const struct blob_attr *attr)
|
static inline void *blobmsg_data(const struct blob_attr *attr)
|
||||||
{
|
{
|
||||||
struct blobmsg_hdr *hdr = (struct blobmsg_hdr *) blob_data(attr);
|
struct blobmsg_hdr *hdr = (struct blobmsg_hdr *) blob_data(attr);
|
||||||
return (char *) hdr + blobmsg_hdrlen(be16_to_cpu(hdr->namelen));
|
char *data = blob_data(attr);
|
||||||
|
|
||||||
|
if (blob_is_extended(attr))
|
||||||
|
data += blobmsg_hdrlen(be16_to_cpu(hdr->namelen));
|
||||||
|
|
||||||
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int blobmsg_data_len(const struct blob_attr *attr)
|
static inline int blobmsg_data_len(const struct blob_attr *attr)
|
||||||
|
|
Loading…
Reference in a new issue