User login

Brendon Jones's blog

24

Apr

2017

Tidied up exporting routes to peers to remove some that should not be sent - routes should not be advertised back to the peer we got them from in the first place. Also started to filter routes by VRF as well, so that peers can be limited to which they receive routes from.

Started to build up a fake network topology based on the REANNZ network, with different peers and different relationships between them in order to make sure that the required capabilities are present to build a realistic network.

24

Apr

2017

Spent the week working on improving the ability to filter and modify routes as they arrive from a peer, are imported or exported to a VRF, or exported to other peers. Peers and VRFs now have a list of filters that are applied to incoming/outgoing routes. The filters contain lists of rules which are processed in order until one matches (based on prefix, peer, origin, etc), at which point the actions are applied to the rule to add/remove communities or to modify the AS path, and the route is accepted or rejected. If a filter fails to match then the next filter in the list is applied until eventually one matches or they all fail and the default behaviour occurs. Exported routes can now also be aggregated.

06

Apr

2017

Put the finishing touches to the AMP throughput test before building some new packages for testing. Updated the collector packages to understand the new options so that the data can be accessed/saved.

Spent some time trying to integrate VRFs into the BGP project. Routes are currently placed into a number of VRFs based on the peer, and the VRFs that routes are exported from are selected based on the peer ASN and address.

Figured out an event in Chrome that I can easily hook into to determine when a Youtube video has ended (rather than polling and hoping), and wrote code to do so. I now have a standalone program that will tell me how much time was spent in initial buffering, later stalling/rebuffering, playback, etc. Started adding a timeline of actions to show how much time was spent in each state, and when. After that will likely be the task of trying to get this running as part of AMP (which could be annoying, at least until headless mode is available in packaged versions).

06

Apr

2017

Updated the AMP throughput test to allow masquerading as an HTTP POST, so that various middleboxes interested in HTTP traffic will take interest in our flow. This required tidying up the test protocol slightly and removing the last of the in-stream signalling so that there was space for the HTTP headers. As part of this I also improved the write handling so that the select timeout will trigger properly at the end of the test duration, lowering the chances of the last write dragging out the test duration.

Continued working on the BGP project, using ExaBGP to get access to nicely formatted BGP messages. Routes updates are accepted from and sent to peers, including our own local routes and routes learnt from other peers. Also updated the simple topology generator to allow updating links via the command line in real time to help testing.

23

Mar

2017

Found what looked like the perfect place in Chrome to update the headers to include Timing-Allow-Origin, but when implementing it discovered that the class I was inheriting from had redeclared all the useful bits from its parent as private and I couldn't do anything at all. Looks like I'll probably have to go up a level and duplicate the entire class to add the single line of code that I need, annoying. Had a couple of new ideas about how to get access to the appropriate javascript events that will tell me when to fetch Youtube video data, but ran out of time to test them.

Added a few simple unit tests to the BGP SDN work I'm doing to help make sure that my building blocks are all doing the correct things. Started trying to make things a bit more realistic by allowing multiple simultaneous fake BGP connections, and using the correct attributes from the feed rather than the easier ones I was previously using to test. Followed that up by installing BIRD on a VM and peering it with my code, now speaking real BGP instead of parsing MRT files.

15

Mar

2017

Found a number of places in the Chrome source that I can inject headers before they are used for anything, which will allow me to set the Timing-Allow-Origin header for all sites and therefore get proper timing information for objects fetched from any domain. I now need to find a way to set this without having to modify the source - I should be able to replace some part of the stack with my own class that modifies the headers as they go by.

Spent some more time working on the BGP SDN project - added support for the MRT format when reading routing changes, and will currently parse and act on BGP UPDATE messages contained within. Also tried to extract most of the route selection process out into a separate piece of code so that it can be easily replaced/modified. Currently have an implementation of a very basic BGP decision process, as well as a simple decision process of my own that takes into account the internal topology when selecting routes to give to nodes.

15

Mar

2017

Spent some time investigating running the Chrome browser in a headless fashion, and writing code to control it so that it can be used to perform test measurements. The headless mode in development works well, and I can build a test program that will load and control the browser. Using the Chrome devtools API I can evaluate arbitrary javascript on the page, so I have access to the performance timings (but need to deal with the issue of the Timing-Allow-Origin not being set by most sites). My old YouTube javascript timing code still works, but I need to detect the end of the video in order to collect the final stats (Chrome doesn't appear to want to let me hook into arbitrary events, only a disappointingly small subset are exposed).

Worked on the BGP SDN proof of concept some more, making it event driven so that routing and topology updates can be read while it runs - it can now respond to changes in received routes or link status so that the routing tables are always up to date.

28

Feb

2017

Fixed up some outstanding bugs that had been reported against ampweb, and finally got it up on github. Built new packages for deployment on skeptic and brought it all up to date with everything.

Spent some time investigating TCP throughput tests running for longer than they should. Appears to be caused by the receiver not stopping until the end of data marker is seen, which can sometimes take a lot longer than expected due to queues or delays. The sender stops at the appropriate time, but we take the timing and byte counts from the receiver which runs over time. Will have to think about the best way to make sure this works as expected, without bluntly terminating the connection if possible.

Started implementing some proof of concept BGP/routing software. Got it loading a topology and advertised routes from static text files, building a network and generating internal routing based on some naive rules. Next step will be to make the rules more configurable/pluggable.

21

Feb

2017

Spent some time investigating a segfault in anomaly_ts and tidied up some of the code around that, but that was mostly cosmetic. Made some very minor fixes that seem unlikely to be responsible for the crashing.

Did a last quick polish pass over ampy to remove old files, fix licensing, etc. Set up and ran my own web instance to make sure that I hadn't broken anything while tidying. Put ampy on github. Started to do the same for ampweb but ran out of time at the end of the week.

21

Feb

2017

Spent some more time working on bugs that had been reported in the amplet2 client. Standalone tests now report more useful messages when no valid targets are specified, as well as if any targets failed to resolve to a useful address. Particularly bad names now won't crash the process when trying to read the DNS response. Started looking at dealing with some of the other reports, but they turned into deeper problems that I need to think more about (I'm being inconsistent in the way I treat errors in different tests).

Did a last quick polish pass over nntsc to remove old files, fix licensing, etc. Split pywandevent from the nntsc repository and made it its own project (nntsc no longer uses it anyway). Put libwandevent, pywandevent and nntsc up on github.