Giter Club home page Giter Club logo

gatekeeper's Introduction

Gatekeeper

Gatekeeper compilation status

What is Gatekeeper?

Gatekeeper is the first open source DDoS protection system. It is designed to scale to any peak bandwidth, so it can withstand DDoS attacks both of today and of tomorrow. In spite of the geographically distributed architecture of Gatekeeper, the network policy that describes all decisions that have to be enforced on the incoming traffic is centralized. This centralized policy enables network operators to leverage distributed algorithms that would not be viable under very high latency (e.g. distributed databases) and to fight multiple multi-vector DDoS attacks at once.

The intended users of Gatekeeper are network operators of institutions, service and content providers, enterprise networks, etc. It is not intended to be used by individual Internet users.

For more information, see the Gatekeeper wiki.

How to Set Up

Configure Hugepages

DPDK requires the use of hugepages; instructions for mounting hugepages are available in the requirements documentation. On many systems, the following hugepages setup is sufficient:

$ echo 256 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

Enable the kernel module vfio-pci

Starting with Gatekeeper v1.1, the Linux kernel module vfio-pci is the prefered way to bind NICs to DPDK/Gatekeeper. In case you cannot get the kernel module vfio-pci running on your machine, you may tray an alternative to vfio-pci as documented on this page.

In order for vfio-pci to work, both the BIOS and the kernel must support it. BIOSes must have VT-d enabled. BIOSes may identify VT-d as "Intel (R) VT for Directed I/O", "Intel (R) VT-d Feature", "Intel VT-d", "VT-d", or similar variations; for more examples, search "BIOS VT-d" on Google Images. Some BIOS may require that an option called "Intel (R) Virtualization Technology" (or variations of this string) to be enabled before VT-d can be enabled.

To check that VT-d is enabled at the BIOS, run the following command after Linux boots up:

$ dmesg | grep -e DMAR

If the command above returns some lines, VT-d should be enabled. Otherwise, one has to go back to the BIOS to enable it. More information on how to check that VT-d is enabled at the BIOS is available on this page.

Once VT-d is enabled at the BIOS, one must ensure that the kernel supports IOMMU. Notice that one needs a kernel version greater than 3.6 to support IOMMU. One can verify if the running kernel has IOMMU enabled by default with the following command:

$ grep CONFIG_INTEL_IOMMU_DEFAULT_ON /boot/config-`uname -r`

Most likely, the command above will output # CONFIG_INTEL_IOMMU_DEFAULT_ON is not set, that is, the running kernel does not have IOMMU enabled by default. Alternatives ways to check for kernel build options (i.e. CONFIG_INTEL_IOMMU_DEFAULT_ON) is available on this page.

If the kernel does not have IOMMU enabled by default, one has to pass the kernel boot parameter intel_iommu=on via GRUB. For information on the why the boot parameter intel_iommu=on is needed, see this page. One can check if the running kernel received this parameter with the command below:

$ cat /proc/cmdline | grep intel_iommu=on

If the running kernel has not received the parameter intel_iommu=on, add it to GRUB, and reboot the machine. Information on how to add a boot parameter to GRUB is found here.

Once VT-d is enabled at the BIOS and the kernel supports IOMMU, one can verify that everything is all set with one of the following commands:

$ ls /sys/kernel/iommu_groups

OR

$ dmesg | grep -ie 'IOMMU\s\+enabled'

Everything is all set if the outputs of the commands above are not empty.

Option 1: Obtain Packages

Gatekeeper Debian packages are available for Ubuntu 20.04 LTS at the project's Releases page.

Install

Once the packages are downloaded, they can be installed with the commands below:

$ tar -zxvf gatekeeper-ubuntu-20.04-packages.tar.gz
$ cd gatekeeper-ubuntu-20.04-packages
$ sudo dpkg -i gatekeeper-bird_*_amd64.deb gatekeeper_*_amd64.deb

Configure Gatekeeper

When installed via Debian packages, Gatekeeper configuration files are located in /etc/gatekeeper. You should edit at least the net.lua file, and set the front_ports, front_ips, back_ports and back_ips variables according to your environment.

The other Lua files configure different Gatekeeper functional blocks. Please refer to the project's wiki for further information on whether these need to be changed in your setup.

