]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/stream.h
Merge pull request #5746 from donaldsharp/bgp_sa
[mirror_frr.git] / lib / stream.h
index e808f039c623c07468df2ade9792c85648931a06..c0d25e057988aa00ce6733ee65fd33d321a5d9e8 100644 (file)
 #include "mpls.h"
 #include "prefix.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * A stream is an arbitrary buffer, whose contents generally are assumed to
  * be in network order.
 struct stream {
        struct stream *next;
 
-       /* Remainder is ***private*** to stream
+       /*
+        * Remainder is ***private*** to stream
         * direct access is frowned upon!
         * Use the appropriate functions/macros
         */
-       size_t getp;     /* next get position */
-       size_t endp;     /* last valid data position */
-       size_t size;     /* size of data segment */
-       unsigned char *data; /* data pointer */
+       size_t getp;           /* next get position */
+       size_t endp;           /* last valid data position */
+       size_t size;           /* size of data segment */
+       unsigned char data[0]; /* data pointer */
 };
 
 /* First in first out queue structure. */
@@ -114,9 +119,9 @@ struct stream_fifo {
        pthread_mutex_t mtx;
 
        /* number of streams in this fifo */
-       _Atomic size_t count;
+       atomic_size_t count;
 #if defined DEV_BUILD
-       _Atomic size_t max_count;
+       atomic_size_t max_count;
 #endif
 
        struct stream *head;
@@ -132,13 +137,6 @@ struct stream_fifo {
 
 #define STREAM_CONCAT_REMAIN(S1, S2, size) ((size) - (S1)->endp - (S2)->endp)
 
-/* deprecated macros - do not use in new code */
-#if CONFDATE > 20181128
-CPP_NOTICE("lib: time to remove deprecated stream.h macros")
-#endif
-#define STREAM_PNT(S)   stream_pnt((S))
-#define STREAM_REMAIN(S) STREAM_WRITEABLE((S))
-
 /* this macro is deprecated, but not slated for removal anytime soon */
 #define STREAM_DATA(S)  ((S)->data)
 
@@ -154,7 +152,9 @@ extern struct stream *stream_new(size_t);
 extern void stream_free(struct stream *);
 extern struct stream *stream_copy(struct stream *, struct stream *src);
 extern struct stream *stream_dup(struct stream *);
-extern size_t stream_resize(struct stream *, size_t);
+
+extern size_t stream_resize_inplace(struct stream **sptr, size_t newsize);
+
 extern size_t stream_get_getp(struct stream *);
 extern size_t stream_get_endp(struct stream *);
 extern size_t stream_get_size(struct stream *);
@@ -186,15 +186,19 @@ extern int stream_putl_at(struct stream *, size_t, uint32_t);
 extern int stream_putq(struct stream *, uint64_t);
 extern int stream_putq_at(struct stream *, size_t, uint64_t);
 extern int stream_put_ipv4(struct stream *, uint32_t);
-extern int stream_put_in_addr(struct stream *, struct in_addr *);
-extern int stream_put_in_addr_at(struct stream *, size_t, struct in_addr *);
-extern int stream_put_in6_addr_at(struct stream *, size_t, struct in6_addr *);
-extern int stream_put_prefix_addpath(struct stream *, struct prefix *,
+extern int stream_put_in_addr(struct stream *s, const struct in_addr *addr);
+extern int stream_put_in_addr_at(struct stream *s, size_t putp,
+                                const struct in_addr *addr);
+extern int stream_put_in6_addr_at(struct stream *s, size_t putp,
+                                 const struct in6_addr *addr);
+extern int stream_put_prefix_addpath(struct stream *s,
+                                    const struct prefix *p,
                                     int addpath_encode,
                                     uint32_t addpath_tx_id);
-extern int stream_put_prefix(struct stream *, struct prefix *);
+extern int stream_put_prefix(struct stream *s, const struct prefix *p);
 extern int stream_put_labeled_prefix(struct stream *, struct prefix *,
-                                    mpls_label_t *);
+                                    mpls_label_t *, int addpath_encode,
+                                    uint32_t addpath_tx_id);
 extern void stream_get(void *, struct stream *, size_t);
 extern bool stream_get2(void *data, struct stream *s, size_t size);
 extern void stream_get_from(void *, struct stream *, size_t, size_t);
@@ -403,4 +407,8 @@ static inline uint8_t *ptr_get_be32(uint8_t *ptr, uint32_t *out)
                        goto stream_failure;                                   \
        } while (0)
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* _ZEBRA_STREAM_H */