General list for discussing Bufferbloat
 help / color / mirror / Atom feed
From: Michael Richardson <mcr@sandelman.ca>
To: bloat <bloat@lists.bufferbloat.net>
Subject: Re: [Bloat] high speed packet and protocol processing in userspace?
Date: Thu, 16 Mar 2017 13:32:14 -0400	[thread overview]
Message-ID: <18543.1489685534@obiwan.sandelman.ca> (raw)
In-Reply-To: <CAA93jw6a6H2i3AoNrH__Uf1gaz56opGYB9cv_e6QHd9Ywjxn-w@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 2115 bytes --]


Dave Taht <dave.taht@gmail.com> wrote:
    > I'm *really* impressed by the level of tool support emerging for ebpf,
    > but it's still essentially writing assembly when I'd rather use an
    > equivalent of bison or peg. If taking that massive step backwards is
    > the right thing, to build that tool (if none exists)... well... ok.

years ago, I worked in the NPU space, and we created the language that I
think you wanted.  It was described here:

https://www.ietf.org/archive/id/draft-nossik-pax-pdl-00.txt

IPv4 patterns filters looked like this:

PATTERN  IP_v4_Hdr_For_ICMP {
  version UINT 4 == 4;
  ihl UINT 4 == 5;            /* length == 5 : no options */
  typeOfService UINT 8;
  totalLength UINT 16;
  identification UINT 16;
  flagReserved BIT 1 == 0;
  flagDontFragment BIT 1;
  flagMoreFragments BIT 1 == 0;    /* last fragments only */
  fragmentOffset UINT 13 == 0;    /* first fragments only */
  timeToLive UINT 8;
  protocol BIT 8 == IPPROTO_ICMP;                 /* ICMP */
  headerChecksum BIT 16;
  sourceAddress BIT 32;
  destinationAddress BIT 32
}

You could compile the patterns, and then instantiate fields at runtime if you
needed to.  (i.e: add constraints).  Also merge patterns to select (a) or (b)
in constant time (but not constant memory usage)

Solidum (for whom I worked at the time) had a compiler that would turn this
into ) patricia-tree filters that ran in hardware at wirespeed.  But, APIs
into ernels were hard to get accepted.
In the end, only people willing to pay for this were TLAs who wanted to run
regex's on traffic. Regex took lots of ram, but TLAs didn't buy many sockets.
I would love to be able to recycle the compiler as open source; it could
easily spit out EBPF, but generating assembly directly might be faster
actually.  The Patricia tree is basically jmp base+nextbyteofpacket., but
stored more compactly.

--
]               Never tell me the odds!                 | ipv6 mesh networks [
]   Michael Richardson, Sandelman Software Works        | network architect  [
]     mcr@sandelman.ca  http://www.sandelman.ca/        |   ruby on rails    [


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

  reply	other threads:[~2017-03-16 17:32 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-16 15:19 Dave Taht
2017-03-16 15:52 ` Michael Richardson
2017-03-16 16:27   ` Eric Dumazet
2017-03-16 16:44     ` Dave Taht
2017-03-16 17:32       ` Michael Richardson [this message]
2017-03-16 20:04         ` Dave Taht
2017-03-17  9:02     ` Jesper Dangaard Brouer
2017-03-17 12:10       ` Daniel Borkmann
2017-03-17 20:11         ` Jesper Dangaard Brouer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://lists.bufferbloat.net/postorius/lists/bloat.lists.bufferbloat.net/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=18543.1489685534@obiwan.sandelman.ca \
    --to=mcr@sandelman.ca \
    --cc=bloat@lists.bufferbloat.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox