mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 13:27:53 +00:00
lib: add STREAM_GETQ, STREAM_GETF
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
This commit is contained in:
parent
3b55aba195
commit
c2b5a4e5ff
21
lib/stream.c
21
lib/stream.c
@ -543,6 +543,27 @@ uint64_t stream_getq(struct stream *s)
|
|||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool stream_getq2(struct stream *s, uint64_t *q)
|
||||||
|
{
|
||||||
|
STREAM_VERIFY_SANE(s);
|
||||||
|
|
||||||
|
if (STREAM_READABLE(s) < sizeof(uint64_t)) {
|
||||||
|
STREAM_BOUND_WARN2(s, "get uint64");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
*q = ((uint64_t)s->data[s->getp++]) << 56;
|
||||||
|
*q |= ((uint64_t)s->data[s->getp++]) << 48;
|
||||||
|
*q |= ((uint64_t)s->data[s->getp++]) << 40;
|
||||||
|
*q |= ((uint64_t)s->data[s->getp++]) << 32;
|
||||||
|
*q |= ((uint64_t)s->data[s->getp++]) << 24;
|
||||||
|
*q |= ((uint64_t)s->data[s->getp++]) << 16;
|
||||||
|
*q |= ((uint64_t)s->data[s->getp++]) << 8;
|
||||||
|
*q |= ((uint64_t)s->data[s->getp++]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get next long word from the stream. */
|
/* Get next long word from the stream. */
|
||||||
uint32_t stream_get_ipv4(struct stream *s)
|
uint32_t stream_get_ipv4(struct stream *s)
|
||||||
{
|
{
|
||||||
|
20
lib/stream.h
20
lib/stream.h
@ -215,6 +215,7 @@ extern bool stream_getl2(struct stream *s, uint32_t *l);
|
|||||||
extern uint32_t stream_getl_from(struct stream *, size_t);
|
extern uint32_t stream_getl_from(struct stream *, size_t);
|
||||||
extern uint64_t stream_getq(struct stream *);
|
extern uint64_t stream_getq(struct stream *);
|
||||||
extern uint64_t stream_getq_from(struct stream *, size_t);
|
extern uint64_t stream_getq_from(struct stream *, size_t);
|
||||||
|
bool stream_getq2(struct stream *s, uint64_t *q);
|
||||||
extern uint32_t stream_get_ipv4(struct stream *);
|
extern uint32_t stream_get_ipv4(struct stream *);
|
||||||
|
|
||||||
/* IEEE-754 floats */
|
/* IEEE-754 floats */
|
||||||
@ -402,6 +403,25 @@ static inline const uint8_t *ptr_get_be32(const uint8_t *ptr, uint32_t *out)
|
|||||||
(P) = _pval; \
|
(P) = _pval; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define STREAM_GETF(S, P) \
|
||||||
|
do { \
|
||||||
|
union { \
|
||||||
|
float r; \
|
||||||
|
uint32_t d; \
|
||||||
|
} _pval; \
|
||||||
|
if (stream_getl2((S), &_pval.d)) \
|
||||||
|
goto stream_failure; \
|
||||||
|
(P) = _pval.r; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define STREAM_GETQ(S, P) \
|
||||||
|
do { \
|
||||||
|
uint64_t _pval; \
|
||||||
|
if (!stream_getq2((S), &_pval)) \
|
||||||
|
goto stream_failure; \
|
||||||
|
(P) = _pval; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define STREAM_GET(P, STR, SIZE) \
|
#define STREAM_GET(P, STR, SIZE) \
|
||||||
do { \
|
do { \
|
||||||
if (!stream_get2((P), (STR), (SIZE))) \
|
if (!stream_get2((P), (STR), (SIZE))) \
|
||||||
|
Loading…
Reference in New Issue
Block a user