You also need to edit the /etc/gatekeeper/envvars file and set the GATEKEEPER_INTERFACES variable to the PCI addresses of the network adapters to be bound to DPDK. These can found using the lshw command. For example:

# lshw -c network -businfo
Bus info          Device     Class          Description
=======================================================
pci@0000:08:00.0  eth0       network        I350 Gigabit Network Connection
pci@0000:08:00.1  eth1       network        I350 Gigabit Network Connection
...

Given this output, set GATEKEEPER_INTERFACES as below:

GATEKEEPER_INTERFACES="08:00.0 08:00.1"

In the same file, you can optionally specify Environmental Abstraction Layer options in the DPDK_ARGS variable and Gatekeeper-specific options in GATEKEEPER_ARGS.

How to run

Run the commands below to start Gatekeeper and to ensure it is started automatically on reboots.

$ sudo systemctl start gatekeeper
$ sudo systemctl enable gatekeeper

Option 2: Build from Source

Install Dependencies

Install the following software dependencies:

$ sudo apt-get update
$ sudo apt-get -y -q install git clang devscripts doxygen libhugetlbfs-bin \
    build-essential gcc-multilib linux-headers-`uname -r` libmnl0 libmnl-dev \
    libkmod2 libkmod-dev libnuma-dev libelf1 libelf-dev libc6-dev-i386 \
    autoconf flex bison libncurses5-dev libreadline-dev python \
    libcap-dev libcap2 meson ninja-build pkg-config

Note: Both libmnl0 and libmnl-dev are needed to compile and run gatekeeper, but only libmnl0 is needed for simply running gatekeeper. Both libkmod2 and libkmod-dev are needed to compile and run gatekeeper, but only libkmod2 is needed for simply running gatekeeper. libnuma-dev is needed to compile the latest DPDK and to support NUMA systems. The package libelf-dev is needed to compile DPDK with support to reading BPF programs from ELF files, but only libelf1 is needed to run it. The package libc6-dev-i386 is needed to compile the BPF programs in the folder bpf/. The autoconf, flex, bison, libncurses5-dev, and libreadline-dev packages are for BIRD. The devscripts package is used to build Gatekeeper Debian packages. The packages python and python3-pyelftools are needed to build DPDK and to run Python scripts such as dpdk-devbind.py. libcap-dev is needed to compile Gatekeeper, but only libcap2 is needed to run Gatekeeper. meson and ninja-build are needed for building DPDK. pkg-config is needed to compile Gatekeeper.

To use DPDK, make sure you have all of the environmental requirements.

Clone Repository

Clone the Gatekeeper repository, including the submodules that contain Gatekeeper dependencies:

$ git clone --recursive http://github.com/AltraMayor/gatekeeper.git

If you do not use the --recursive clone option, you need to obtain the submodules that contain the dependences from within the gatekeeper directory:

$ git submodule init
$ git submodule update

Compile

This section explains how to build Gatekeeper manually. If you want to build Debian packages, refer to the section How to build packages.

While in the gatekeeper directory, run the setup script:

$ . setup.sh

This script compiles DPDK, LuaJIT, and BIRD, and loads the needed kernel modules. Additionally, it saves the interface names and their respective PCI addresses in the file lua/if_map.lua so that interface names can be used in the Gatekeeper configuration files.

Once DPDK and LuaJIT are compiled, gatekeeper can be compiled:

$ make

Configure Network Adapters

Before gatekeeper can be used, the network adapters must be bound to DPDK. For this, you can use the script dependencies/dpdk/usertools/dpdk-devbind.py. For example:

$ sudo dependencies/dpdk/usertools/dpdk-devbind.py --bind=vfio-pci enp131s0f0

This command binds the interface enp131s0f0 to the vfio-pci driver so that frames can be passed directly to DPDK instead of the kernel. Note that this binding must take place after Gatekeeper is setup in the steps above so that the bound interface appears in the list of interfaces in lua/if_map.lua.

How to Run

Once gatekeeper is compiled and the environment is configured correctly, run:

$ sudo build/gatekeeper [EAL OPTIONS] -- [GATEKEEPER OPTIONS]

Where [EAL OPTIONS] are specified before a double dash and represent the parameters for DPDK's Environmental Abstraction Layer and [GATEKEEPER OPTIONS] are specified after the double dash and represent Gatekeeper-specific options.

The early configuration of the system, including device and memory configuration in DPDK, will be logged to stdout. Once Gatekeeper is booted, all information is output to the Gatekeeper log.

How to build packages

Gatekeeper Debian packages can be built with the commands below. They are meant to be run from the repository root and assume the git submodules have been pulled, and that the build dependencies have been installed, as instructed above. Gatekeeper and the submodules will be automatically compiled during the package build process.

$ tar --exclude-vcs -Jcvf ../gatekeeper_1.2.0.orig.tar.xz -C .. gatekeeper
$ debuild -uc -us

The Gatekeeper package will be available in the parent directory.

gatekeeper's People

Contributors

altramayor avatar andrenth avatar cjdoucette avatar hrish1 avatar mengxiang0811 avatar sudeepb02 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gatekeeper's Issues

Review `time_resolution_init()`

Function time_resolution_init() located in file main/main.c estimates the frequency of the TSC register and sets its result in a couple global variable in different units (e.g. cycles_per_sec). DPDK has function rte_get_tsc_hz(), which is equivalent to the global variable cycles_per_sec.

Which function is more precise, time_resolution_init() or rte_get_tsc_hz()? If time_resolution_init(), we should submit a patch to DPDK. In any case, we should adopt rte_get_tsc_hz() in time_resolution_init() to simplify our code.

We should also investigate if the global variables are still needed. For example, should we replace variable cycles_per_sec with rte_get_tsc_hz() or keep it?

Maximize cache hits for GK, GT, and GK-GT unit

The GK blocks, GT blocks, and the GK-GT unit are the critical blocks of Gatekeeper and Grantor servers. In order to allow them to reach line speed, we need to maximize their cache hits, even if this reduces the cache hits of other blocks.

Make all compile-time parameters runtime parameters

The code of Gatekeeper has a number of constants such as GATEKEEPER_MAX_PORTS, GATEKEEPER_MAX_QUEUES, GATEKEEPER_NUM_RX_DESC, GATEKEEPER_NUM_TX_DESC, GATEKEEPER_MBUF_SIZE, GATEKEEPER_CACHE_SIZE, and GATEKEEPER_MAX_PKT_BURST.

The list above is not exhaustive, and one must hunt all these constants throughout the code.

Not only do these parameters have a high impact on the performance of Gatekeeper, but they may potentially hinder deployment. For example, if a given deployment needs more network ports than GATEKEEPER_MAX_PORTS, that Gatekeeper instance will be unnecessarily hindered.

Pruning the flow tables of the GK blocks

Currently, the flow tables of the GK blocks grow indefinitely. There must be a way to reclaim expired entries and another way to alleviate memory pressure when the table is full.

Put the master lcore to work

Currently, once all slave lcores receive their assignments, the master lcores sits busy waiting for each functional block to stop running. That is, the master lcore goes wasted.

Given that the LLS block must always be present, it could run at the master lcore. Alternatively, if the proposed solution of #16 has been already implemented, the configuration could allocate any block to run at the master lcore, and this block pushed to the very end of the configuration to be executed by the master lcore.

Supporting multipath on Gatekeeper servers

We should be able to get the relevant information to implement ECMP through the RTA_MULTIPATH attribute of the rtnetlink library. There's already a stub for handling this functionality in cps/kni.c.

We need to figure out how to use this information to implement ECMP, and do it only when running Grantor.

This feature should remove the relevant XXX in cps/kni.c.

Automate the calculation of the number of needed queues in the configuration

Each interface that Gatekeeper uses needs to have a maximum number of receiving and transmitting queues. The calculation should be automated to avoid this unnecessary, error-prone burden on network administrators.

The issue has origin on the initialization order of DPDK: queues can only be set up after all of them are created. And functional blocks are the only ones that know how many queues they need, and how to set them up. Thus, it's a chicken and egg problem.

Solution proposal: make function XXX_run() return an initialization struct. So, once the Lua scripts finish, Gatekeeper can easily calculate the number of queues and call the initialization functions one by one. This change should make field configuring in struct net_config obsolete.

Given that the log entries of the functional blocks will no longer be in synch with the execution of the Lua scripts in the proposed solution, it may be necessary to review the log entries during initialization in order to keep problem diagnoses easy.

Redirect DPDK log to file

