Hello again, for two months I have been working on my project and I have achieved all the goals.
An alpha version of my program was released for the mid-term evaluation.Since then I have fixed all the bugs, packaged the program for OpenWRT, tested the code and written the documentation.
Everything is available on the GitHub repository [0]
I structured my work opening by issues for all the bugs I had to fix and for everything I wanted to improve. Then, I organized the issues in milestones. Milestone 0.1 [1] is the one that I had to complete to finish the project. When that milestone was closed I made the branch “v0.1” [2].
Tests
In order to be sure that my program worked correctly. I wrote a simulator in python. It’s made by a small server, with the same interface as OONF’s telnet plugin, and two python libraries written by my mentor: cn_generator [3] and pop-routing[4]. The first one generates synthetic graphs using the Cerda-Alabern[5] algorithm, the second one is a pop-routing implementation in python. In the server I implemented the commands to push the NetJson[6] topology and the ones to receive the timers values.
When prince requests a topology from my test program, cn_generator generates a random graph and pushes it back; meanwhile using the python implementation of pop-routing, the references values are computed. The values received from prince are then compared to ones calculated using python.
The goal of tests is to verify that the difference between the reference and the measured values is always less than 1%.
Measurements
I’m going to use my work to write my Bachelor Thesis, so I wanted to perform some measurements to check how well it worked.
My goal was to implement the algorithm on an embedded device, so I chose to measure the execution time on a “Ubiquiti Picostation M2HP” to see how well it was performing.
I branched Prince [7], modifying the code to measure the time needed to calculate the betweenness centrality and push it back along with the timers.
I used the graph generator to create graphs from 5 to 500 nodes, and I measured the time needed to compute with a sample every 10 nodes. For each sample I ran 5 tests, then calculating the mean and the standard deviation. The results are shown here:
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnwAAAJSCAYAAABZSxgQAAAACXBIWXMAAA7FAAAOwQEjACn7AABUKElEQVR4nO3dCZgV5Zn28W5EMYIBDKAiKtuACCoi6hcXXMbRQCASJyoKSIMwIyo7sghi2ESQVcZlArJEUIyTSJSgEiWKW4hGQGUcGZBgsBXiCLglINAfD/picTinz9JVp6ru8/9dV9N91q67i+q+662tcllZWREAAAB0VQ57AgAAABAsCh8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8AAIA4Ch8QU8XFxWXJ7i8rKyvO97QYm57E753svrh+PxX8jIDCROEDYizqf7jzPX1R/3lEAT8joDBR+ABBl19++bJBgwZNueKKK5612y+88MLFkydPHvzkk0/+5K677rr9oYceunHHjh3VO3bsuHjmzJl9qlat+qU9b/fu3ZXHjBkzav78+d0+++yz748cOXKcvY89Vt6ImhttdJ/d87yv2blzZ5WhQ4dOfOyxx661+zp16rRo4sSJQ6tUqbLTPfeBBx7offfddw/bsmXLsS1btlw9a9asXi1atHgnMV8m38++Hjt27B1TpkwZdOSRR/7jP//zP/997dq1ze3nYHkXLFjQpU2bNivsuXv37q1U3s8lUXk/p0xyZjpd9lx7rT3Xvud111336NSpUwceccQRu+zxdevWNbn99tvv+sMf/nDJnj17Drv00kuX/+IXv/i3WrVqfeJeb8+3jw8//PAEy+n9GT3//PP/fNttt93z7rvvNjv22GO3WI6ePXvO9nt+AQgfhQ8QNGnSpCGdO3deuHr16pb2h3ngwIFTFy1a1Gn69On9rfwtX7780ho1amzv27fvvaNGjRpjhcJeZ3/QX3rppQvt8WOOOeZTKzWZfD9X+sobPRo/fvwIKzavv/762Xb7hhtu+KWVrNGjR9/pnvPss89eYdNXu3btv9k03XTTTQ++/PLLF+Ty/cxHH310/KZNm05+/PHHr77++usf6d69+9yNGzc2sNv2M3njjTda2/PS/VwSlfdzyiRnptNlfv/73//Lm2++2cq+LikpmTdhwoThd95552i7ffXVVz9u0/7www933bVr1xFW2IYPHz7Bipd7/YsvvnjRypUrz61bt25pYo6uXbs+bMW2ffv2S6y0WQ5X+PycXwDCR+EDYizZfnxWgmy0pVWrVm/ee++9fStVqrT3sssue65JkybrrAgsXry4Y4MGDTbac21U6dxzz13pis28efNKnnjiiZ82atRog92eNm3aAL+mdeHChZ2feuqpDvXq1dtst23abCTNWyBsxOi444772L4ePHjwZBs9qsj3tJG073//+5916dJlgRUZ+17u9i233HKfe166n0ui8n5OmeTMdLrMjBkz+p1wwgkf2tdW7q688srfusK3Zs2aM9zzvve97/3dSlrz5s3XJr4+WdkzlStX3l1aWlp369atdU466aQPZs+e3TObHH7PLwDBofABMVbeCNe//uu//to293355ZdVbSTG7rNRJVcI7LXezbFm8+bN9Ro3brw+iGm1YtGwYcP33W37PraZ0fscVx7MUUcd9dXf//7371Xke9rom312myG9t22TpXteup9LovJ+TpnkzHS6jPe9rGB638tGAm2z66pVq87ctm1bTbvvsMMO2+N9vRW5VDms5Fr5tBJn02DlsG3btk9nmsPv+QUgOBQ+QJSNBtnmwa+++uoo28Q7Z86cHvbH/5lnnvlR/fr1/5LsNSeeeOJf169f3zjZfli2v5m9l/1ht9sff/zxcd7HyytIxkaZ3n///Yannnrqf9tt+z5u5CoX6b5fNtL9XBKV93PyO6dt6m3WrNm79rW9r/e9bL862/Rsm4KrV6++w/YndOXRKe/nZKPANlJpBXfp0qXtevToMcc2NweRA0C4KHyAINuvygqZ7Rtmf8xbt279xltvvXV67969H+jVq9cs2zxno0XvvfdeU9sMaPv32etsH7E+ffrMtIMXatasuc326XKbK88666w/26ZOOzjBNgH2799/uvd72oECtvO/KyeJ7ICDfv36zZg7d253u21f2325Zkz3/bKR7ueSqLyfk985BwwYMM2+j/va9s10j9norW0KtoM9bJRyyJAhk7J5b5uuO+64Y6wbrfSWQ79zAAgXhQ+IsVT78P18n3Hjxo10m/dstM/KgI3i2D59V1111W9s5Mj267PnudfaEZtWIi666KIX7bOVAffYgw8+eJOVIjtowI7oHDZs2N121K973G6fd955r27fvr1Gsk3NdkCBTYOVT7t9zTXX/GrEiBHjc82e7vtlw8pbeT+XROX9nPzOaUfe2kjc119/fbiN6NlmeveYFUEbxbXvcfzxx39k+9H9+te//tdM39v2B7TMVhatONt+e0HlABAuCh8QU+WVHBvh896++OKLX7AP+9rKjX0ke93hhx/+tY1s2UfiY7b58rXXXvuh9z47KtN9bcXDPlJNo20SthE0+8g0T3kZ032/xNeWd9vKXnk/l0Tl/ZyyzZnutpWuVCN37dq1W2of3vu8GdL9TK1A2key9/Z7fgEIF4UPAABAHIUPAABAHIUPACKKTaQA/ELhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhAwAAEEfhi5ji4uKysKcBAAD4q6ysrDjM70/hAwAAEEfhi6Cw1wL8YCOVCjmMQhY3chz3HEZhfjgqWZRy2Oe4Z1GZH0YhS1S23FH4AAAAxFH4AAAAxFH4AAAAxFH4AAAAxFH4AAAAxFH4EIh58xaEPQm+UchiGbp16xzrI90chfnhqGSJ+1GUDjmiRylL2Ch8AAAA4ih8AAAA4ih8AAAA4ih8AAAA4ih8AIBYOO20096eM2dOj7PPPvt1u71r164jjjvuuI+3bNly7OGHH/613bdy5cpze/XqNeutt946PfH1qS7TFfTluzJ9/2TPU7i0GKKBwgcAiIXrr7/+kYcffrirK3xvvvlmq23bttW0z+eee+5Ku2/BggVdOnfuvDDcKT1YRQobZQ9+ofABAGLBCp8Vu6lTpw6sXLny7ldeeeX8I444Ypd9tvt3795d+fHHH7/6T3/60zm5fo+9e/dWuuuuu25/6KGHbtyxY0f1jh07Lp45c2afqlWrfmmPpxuFs69t+uzjww8/PMHez/v4888//8+33XbbPe+++26zY489dsvIkSPH9ezZc7Y9x73ePnvfz31t+caMGTNq/vz53T777LPv22sHDRo0JdesKCwUPgDIk+K5g8sS7yuZu+rAfWXdJzOaU46TTz55U6NGjTYsW7bs8nbt2i21otejR4859nngwIFTn3322SuaNGmy7qSTTvog1+8xffr0/i+88MLFy5cvv7RGjRrb+/bte++oUaPGTJkyZVCm7/Hiiy9eZJuW69atW5r4WNeuXR+2Atm+ffsltinaCpwVPit16TbfTpw4cehLL710oU3bMccc86m9Ntecfrv2d1sP+b8dV4/9uI7kckjhAwDEhm2utc26VvhsJO+111774T6v2WN2f7rNuW4ELZVZs2b1Wrx4cccGDRpstNuTJ08ebKOH2RS+GTNm9EtW9oyNTJaWltbdunVrHSums2fP7pnp+86bN6/kiSee+KmVXrs9bdq0AZm+FqDwAUCeJI7g2Ygfo3rZueaaa341fPjwCatWrTrzhBNO+PDEE0/8q5Wr1atXt3zmmWd+dP/9999c3utTHbThvt60adPJzZs3X+ue60bespnG8kYYrUyOHTv2jtGjR99po3RWDtu2bft0Ju+7efPmeo0bN16fzbTki+qomBIKHwAgNmrVqvXJ+eef/8rgwYMnX3zxxS/YffbZ9mVr06bNCitRFXl/K2tWHOvXr/+XZI8feeSR//jqq6+O2ucru/3xxx8fl/ic8gpiq1at3rRROiuSS5cubWebpD/66KPj073OWLldv3594xYtWryTVSigiMIHAIgZO3jD9oWzgx/s9iWXXPKHe+6557ZFixZ1quh79+7d+wE7rcu9997b1zadvvfee03Hjx8/wr33WWed9WfbzGsF0zbL9u/ff3o273/dddc9escdd4x1I3Xekmdl1g7m2OfdZK8tKSmZ16dPn5l2QEnNmjW32T58bNZFpih8AIBYsSNnq1evvuOCCy542W5feOGFL1kB+slPfvJkRd/bClWlSpX2XnXVVb/ZuHFjAzsIZNy4cSPd4w8++OBNVggnTJgw3I6yHTZs2N1PPvnkTzJ9/yuvvPK39t626diK3cKFCzu7x+y9zjvvvFe3b99eI9mmZyu4X375ZdWLLrroRftsxbGieVE4KHwAgFipVq3aF1aKvLc//fTTY9K9LtURsN77rexZ6bOPZM+1zal2oIj3vptuuunB8r6H975OnTotso9k721HGttHqtfayaVttNE+kr0eKA+FDwDyJN1BGhzEASAoFD4AyBMrc6lKHWUPQJAofACQR8lKH2UPQNAofACQZ1buPppXXFZabGWviLIHIHAUPgDIIyt63tuUPQD5QOEDgDxILHqmbtmgoiI25wLIAwofAAQoVdHbX/K+LXvswwcgaBQ+BKJbt84yf7wUsihkcILKYqUr3XOyKWXJit7xJWVJyx2lD0DQKHwIxPz5C8tUSoZCFoUMTlBZEstWRQpYYtmzopfuPSl9AIJE4UMgVMqFUciikMGJcpZURc9JV+ZUy95pp5329pw5c3qcffbZr9vtXbt2HXHcccd9vGXLlmPt6hF238qVK8+1S5a99dZbp9vtN998s5Vdd9auZWu3f/e73/146NChE//3f//3n/b534kTJw798Y9//LtU39OuUZvsqhep7vdLpu+f7HlBTxsKG4UPgWBEKVoUMjhRzJKu6BW666+//pGHH364qyt8Vua2bdtW0z6fe+65K+2+BQsWdOncufNC95olS5a0d4VuzZo1Z3Tv3n3uQw89dKNdR3bFihVt7PZzzz132emnn/5WOKmSq0hho+whSBQ+BCJqf5ArQiGLQgYnSlkoepmxwmfFburUqQMrV668+5VXXjn/iCOO2GWf7f7du3dXfvzxx6/+05/+dI57jY3oTZgwYbh9fdddd93+8306dOjwlN1u3779kjvvvHO03b9o0aJOuU7X3r17K9l7WJHcsWNH9Y4dOy6eOXNmn6pVq35pj6cbhbOvLZN9fPjhhyfY+3kff/755//5tttuu+fdd99tduyxx24ZOXLkuJ49e86257jX22fv+7mv7WcyZsyYUfPnz+/22Weffd9eO2jQoCm5ZgUofAhEFEdhcqWQRSGDE5Us3rJH0SvfySefvKlRo0Ybli1bdnm7du2WWtHr0aPHHPs8cODAqc8+++wVTZo0WXfSSSd9YM/funVrnXXr1jW58MILX7LbVgQnT5482PueP/nJT56cMmXKoIpM1/Tp0/u/8MILFy9fvvzSGjVqbO/bt++9o0aNGpPN+7744osX2ebounXrliY+1rVr14etQFpBtc3XVuCs8FmpS7f51jZZv/TSSxfatB1zzDGf2mtzzZkPyQ5SiivV5ZnCh0BE4Q+yXxSyKGRwgjxKt7x96NzjFL3c2OZa26xrhc8K3GuvvfbDfV6zx+x+7+ZcG9277LLLnnP793300UfH16lTZ6v3/ey23V/e93QjaKnMmjWr1+LFizs2aNBgo922UmkjjtkUvhkzZvRLVvaMjWaWlpbWtQJrZXb27Nk9M33fefPmlTzxxBM/taJst6dNmzYg09eGgWUh+ih8CERURmH8oJBFIYMTZJZUpc/uLy2eUvTRvCn7CwR/3LJ3zTXX/Gr48OETVq1adeYJJ5zw4YknnvhXK0qrV69u+cwzz/zo/vvvv9k91wqf23xrjj/++I+sNNlr3H122+4v73umOmjDfb1p06aTmzdvvtY91428ZZPLjUomY2Vy7Nixd4wePfpOG6Wzcti2bdunM3nfzZs312vcuPH6bKYFKA+FD4FQKRdGIYtCBieoLO60KImlz13z1lD0clerVq1Pzj///FcGDx48+eKLL37B7rPPtl9amzZtVlghsvu+/vrrw23fN28BtIM9nnrqqQ4333zz/e6+J5988ifuIJBcWVmzslm/fv2/JHv8yCOP/MdXX3111D5f2e2PP/74uMTnlFcQW7Vq9aaN0lmRXLp0aTvbjO1GJdMVSyu369evb9yiRYt3sgoFpFAwhc8W6nvuuee2V1999byaNWtus80Kto/ED37wg/+zx5MtfIlrh3ak2JAhQybZfifVq1ffYWtutgDnK0OcMKIULQoZnCCzeEtfECN6yU7u7L1P9bQsjh28Yfu12YEMdvuSSy75g/1e9h54YUfgNm3a9D3vJlwbGbziiiuetYJm5dD2bbNRM9snsCLT07t37wfsVDD33ntvX9t0aqeAGT9+/Ag3PWedddafbTOvlVIbUezfv//0bN7fTitzxx13jHUjdd6/M1aA7WCOfd5N9tqSkpJ5ffr0mWkHlNjfLNuHL+qbdRFtBVP47CgqW7O0nYBtjc12zO3Wrdt8O/TfPae8HWhtB2LbxGBHjdkvg88///zoYcOG3U3hS06lXBiFLAoZnKCzePfTO3AJNB/f26/3iiM7CtZWli+44IKX7bb9PrYyYwdguOd4T8finHnmmats/zfvefisCLVs2XJ1RabHClWlSpX2XnXVVb/ZuHFjAztwZNy4cSPd4w8++OBNVgjt974dZWu/821kMdP3v/LKK39r722bjq3YLVy4sLN7zN7rvPPOe3X79u01kv3tsVL85ZdfVrXT0NhnK44VyQoUTOHzrglWq1btC1urrFev3uZMX2+nBLBfNm7HYvsl9cgjj1wfxLQqYEQpWhQyOEFm8Ra9fFCaL5mw371WcLy3P/3002O8z7H99x577LFrE19rpdBbDNNJtQLvvd/KnpU++0j2XNucageXeO+76aabHizv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)
As you can see from the graphic above, the computation time on the embedded device is quite good if we use the heuristic (8s for 100 nodes), it proved to be unusable without it (100s for 100 nodes)
OpenWRT Package
The last objective I gave myself in the previous post was to write a plugin for OLSRd. Since OLSRd isn’t maintained anymore – and since all the developers are working on OONF – I decided to focus on it while avoiding the plugin. Instead, I wrote a makefile and packaged prince for openWRT / LEDE. The makefile hasn’t been published yet in any openWRT feed, but it is hosted in my repository [8]. Instructions are available along with documentation.
Future Work
I’ll keep working on this project, mantaining the code and fixing the future issues. Since the graph-parser library is the last piece of code implemented in C++ and it depends on the Boost libraries, I’m looking forward to re-implement it in pure C.
One of my goals was also to run prince in my WCN (Ninux Firenze), but switching from OLSRd to OONF is taking more time than expected, so I’m hoping to try it in the future.
Gabriel
[0]: https://github.com/gabri94/poprouting/
[1]: https://github.com/gabri94/poprouting/milestone/1?closed=1
[2]: https://github.com/gabri94/poprouting/tree/v0.1
[3]: https://ans.disi.unitn.it/redmine/projects/cn_generator/repository
[4]: https://ans.disi.unitn.it/redmine/projects/pop-routing/repository
[5]: https://pdfs.semanticscholar.org/4ac8/05e7359c6b20c3cdd5da24284d3826b9609c.pdf
[6]: http://netjson.org/
[7]: https://github.com/gabri94/poprouting/tree/exec_time
[8]: https://github.com/gabri94/poprouting/blob/master/Makefile.openwrt