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

em_nbyte.c (1684B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * net/sched/em_nbyte.c	N-Byte ematch
      4 *
      5 * Authors:	Thomas Graf <tgraf@suug.ch>
      6 */
      7
      8#include <linux/gfp.h>
      9#include <linux/module.h>
     10#include <linux/types.h>
     11#include <linux/kernel.h>
     12#include <linux/string.h>
     13#include <linux/skbuff.h>
     14#include <linux/tc_ematch/tc_em_nbyte.h>
     15#include <net/pkt_cls.h>
     16
     17struct nbyte_data {
     18	struct tcf_em_nbyte	hdr;
     19	char			pattern[];
     20};
     21
     22static int em_nbyte_change(struct net *net, void *data, int data_len,
     23			   struct tcf_ematch *em)
     24{
     25	struct tcf_em_nbyte *nbyte = data;
     26
     27	if (data_len < sizeof(*nbyte) ||
     28	    data_len < (sizeof(*nbyte) + nbyte->len))
     29		return -EINVAL;
     30
     31	em->datalen = sizeof(*nbyte) + nbyte->len;
     32	em->data = (unsigned long)kmemdup(data, em->datalen, GFP_KERNEL);
     33	if (em->data == 0UL)
     34		return -ENOMEM;
     35
     36	return 0;
     37}
     38
     39static int em_nbyte_match(struct sk_buff *skb, struct tcf_ematch *em,
     40			  struct tcf_pkt_info *info)
     41{
     42	struct nbyte_data *nbyte = (struct nbyte_data *) em->data;
     43	unsigned char *ptr = tcf_get_base_ptr(skb, nbyte->hdr.layer);
     44
     45	ptr += nbyte->hdr.off;
     46
     47	if (!tcf_valid_offset(skb, ptr, nbyte->hdr.len))
     48		return 0;
     49
     50	return !memcmp(ptr, nbyte->pattern, nbyte->hdr.len);
     51}
     52
     53static struct tcf_ematch_ops em_nbyte_ops = {
     54	.kind	  = TCF_EM_NBYTE,
     55	.change	  = em_nbyte_change,
     56	.match	  = em_nbyte_match,
     57	.owner	  = THIS_MODULE,
     58	.link	  = LIST_HEAD_INIT(em_nbyte_ops.link)
     59};
     60
     61static int __init init_em_nbyte(void)
     62{
     63	return tcf_em_register(&em_nbyte_ops);
     64}
     65
     66static void __exit exit_em_nbyte(void)
     67{
     68	tcf_em_unregister(&em_nbyte_ops);
     69}
     70
     71MODULE_LICENSE("GPL");
     72
     73module_init(init_em_nbyte);
     74module_exit(exit_em_nbyte);
     75
     76MODULE_ALIAS_TCF_EMATCH(TCF_EM_NBYTE);