By default DPDK's logging system writes to the standard error device. Since Gatekeeper will run as a daemon, it would be more useful for all DPDK logs to be output to a file.

This should remove the relevant XXX tags in lib/acl.c and (if needed) in main/main.c.

GT blocks must reassemble fragmented packets before making a policy decision

If policies were responsible for reassembling fragmented packets, they would be way harder to write. In addition, policies would have to forgo all the optimizations built into DPDK to assemble packets due to the interface between LuaJit and DPDK. Therefore, GT blocks must assemble fragmented packets before making a policy decision.

A good news is that DPDK has a library to assemble packets:
http://dpdk.org/doc/guides/prog_guide/ip_fragment_reassembly_lib.html

This feature has some corner cases that need to be handled properly:

  1. The fragmented packets have to be assembled without the outer IP header (i.e. the tunnel header), but passed with the outer IP header to the policy. We can use the outer IP header of the last fragment to do avoid keeping the outer header until it's needed.

  2. gt_parse_incoming_pkt() should no longer require that the l4 header must have at least 4 bytes because we can't assume anything about the l4 header of fragmented packets.

  3. Flows associated with fragments that have to be discarded before being fully assembled must be punished. Otherwise, an attacker could overflow the request channel with fragments that never complete, and policies wouldn't be able to do anything about it because they would not be aware of these fragments. The punishment is essentially a policy decision stated in the configuration files to be applied to these cases. For example, decline the flow for 10 minutes.

Implement Lua policy TODOs

There are a few TODO markers in the Lua policy files.

For example, the Lua policy should be responsible for checking the necessary space for each L4 header type, and we should add support for other transport protocols.

We also need to add examples of operations to list the GK FIB entries, the ARP table, the ND table, etc.

Batch policy decisions

Policy decisions (from Grantor servers to Gatekeeper servers) should be batched to reduce the number of packets that Gatekeeper has to handle. However, there is also a timing constraint: policy decisions should not wait for too long before being dispatched.

This feature should remove the relevant TODO in gt/main.c.

Add reference counters to Grantor FIB entries

Flow entries should maintain a reference counter of the grantor FIB entry to avoid the entry to going away before the flow.

All lcores running GK initialize flow entries, so a solution to this issue needs to deal with concurrency.

The chosen solution must be very efficient due to the impact on the throughout of the GK blocks. For example, a simple atomic counter will slow down all GK blocks, especially if there is only one grantor FIB entry.

Idea for a solution: trade the need to maintain the reference counter of the grantor FIB entry for some expensive operation that is only needed while editing the FIB table.

This feature should remove the relevant TODO in gk/main.c.

Improve LLS/LACP error messages

LACP can take a long time (seconds) to properly negotiate and configure, and in the meantime there can be LLS transmission errors that are logged. We should ignore these error messages while still configuring, and also warn the user if LACP is taking an unusually long time to configure since a failure might have occurred. For example, the link partner may not have LACP configured.

This feature should remove the relevant TODO in lls/main.c.

Implement RT and BP in GK

This pull request must also include three other patches: one to drop the old code of RT, another to drop the old code of BP, and another to drop Catcher.

Merge the GK queue discipline in the Linux kernel

We need to get a polished version of the GK queue discipline, and get it merged in the Linux kernel. This will simplify a ton the deployment of Gatekeeper once the GK queues become available in stock kernels.

Deal with unsent packets from GT and GK

Currently, when the GT block is unable to send packets, it immediately drops them. We should investigate whether we can do something better: logging the packets, try to send them again, etc.

This feature should remove the relevant XXX in gt/main.c.

Supporting a 1Gbps NIC

Supporting to a 1Gbps NIC is important for interconnecting with legacy network meshes. This is especially critical for Grantor servers. This feature would also enable people to test Gatekeeper in cheap, commonplace test environments.

A suggestion on how to do this is to implement a virtual NIC over a real dummy NIC. This virtual NIC only has to implement the filters Gatekeeper needs. Moreover, this virtual NIC only has to reach 1Gbps of throughput, for anything above that the installer has to acquire one of the NICs Gatekeeper supports.

Fix prefix security hole vulnerability

We need to make sure that prefixes for existing drop and Grantor entries can only be superseded by new prefixes for drop or Grantor entries.

