)]}'
{
  "commit": "953d10936be8d64fd66f09098d3a342bbb2756f8",
  "tree": "dd5f4b48bd1cc95e0e08710d6d1c418a1c91a67a",
  "parents": [
    "32ad607145dca23d28ca714ef0845c8170d3fc06"
  ],
  "author": {
    "name": "Alexei Starovoitov",
    "email": "ast@plumgrid.com",
    "time": "Tue Jun 24 18:00:41 2014 -0700"
  },
  "committer": {
    "name": "Alexei Starovoitov",
    "email": "ast@plumgrid.com",
    "time": "Thu Sep 25 21:58:02 2014 -0700"
  },
  "message": "samples: bpf: example of stateful socket filtering\n\nthis socket filter example does:\n\n- creates a hashtable in kernel with key 4 bytes and value 8 bytes\n\n- populates map[6] \u003d 0; map[17] \u003d 0;  // 6 - tcp_proto, 17 - udp_proto\n\n- loads eBPF program:\n  r0 \u003d skb[14 + 9]; // load one byte of ip-\u003eproto\n  *(u32*)(fp - 4) \u003d r0;\n  value \u003d bpf_map_lookup_elem(map_fd, fp - 4);\n  if (value)\n       (*(u64*)value) +\u003d 1;\n\n- attaches this program to eth0 raw socket\n\n- every second user space reads map[6] and map[17] to see how many\n  TCP and UDP packets were seen on eth0\n\nSigned-off-by: Alexei Starovoitov \u003cast@plumgrid.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "9e7a9bc2194df7bcb71496acbff17dcf340d6d77",
      "old_mode": 33188,
      "old_path": "samples/bpf/Makefile",
      "new_id": "0dae1d14acf364c96420a9bc97082832df7b61d7",
      "new_mode": 33188,
      "new_path": "samples/bpf/Makefile"
    },
    {
      "type": "modify",
      "old_id": "8a31babeca5dc1878f87d4e400aedc2ca2b9388e",
      "old_mode": 33188,
      "old_path": "samples/bpf/libbpf.h",
      "new_id": "e309f70346ee2d9fdd3a842097ce5a2adb5787f4",
      "new_mode": 33188,
      "new_path": "samples/bpf/libbpf.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "097f3821b23e815fc674b8217fe200c9357ed04c",
      "new_mode": 33188,
      "new_path": "samples/bpf/sock_example.c"
    }
  ]
}
