]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: add 3-byte stream functions
authorDavid Lamparter <equinox@opensourcerouting.org>
Thu, 28 Jul 2016 15:23:47 +0000 (17:23 +0200)
committerDonald Sharp <sharpd@cumulusnetwroks.com>
Thu, 28 Jul 2016 11:27:47 +0000 (07:27 -0400)
This will be used for BGP MPLS labels.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
lib/stream.c
lib/stream.h

index 4c237563a5762fb8743be5bfdf9c7933f0964cd1..fe77e2a2adadf7d492a456fce1e8e0349320fc6b 100644 (file)
@@ -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)
 {
index 738034438ca856de1f65d005e8ada3322f5b41aa..4e9b21df5f1cbe54662b4e8883e2e86e92405d4e 100644 (file)
@@ -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 *);