Skip to content

Refactor the generation of the bytecode to parse and detect a packet's protocols #83

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Aug 13, 2024

Conversation

qdeslandes
Copy link
Contributor

@qdeslandes qdeslandes commented Aug 12, 2024

This PR refactors the generation of the bytecode used to parse a packet's content, in order to prepare for the program's matchers to be used. It consists in:

  • Introduce bf_swich to emulate a switch-like functionality in BPF bytecode (with doc and unit tests).
  • Refactor packet pre-processing: uses bf_swich to simplify protocol detection, reorder instructions for more clarity.
  • Reorder and cleanup pre-processed packet data located in the runtime context

@qdeslandes qdeslandes marked this pull request as draft August 12, 2024 13:02
@qdeslandes qdeslandes force-pushed the refactor_packet_parsing branch from 9a04ec6 to 792bec9 Compare August 12, 2024 14:18
Store layer 3 protocol type and offset into the program's runtime
context.

The program will not accept the packet by default if the L3 protocol is
not IPv4, as we aim to support more than just IPv4.

Eventually, only the protocols matchers are defined for will be
processed.
stub.c contains functions used to generate stub of BPF bytecode, some of
the code tries to generate switch-like features, to parse different
network protocols for example. However, the C code used to generate the
BPF bytecode can become very messy, due to the various jumps required to
emulate such functionality.

Introduce bf_swich and its API to ease creation of switch-like
structures in BPF bytecode. The usage is described in swich.h, but in
summary:
- Create a bf_swich object, initialize it
- Add the various cases, with a value to match against the switch, and a
  list of instructions to execute if it matches.
- Define the default instructions to execute, if any
- Generate the bytecode for the operations described above by call
  bf_swich_geneate.
@qdeslandes qdeslandes force-pushed the refactor_packet_parsing branch from 792bec9 to fe7321e Compare August 13, 2024 07:10
@qdeslandes qdeslandes marked this pull request as ready for review August 13, 2024 13:17
@qdeslandes qdeslandes self-assigned this Aug 13, 2024
@qdeslandes qdeslandes force-pushed the refactor_packet_parsing branch from 0030345 to e74673a Compare August 13, 2024 13:21
Unify naming of the runtime context protocol fields and reorder the
fields to group layers together.
Use bf_swich to improve the BPF bytecode generated to process a
protocol's header. Reorder some instructions so the logic used to call
the various kfunc is clearer and closer to C.
Use a more generic function name to define function generating the BPF
bytecode responsible for pre-processing a packet.
Matcher applies a specific logic to the packet's data according to an
expected data layout (the procotol header). In order to support various
protocol on the same layer, the matcher should check if the protocol
they are able to parse is effectively present in the packet.
@qdeslandes qdeslandes force-pushed the refactor_packet_parsing branch from e74673a to 9e4d7f5 Compare August 13, 2024 13:33
@qdeslandes qdeslandes merged commit 7c8af58 into facebook:main Aug 13, 2024
13 checks passed
@qdeslandes qdeslandes deleted the refactor_packet_parsing branch August 13, 2024 13:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants