servlib/prophet/RIBTLV.h
changeset 0 2b3e5ec03512
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servlib/prophet/RIBTLV.h	Thu Apr 21 14:57:45 2011 +0100
@@ -0,0 +1,183 @@
+/*
+ *    Copyright 2007 Baylor University
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#ifndef _PROPHET_RIB_TLV_H_
+#define _PROPHET_RIB_TLV_H_
+
+#include "PointerList.h"
+#include "Node.h"
+#include "BaseTLV.h"
+
+namespace prophet
+{
+
+class RIBTLV : public BaseTLV
+{
+public:
+
+    typedef RIBNodeList::iterator       iterator;
+    typedef RIBNodeList::const_iterator const_iterator;
+
+    /** 
+     * RIB Header Flags
+     * p. 28, 4.4.4
+     */
+    typedef enum {
+        RELAY_NODE       = 1 << 0,
+        CUSTODY_NODE     = 1 << 1,
+        INTERNET_GW_NODE = 1 << 2
+    } rib_header_flag_t;
+
+    /**
+     * Routing Information Base TLV <br>
+     * p. 28, 4.4.4 <br>
+     * <br>
+     * The Routing Information Base lists the destinations a node knows of,
+     * and the delivery predictabilities it has associated with them.  This
+     * information is needed by the PRoPHET algorithm to make decisions on
+     * routing and forwarding.
+     */
+    struct RIBTLVHeader {
+        u_int8_t type; ///< defined as 0xA1
+        /**
+         * The encoding of the Header flag field relates to the
+         * capabilities of the Source node sending the RIB:
+         * <br>
+         *       Flag 0: Relay Node          0b1 <br>
+         *       Flag 1: Custody Node        0b1 <br>
+         *       Flag 2: Internet GW Node    0b1 <br>
+         *       Flag 3: Reserved            0b1 <br>
+         *       Flag 4: Reserved            0b1 <br>
+         *       Flag 5: Reserved            0b1 <br>
+         *       Flag 6: Reserved            0b1 <br>
+         *       Flag 7: Reserved            0b1 <br>
+         */
+        u_int8_t flags;
+        /**
+         * Length of the TLV in octets, including the TLV header and any
+         * nested TLVs.
+         */
+        u_int16_t length;
+        u_int16_t rib_string_count; ///< Number of routing entries in the TLV
+        u_int16_t unused__;
+    } __attribute__((packed));
+
+    /** 
+     * Routing Information Base entry
+     * p. 28, 4.4.4
+     */
+    struct RIBEntry {
+        /**
+         * ID string as predefined in the dictionary TLV.
+         */
+        u_int16_t string_id;
+        /**
+         * Delivery predictability for the destination of this entry as
+         * calculated according to the equations in Section 2.1.1.  The
+         * encoding of this field is a linear mapping from [0,1] to [0,
+         * 0xFF].
+         */
+        u_int8_t pvalue;
+        /**
+         * The encoding of the RIB flag field is<br>
+         * <br>
+         *       Flag 0: Relay Node          0b1 <br>
+         *       Flag 1: Custody Node        0b1 <br>
+         *       Flag 2: Internet GW Node    0b1 <br>
+         *       Flag 3: Reserved            0b1 <br>
+         *       Flag 4: Reserved            0b1 <br>
+         *       Flag 5: Reserved            0b1 <br>
+         *       Flag 6: Reserved            0b1 <br>
+         *       Flag 7: Reserved            0b1 <br>
+         */
+        u_int8_t flags;
+    } __attribute__((packed));
+
+    static const size_t RIBTLVHeaderSize = sizeof(struct RIBTLVHeader);
+
+    static const size_t RIBEntrySize = sizeof(struct RIBEntry);
+
+    /**
+     * Constructor.
+     */
+    RIBTLV(const RIBNodeList& nodes,
+           bool relay,
+           bool custody,
+           bool internet=false);
+
+    /**
+     * Destructor.
+     */
+    virtual ~RIBTLV() {}
+
+    /**
+     * Virtual from BaseTLV.
+     */
+    size_t serialize(u_char* bp, size_t len) const;
+
+    ///@{ Accessors
+    const RIBNodeList& nodes() const { return nodes_; }
+    bool relay() const { return relay_; }
+    bool custody() const { return custody_; }
+    bool internet() const { return internet_; }
+    ///@}
+
+protected:
+    friend class TLVFactory<RIBTLV>;
+
+    /**
+     * Constructor.  Protected to force access through TLVFactory.
+     */
+    RIBTLV();
+
+    /**
+     * Utility function for decoding RIB header flags.
+     */
+    static void decode_flags(u_int8_t flags, bool* relay,
+                             bool* custody, bool* internet);
+
+    /**
+     * Serialize routing information base entry out to no more than
+     * len bytes of buffer, using struct RIBEntry; return bytes written
+     */
+    size_t write_rib_entry(u_int16_t sid, double pvalue, bool relay,
+                           bool custody, bool internet,
+                           u_char* bp, size_t len) const;
+
+    /**
+     * Deserialize RIBEntry struct from transport into memory, reading
+     * no more than len bytes from buffer; return bytes read
+     */
+    size_t read_rib_entry(u_int16_t* sid, double* pvalue,
+                          bool* relay, bool* custody, bool* internet,
+                          const u_char* bp, size_t len);
+
+    /**
+     * Virtual from BaseTLV.
+     */
+    bool deserialize(const u_char* bp, size_t len);
+
+    RIBNodeList nodes_; ///< List of RIB entries
+    bool relay_; ///< Whether this node accepts bundles for relay to
+                 ///  other nodes
+    bool custody_; ///< Whether this node accepts custody transfers
+    bool internet_; ///< Whether this node bridges to the Internet
+
+}; // class RIBTLV
+
+}; // namespace prophet
+
+#endif // _PROPHET_RIB_TLV_H_