The Assimilation Project  based on Assimilation version
Todo List
Global _configcontext_JSON_parse_value (GScanner *scan)
recognize NetAddr objects encoded as strings and reconstitute them
Global _configcontext_setarray (ConfigContext *, const char *name, GSList *value)
Global _FrameSet::framelist
figure out if GSlist or GQueue is better...
Global _frameset_finalize (AssimObj *obj)
should only do this if the frameset won't need retransmitting -
  • of course that should be handled by reference counts - not by special code here...
Global _fsprotocol_findbypkt (FsProtocol *self, NetAddr *addr, FrameSet *fs)
Should we only do this for the case where the frameset type is STARTUP?
Global _fsprotocol_send1 (FsProtocol *self, FrameSet *fs, guint16 qid, NetAddr *toaddr)
: This might be slow if we send a lot of packets to an endpoint before getting a response, but that's not very likely.
Global _fsqueue_flush (FsQueue *self)
: This is basically a protocol reset - what effect should this have upon sequence numbers and generation numbers (if any)? This is used as part of connection shutdown, and for protocol resets from the other end...
Class _GSource_pcap
make this fit better into the C-Class Management system.
Global _hblistener_addlist (HbListener *self)
start listening for packets...
Class _HbSender
Need to make this a subclass of AssimObj
Global _netaddr_equal (const NetAddr *self, const NetAddr *other)

Perhaps we ought to eventually compare for MAC addresses and IPv6 equivalents ;-)

Not sure if it should treat the two loopbacks as the same...

Global _netaddr_ipv6sockaddr (const NetAddr *self)
May need to account for the "any" IPv4 address here and translate it into the "any" IPv6 address...
Global _netaddr_ismcast (const NetAddr *self)
recognize IPv6 multicast addresses too...
Global _netaddr_toIPv6 (const NetAddr *self)
Convert MAC addresses to IPv6 addresses??
Global _netio_sendframesets (NetIO *self,const NetAddr *destaddr,GSList *framesets)

consider optimizing this code to send multiple FrameSets in a single datagram - using sendmsg(2) assuming we start constructing GSLists with more than one FrameSet in it on a regular basis.

change netio_sendframesets to use sendmsg(2) instead of sendto(2)... This loop would then be to set up a struct iovec, and would be followed by a sendmsg(2) call - eliminating sendapacket() above.

Global _real_martian_agent (NetAddr *who)
: need to limit the frequency of martian messages
Global _reliableudp_sendaframeset (NetIO *nself, const NetAddr *dest, FrameSet *fs)
Should we prohibit sending packets during shutdown?
Global _reliableudp_sendframesets (NetIO *nself, const NetAddr *dest, GSList *fslist)
Should we prohibit sending packets during shutdown?
Global _resourcelsb_metadata (ResourceLSB *self)
We really ought to scan it for comments describing the init script - the LSB requires them, but we should use them if present, and give some dumb default if they're not.
Global _seqnoframe_initsessionid (void)
: cache this on disk and so on as described above...
Global _seqnoframe_updatedata (Frame *fself,gpointer tlvptr,gconstpointer pktend,FrameSet *fs)
add a new get_generic_nonconst_tlv_value() function.
Global _switchdiscovery_cache_info (SwitchDiscovery *self,gconstpointer pkt,gconstpointer pktend)
deal with switches that send both LLDP and CDP packets
Global _unknownframe_default_isvalid (const Frame *self,gconstpointer tlvptr,gconstpointer pktend)
think about whether unknown frames are always valid, or always invalid...
File authlistener.h
It should authorize the sender of the FrameSet.
Page Centralized Monitoring Authority (CMA) Software Architecture
Need to think more about and document what my remaining concerns for closing the failure/failover holes for the CMA are. The possibility of a crash during this process is the one place where we need to be very careful that nothing gets lost and that we know that any actions which might get repeated are harmless (idempotent).
Global configcontext_elem_toString (ConfigValue *val)
- make NetAddrs into things that we can recognize and make back into a NetAddr when we parse the JSON.
Global create_pcap_listener (const char *dev, gboolean blocking, unsigned listenmask, struct bpf_program *)
deal with pcap_set_timeout() call here.
Global create_pcap_listener (const char *dev, gboolean blocking, unsigned listenmask, struct bpf_program *)
deal with pcap_set_timeout() call here.
Global g_source_pcap_new (const char *dev, unsigned listenmask, gboolean(*dispatch)(GSource_pcap_t *gsource, pcap_t *capstruct, gconstpointer pkt, gconstpointer pend, const struct pcap_pkthdr *pkthdr, const char *capturedev, gpointer userdata), GDestroyNotify notify, gint priority, gboolean can_recurse, GMainContext *context, gsize objectsize, gpointer userdata)
investigate whether create_pcap_listener() might need more parameters to allow for non-blocking reads... (?)
Global hblistener_unlisten (NetAddr *unlistenaddr)
- this can cause a bug if the NetGSource object still has a reference to us and we delete ourselves - then it will have a bad reference to us.
Global is_valid_cdp_packet (const void *packet, const void *pktend)
validate dest MAC address (01:00:0c:cc:cc:cc) before looking at anything else...
Global is_valid_lldp_packet (const void *tlv_vp, const void *pktend)
validate destination MAC 01:80:c2:00:00:0e and Ethernet protocol 0x88cc.
Global main (int argc, char **argv)
initialize from a setup file - initial IP address:port, debug - anything else?
Global nanoobey_setconfig (AuthListener *, FrameSet *fs, NetAddr *)

If we split the CMA into multiple machines this will need to change.

do we even need this alias code at all?

Global netaddr_sockaddr_new (const struct sockaddr_in6 *sa_in6, socklen_t length)
convert IPv4 encapsulated addresses to real IPv4 addresses??
Global nvpairframe_tlvconstructor (gpointer tlvstart, gconstpointer pktend, gpointer *ignorednewpkt, gpointer *ignoredpktend)

FIXMEthis code is probably wrong...


File pcap_GSource.h
recode the g_source_pcap stuff to be classes in our C-Class system.
File pcap_min.c

In general, need to exclude sent packets from received packets even on those platforms (like Linux) where libpcap won't filter that for us. This will probably involve filtering by source MAC address.

convert all the messaging over to use the various glib logging functions.

To figure out what the MAC address of an interface on Windows is, use the GetAdapterAddresses function -

Global tlv_get_guint24 (const void *vitem, const void *bufend)
verify that this 3-byte ordering is correct - it has to match the IEEE OUI layout...
Global tlv_set_guint24 (void *vitem, guint32 item, const void *bufend)
verify that this 3-byte ordering is correct - it has to match the IEEE OUI layout...
Module todos_near_term

Think about how to implement packet injection so we can test without a network...

Decide how to structure/document system differences for portability

Write code to encapsulate libpcap packets along with the header info etc - similar to what would be needed to create a pcap file from it / or maybe the exact pcap file format image?

What should we do about logging? - glib logging?

Module todos_research

Think more about server architecture

What tool set to use on Windows? - do winpcap or glib have constraints? - Roger is looking into that...

"portable" methods of grabbing the local ARP cache (for discovery)

windows-specific methods of grabbing the local ARP cache (for discovery) - arp -a would work but it's kinda ugly...

Module todos_staffing

Find someone interested in structuring the testing effort - automated testing is an absolute necessity.

Find people interested in doing test deployments - making good progress on that - but always looking for more.