Network Configuration Libraries

The Code

https://github.com/ahsanbarkati/freebsd/tree/libroute/lib/libroute

Revisions Submitted

Differential

Title

Status

D25220

Add tests for "add", "change" and "delete" functionality of /sbin/route.

Merged (./)

D26078

Add libroute and basic librarification of route utility

In Review

Project description

FreeBSD has high quality tools for management of the network, which includes tools to configure and manage interfaces, the firewalls and more. However these tools are not available as libraries, any software that wishes to incorporate network management must shell out to the command line tools. This limits the range of possible tools for automating control of a FreeBSD system. The aim of this project is to develop libroute, a library with APIs to manage routes.

Libroute

Manual manipulation of the network routing tables is generally achieved by the /sbin/route utility. It provides functionality to add, flush, change, show the routes along with optional modifiers which enable setting some initial parameters to the routes such as RTT, MTU etc. This project aims to create a library which brings in a method to programmatically manage the routing. This library will allow addition of the routes to the FIB and also a method to change a particular route, delete a route or even flush the whole routing table.

Status of libroute

The current status of the libroute library is as follows:

The general design of libroute is primarily characterized by the use of a handle. The library provides a method to get a libroute handle (via the libroute_open() API) and all the functionalities of the library is accessed by making use of this handle. The handle stores the FIB number on which it will operate and the socket that it will use to communicate with the kernel. At any point of time, this FIB number can be modified using the libroute_setfib() API. At the end this handle needs to be closed and this will free the memory held by the handle. There are various functions that this library provides:

Example usage of library:

#include <stdio.h>
#include <libroute.h>

int
main()
{
        rt_handle *h;
        struct sockaddr *sa_dest, *sa_gateway;
        int defaultfib, error;
        
        // get the default FIB number
        size_t len = sizeof(defaultfib);
        sysctlbyname("net.my_fibnum", (void *)&defaultfib, &len, NULL,0);

        // Open the libroute handle
        h = libroute_open(defaultfib);
        if (h == NULL)
                printf("failed to open handle\n");

        dest = "192.168.2.6";
        gateway = "172.16.2.1";
        
        // convert addresses to sockaddr structs
        sa_dest = str_to_sockaddr(dest);
        sa_gateway = str_to_sockaddr(gateway);

        // add the new route
        error = libroute_add(h, sa_dest, sa_gateway);
        if (error == -1 )
                printf("Failed to add route, error code is %d", libroute_geterr(h));


        libroute_close(h);
        
        return (0);
}

Test Plan

Currently the testing of the library is not done directly, but it relies on the route utility for it. During this project, we have written tests for the route utility. The tests running on the librarified route indirectly tests the library. We have plans to add tests which directly tests the library.

Future Work

Bugs

Testing


CategoryGsoc

SummerOfCode2020Projects/NetworkConfigurationLibraries (last edited 2021-06-13T19:15:59+0000 by ChristosMargiolis)