cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

parse_simple.c (1308B)


      1/* Copyright (c) 2016 Facebook
      2 *
      3 * This program is free software; you can redistribute it and/or
      4 * modify it under the terms of version 2 of the GNU General Public
      5 * License as published by the Free Software Foundation.
      6 */
      7#define KBUILD_MODNAME "foo"
      8#include <linux/ip.h>
      9#include <linux/ipv6.h>
     10#include <linux/in.h>
     11#include <linux/tcp.h>
     12#include <linux/udp.h>
     13#include <uapi/linux/bpf.h>
     14#include <net/ip.h>
     15#include <bpf/bpf_helpers.h>
     16
     17#define DEFAULT_PKTGEN_UDP_PORT 9
     18
     19/* copy of 'struct ethhdr' without __packed */
     20struct eth_hdr {
     21	unsigned char   h_dest[ETH_ALEN];
     22	unsigned char   h_source[ETH_ALEN];
     23	unsigned short  h_proto;
     24};
     25
     26SEC("simple")
     27int handle_ingress(struct __sk_buff *skb)
     28{
     29	void *data = (void *)(long)skb->data;
     30	struct eth_hdr *eth = data;
     31	struct iphdr *iph = data + sizeof(*eth);
     32	struct udphdr *udp = data + sizeof(*eth) + sizeof(*iph);
     33	void *data_end = (void *)(long)skb->data_end;
     34
     35	/* single length check */
     36	if (data + sizeof(*eth) + sizeof(*iph) + sizeof(*udp) > data_end)
     37		return 0;
     38
     39	if (eth->h_proto != htons(ETH_P_IP))
     40		return 0;
     41	if (iph->protocol != IPPROTO_UDP || iph->ihl != 5)
     42		return 0;
     43	if (ip_is_fragment(iph))
     44		return 0;
     45	if (udp->dest == htons(DEFAULT_PKTGEN_UDP_PORT))
     46		return TC_ACT_SHOT;
     47	return 0;
     48}
     49char _license[] SEC("license") = "GPL";