For example, assume there's a prefix 10.1.1.0/24 that leads to a gateway and the prefix being added to a grantor is 10.1/16. The gateway entry would be a security hole.

The solution is to extend RTE LPM table to have an iterator over its entries. The iterator should require a prefix as a parameter and should list all entries as long as the given prefix (or longer). To list all entries, the given prefix would have length zero.

This feature should remove the relevant TODO in gk/fib.c.

Add support to jumbo frames

Gatekeeper doesn't need jumbo frames, but the code must be able to handle jumbo frames to avoid the chance of existing a jumbo, malformed packet that can knock out a Gatekeeper server.

Limit rate of log entries

Gatekeeper writes log entries to report general information, warnings, and diagnosis information. These log entries are essential for operating a Gatekeeper deployment. However, during high loads or DDoS attacks, there is a potential for the log subsystem to become too heavy of a burden and impact the capacity of Gatekeeper servers. Especially, if attackers find an easy way to trigger log entries. To dodge this risk entirely, Gatekeeper must rate limit the log entries.

The Linux kernel has already a solution for this issue, namely functions: net_err_ratelimited(), net_warn_ratelimited(), net_notice_ratelimited(), among others. The proposed solution here is to study these functions to verify if we can/should adopt them in Gatekeeper. If not, we'll need to devise our own solution for this problem.

Decrement the IP TTL/hop_limits field in GK

This patch needs to update the TTL/hop_limits field in IP headers. As a result, one also needs to update the checksum of the IPv4 header. Moreover, packets with reached TTL/hop limit should be dropped, etc. We need to look at how the Linux kernel deals with TTL/Hop limit field in production.

Verify that MAC address checks are needed

The LLS block currently checks to make sure that we're only receiving packets that are destined to us, which is one of four L2 addresses. The NIC should be able to handle this functionality, so we should verify that it can (and that all NICs in our deployment do the same).

This feature should remove the relevant XXX in lls/main.c.

The IP header is of variable size

The code of Gatekeeper assumes that IP headers always have the same size, but due to options, the headers can vary in size. Moreover, the mechanism is different for IPv4 and IPv6.

The code that parses packets must deal with the variable size. Perhaps, DPDK has some functions to help to deal with it.

Client requests must be received within a timeout

Client requests for dynamic configuration must be received under a specified timeout, or the request should be aborted. The code that's currently in place needs to be further tested.

This feature should remove the relevant XXX in config/dynamic.c.

Patch relevant BGP speaker(s)

Issue #27 makes it so that the BGP speakers that use the KNI can edit the routing table of GK blocks.

The problem is that this routing table is duplicated: once in the kernel and once in Gatekeeper. Instead, it would be better to have the BGP speaker directly communicate with the CPS block using Netlink.

