First steps in CCNx packet coding. ccnx_encode* routines rewritten in NS3 style (using NS3::Buffer)
diff --git a/in-progress/ccnx-fib.h b/in-progress/ccnx-fib.h
new file mode 100644
index 0000000..9a1c3d6
--- /dev/null
+++ b/in-progress/ccnx-fib.h
@@ -0,0 +1,193 @@
+/*
+ * File: ndn_fib.h
+ * Author: cawka
+ *
+ * Created on December 15, 2010, 1:54 PM
+ */
+
+#ifndef NDN_FIB_H
+#define NDN_FIB_H
+
+#include "hash_helper.h"
+#include <clock.h>
+#include <main.h>
+
+class Ndn;
+
+const int NDN_FIB_GREEN = 1;
+const int NDN_FIB_YELLOW = 2;
+const int NDN_FIB_RED = 3;
+
+//structure for Fib outgoing interface
+struct FibNexthop
+{
+ int interfaceIndex; //interface index of the node
+ NodeAddress nextHop; //next-hop
+ int cost; //routing protocol cost to route an interest via this interface
+ int packetCount; //record the number of packets forwarded using this interface
+
+ clocktype srtt; //smoothed round-trip time
+ clocktype rttvar; //round-trip time variation
+
+ int status; // Status of the next hop:
+ // - #NDN_FIB_GREEN
+ // - #NDN_FIB_YELLOW
+ // - #NDN_FIB_RED
+
+ bool operator==( int interface ) const { return interfaceIndex==interface; }
+ FibNexthop( ) {}
+ FibNexthop( int _interface, int _nextHop, int _cost )
+ : interfaceIndex(_interface), nextHop(_nextHop), cost(_cost)
+ , packetCount(1), srtt(0), rttvar(0), status(NDN_FIB_YELLOW) { }
+};
+
+typedef list<FibNexthop>::iterator FibNexthopIterator;
+typedef list<FibNexthop>::const_iterator FibNexthopConstIterator;
+
+//structure for FIB table entry
+struct FibEntry
+{
+ list<FibNexthop> forwardingList;
+ clocktype sto; //retransmission time out
+
+ bool needsProbing; //set to true when probing timer goes out
+
+ FibEntry( ) : sto(0), needsProbing(false) { }
+
+ // Find nexthop record
+ inline FibNexthopIterator findNexthop( int interfaceIndex );
+ bool isValid( const FibNexthopIterator &nh )
+ { return nh!=forwardingList.end(); }
+
+ // Compute and update RTO value for Fib Entry (RFC 2988)
+ // (for now we pick the maximum RTO of all forwardings)
+ void updateSto( );
+
+ // Update status of FIB next hop
+ inline void updateStatus( int interface, int status );
+};
+
+typedef string_key_hash_t<FibEntry>::point_iterator FibIterator;
+typedef string_key_hash_t<FibEntry>::iterator FibRangeIterator;
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+
+// Class implementing FIB functionality
+class NdnFib
+{
+public:
+ NdnFib( Ndn &node );
+ virtual ~NdnFib( );
+
+ // Invalidate entries in FIB
+ // Will leave FIB records in hash, but assign metric=NETWORK_UNREACHABLE
+ void invalidate( );
+
+ //Find corresponding FIB entry for the given content name
+ //Longest match is performed
+ FibIterator lookup( const string &name );
+ bool isValid( const FibIterator &it ) { return it!=_fib.end(); }
+
+ /**
+ * Update FIB entry
+ * If the entry exists, metric will be updated. Otherwise, new entry will be created
+ *
+ * Entries in FIB never deleted. They can be invalidated with metric==NETWORK_UNREACHABLE
+ *
+ * @param name Prefix
+ * @param interfaceIndex Forwarding interface
+ * @param metric Routing metric
+ * @param nextHop Nexthop node address (IPv4)
+ * @return true if a new entry created, false otherwise
+ */
+ bool update( const string &name, int interfaceIndex, int metric, NodeAddress nextHop );
+ bool update( NodeAddress nodeId, int interfaceIndex, int metric, NodeAddress nextHop );
+ bool update( NodeAddress nodeId, int metric, NodeAddress nextHop );
+
+ // Update Fib from OSPF routing table (through a hack in OSPF algorithm)
+ void updateFibFromOSPFv2( int interface );
+
+ // Update Fib from BGP routing table (using info from RibIn)
+ void updateFibFromBGP( );
+
+ // Update Fib from IP routing table
+ void updateFibFromIpRouting( );
+
+ // Update the status for all FIB records for the specified interface
+ void updateInterfaceStatus( int interface, int status );
+
+ void dump( );
+ void dump( const FibIterator &fib );
+
+ void resetProbing(); //reset needsProbing field for every FibEntry
+private:
+
+private:
+ Ndn &_node;
+
+ string_key_hash_t<FibEntry> _fib;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+
+class NdnFibNexthopSorter
+{
+public:
+ bool operator()( const FibNexthop &first, const FibNexthop &second );
+};
+
+FibNexthopIterator FibEntry::findNexthop( int interfaceIndex )
+{
+ return find( forwardingList.begin( ),
+ forwardingList.end( ),
+ interfaceIndex );
+}
+
+//inline FibNexthopIterator FibEntry::findBestNexthop( int bestNum, int excludeInterface )
+//{
+// // First adjust number of available interfaces (to make sure we have correct ranking function)
+// int num_valid_interfaces = forwardingList.size();
+// FibNexthopIterator nh;
+// for( nh=forwardingList.begin(); nh!=forwardingList.end(); nh++ )
+// {
+// if( nh->interfaceIndex==excludeInterface ) num_valid_interfaces--;
+// }
+//
+// if( num_valid_interfaces==0 ) return forwardingList.end();
+//
+// bestNum = bestNum % num_valid_interfaces;
+// int i=0;
+// for( nh=forwardingList.begin(); nh!=forwardingList.end(); nh++ ) // skip bestNum % size() FIB records
+// {
+// if( nh->interfaceIndex==excludeInterface ) continue;
+// if( i==bestNum ) break;
+//
+// i++;
+// }
+//
+// if( nh!=forwardingList.end() )
+// {
+// assert( nh->interfaceIndex!=excludeInterface );
+//// printf( "%d best => i%d\n", bestNum, nh->interfaceIndex );
+// }
+//// else
+//// {
+//// printf( "No other hops available\n" );
+//// }
+//
+//
+// return nh;
+//}
+
+void FibEntry::updateStatus( int interface, int status )
+{
+ FibNexthopIterator nh = findNexthop( interface );
+ if( isValid(nh) )
+ {
+ nh->status = status;
+ }
+}
+
+#endif /* NDN_FIB_H */