mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 11:30:30 +00:00
lib: add 3-byte stream functions
This will be used for BGP MPLS labels. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
a8fd820281
commit
d6f4a61dde
77
lib/stream.c
77
lib/stream.c
@ -373,6 +373,47 @@ stream_getw_from (struct stream *s, size_t from)
|
||||
return w;
|
||||
}
|
||||
|
||||
/* Get next 3-byte from the stream. */
|
||||
u_int32_t
|
||||
stream_get3_from (struct stream *s, size_t from)
|
||||
{
|
||||
u_int32_t l;
|
||||
|
||||
STREAM_VERIFY_SANE(s);
|
||||
|
||||
if (!GETP_VALID (s, from + 3))
|
||||
{
|
||||
STREAM_BOUND_WARN (s, "get 3byte");
|
||||
return 0;
|
||||
}
|
||||
|
||||
l = s->data[from++] << 16;
|
||||
l |= s->data[from++] << 8;
|
||||
l |= s->data[from];
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
u_int32_t
|
||||
stream_get3 (struct stream *s)
|
||||
{
|
||||
u_int32_t l;
|
||||
|
||||
STREAM_VERIFY_SANE(s);
|
||||
|
||||
if (STREAM_READABLE (s) < 3)
|
||||
{
|
||||
STREAM_BOUND_WARN (s, "get 3byte");
|
||||
return 0;
|
||||
}
|
||||
|
||||
l = s->data[s->getp++] << 16;
|
||||
l |= s->data[s->getp++] << 8;
|
||||
l |= s->data[s->getp++];
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
/* Get next long word from the stream. */
|
||||
u_int32_t
|
||||
stream_getl_from (struct stream *s, size_t from)
|
||||
@ -566,6 +607,25 @@ stream_putw (struct stream *s, u_int16_t w)
|
||||
return 2;
|
||||
}
|
||||
|
||||
/* Put long word to the stream. */
|
||||
int
|
||||
stream_put3 (struct stream *s, u_int32_t l)
|
||||
{
|
||||
STREAM_VERIFY_SANE (s);
|
||||
|
||||
if (STREAM_WRITEABLE (s) < 3)
|
||||
{
|
||||
STREAM_BOUND_WARN (s, "put");
|
||||
return 0;
|
||||
}
|
||||
|
||||
s->data[s->endp++] = (u_char)(l >> 16);
|
||||
s->data[s->endp++] = (u_char)(l >> 8);
|
||||
s->data[s->endp++] = (u_char)l;
|
||||
|
||||
return 3;
|
||||
}
|
||||
|
||||
/* Put long word to the stream. */
|
||||
int
|
||||
stream_putl (struct stream *s, u_int32_t l)
|
||||
@ -643,6 +703,23 @@ stream_putw_at (struct stream *s, size_t putp, u_int16_t w)
|
||||
return 2;
|
||||
}
|
||||
|
||||
int
|
||||
stream_put3_at (struct stream *s, size_t putp, u_int32_t l)
|
||||
{
|
||||
STREAM_VERIFY_SANE(s);
|
||||
|
||||
if (!PUT_AT_VALID (s, putp + 3))
|
||||
{
|
||||
STREAM_BOUND_WARN (s, "put");
|
||||
return 0;
|
||||
}
|
||||
s->data[putp] = (u_char)(l >> 16);
|
||||
s->data[putp + 1] = (u_char)(l >> 8);
|
||||
s->data[putp + 2] = (u_char)l;
|
||||
|
||||
return 3;
|
||||
}
|
||||
|
||||
int
|
||||
stream_putl_at (struct stream *s, size_t putp, u_int32_t l)
|
||||
{
|
||||
|
@ -167,6 +167,8 @@ extern int stream_putc (struct stream *, u_char);
|
||||
extern int stream_putc_at (struct stream *, size_t, u_char);
|
||||
extern int stream_putw (struct stream *, u_int16_t);
|
||||
extern int stream_putw_at (struct stream *, size_t, u_int16_t);
|
||||
extern int stream_put3 (struct stream *, u_int32_t);
|
||||
extern int stream_put3_at (struct stream *, size_t, u_int32_t);
|
||||
extern int stream_putl (struct stream *, u_int32_t);
|
||||
extern int stream_putl_at (struct stream *, size_t, u_int32_t);
|
||||
extern int stream_putq (struct stream *, uint64_t);
|
||||
@ -186,6 +188,8 @@ extern u_char stream_getc (struct stream *);
|
||||
extern u_char stream_getc_from (struct stream *, size_t);
|
||||
extern u_int16_t stream_getw (struct stream *);
|
||||
extern u_int16_t stream_getw_from (struct stream *, size_t);
|
||||
extern u_int32_t stream_get3 (struct stream *);
|
||||
extern u_int32_t stream_get3_from (struct stream *, size_t);
|
||||
extern u_int32_t stream_getl (struct stream *);
|
||||
extern u_int32_t stream_getl_from (struct stream *, size_t);
|
||||
extern uint64_t stream_getq (struct stream *);
|
||||
|
Loading…
Reference in New Issue
Block a user