We need to find which BGP speaker(s) are relevant for our deployment(s), and patch them to include this functionality. The BGP speaker Bird (http://bird.network.cz/) is a strong candidate to be patched given its popularity. Another positive factor is that they have documentation for developers:

http://bird.network.cz/?get_doc&f=prog.html

Review all remaining TODO and XXX tags

All remaining TODO tags must be implemented.

All XXX tags must be reviewed and decided if they must be implemented for the first production release, or left in the code.

Automate logical core allocation in configuration

While allowing one to map which logical core to each functional block in the configuration of Gatekeeper is helpful for rare fine tunings and debugging, it's a pain in the neck for regular operation. One needs to automate this allocation.

Verify UDP checksum in GT-GK Unit

The GT-GK Unit should be verifying the UDP checksum for packets that it receives.

This feature should remove the relevant XXX in ggu/main.c.

Get the Lua path dynamically

At least three files (gt/main.c, config/static.c, config/dynamic.c) hard code the path to the Lua directory. We should find a way of making this dynamic. Since it effects the basic configuration of Gatekeeper -- even before Lua is invoked -- we may need to pass it from the Makefile.

This also relates to issue #14, and might be solved in that patch if it's simple enough.

Configuration Example

Any sort of examples for the config would be helpful. Planning to take some benchmarks of this.

Add dynamic config support for Grantor

The dynamic configuration block only supports running on Gatekeeper servers, but we should enable it to run on Grantor servers as well.

This feature should remove the relevant TODO in config/dynamic.c.

Only allocate memory pools for used NUMA nodes

The memory pools per NUMA node held in struct net_config are always allocated; even when a given NUMA node is not being used.

We need to check which NUMA nodes are necessary, and not to allocate the not used nodes.

This will save memory that can be used by other critical data structures such as the flow table.

Protect the Grantor-Gatekeeper channel

If a colluding attacker is present in the destination network, then the attacker could in theory spoof Grantor command packets to Gatekeeper servers. We should explore ways of defending against this kind of inside attack, perhaps using an authentication handshake between Grantor and Gatekeeper servers.

Implement RCU in Gatekeeper

The function gk/fib.c:synchronize_gk_instances() is analogous to RCU's synchronize_rcu(), which suggests that we may be able to profit from RCU.

We should consider whether Gatekeeper could profit from RCU for this function and others, and whether it's worth porting RCU to Gatekeeper. If so, implement it.

This feature should remove the relevant XXX in gk/fib.c.

`RTE_ASSERT()` is a debugging facility

We've been assuming that RTE_ASSERT() works similarly to assert(), that is, it's always there, unless removed in compile time. But RTE_ASSERT() works the other way around as one can find looking at include/rte_debug.h of DPDK:

#if RTE_LOG_LEVEL >= RTE_LOG_DEBUG
#define RTE_ASSERT(exp)	RTE_VERIFY(exp)
#else
#define RTE_ASSERT(exp) do {} while (0)
#endif
#define	RTE_VERIFY(exp)	do {                                                  \
	if (unlikely(!(exp)))                                                           \
		rte_panic("line %d\tassert \"" #exp "\" failed\n", __LINE__); \
} while (0)

We need to review all RTE_ASSERT() in the code and decide if we should keep them as they're, or change to RTE_VERIFY(). Likely, we need to replace all RTE_ASSERT().

Redirect IPv6 packets received in error

The IPv6 ntuple filter is unable to verify the destination IP address of the packet, so it's possible that Gatekeeper could receive a packet that is not destined for it. In that case, we should redirect the packet.

This has only been marked as a TODO for the GT-GK Unit (the back interface), since the front interface (the GK block) already forwards IPv6 traffic as needed.

This feature should remove the relevant TODO in ggu/main.c.

Extending the GK-GT protocol to support flushing policy decisions

When a network administrator changes a policy in response to an attack, she may need to flush all policy decisions cached at the Gatekeeper servers associated to a given destination in order to quickly re-establish the network. Thus, we need to extend the protocol of the GK-GT unit to support these flush requests.

The CPS block must support editing the routing table of the GK blocks

The BGP speakers that use the KNI interfaces exported by the CPS block must have a way to edit the routing table of the GK blocks, so Gatekeeper servers can send the outgoing traffic to the IX.

The editing of the routing table in the Linux kernel is usually done through the Netlink interface. If the CPS can support Netlink, it would be easier to patch BGP speakers to redirect the editing commands to Gatekeeper.

The BGP speaker Bird (http://bird.network.cz/) is a strong candidate to be patched given its popularity. Another positive factor is that they have documentation for developers:

http://bird.network.cz/?get_doc&f=prog.html

Add support for dumping GK FIB entries

It might be useful to dynamically dump the GK FIB tables for debugging purposes. This feature should add this ability as well as the component of the dynamic configuration block that would enable it.

This feature should remove the TODO in include/gatekeeper_fib.h.

Add support for VLAN tags

Although supporting VLAN tags is essential only at the front interface of Gatekeeper servers due to network requirements of IXes, this feature should be available on both interfaces and for Grantor servers as well in order to keep the network code as symmetric as possible.

The code should use hardware acceleration where it's available, but be able to do all in software if not. The reason for this is to help with issue #22 .

Implement client request functionalities

We need to implement more functionality that allows for dynamic interaction with running Gatekeeper and Grantor servers.

For example, both need to be able to dump their ARP and ND tables for network diagnosis, and we need to have a way to update the policy given to Grantor at runtime. There might be more functionality required for the first deployment as well.

This feature should remove the relevant TODO in config/dynamic.c.

Verify that EtherType filters are little endian

For the 82599 NIC, the EtherType value of each EtherType filter should be passed in little endian order. Is this the case with all NICs we are using in our deployments that support the EtherType filter?

This feature should remove the relevant XXX in lib/net.c.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.