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

vde_user.c (2407B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (C) 2007 Luca Bigliardi (shammash@artha.org).
      4 */
      5
      6#include <stddef.h>
      7#include <errno.h>
      8#include <libvdeplug.h>
      9#include <net_user.h>
     10#include <um_malloc.h>
     11#include "vde.h"
     12
     13static int vde_user_init(void *data, void *dev)
     14{
     15	struct vde_data *pri = data;
     16	VDECONN *conn = NULL;
     17	int err = -EINVAL;
     18
     19	pri->dev = dev;
     20
     21	conn = vde_open(pri->vde_switch, pri->descr, pri->args);
     22
     23	if (conn == NULL) {
     24		err = -errno;
     25		printk(UM_KERN_ERR "vde_user_init: vde_open failed, "
     26		       "errno = %d\n", errno);
     27		return err;
     28	}
     29
     30	printk(UM_KERN_INFO "vde backend - connection opened\n");
     31
     32	pri->conn = conn;
     33
     34	return 0;
     35}
     36
     37static int vde_user_open(void *data)
     38{
     39	struct vde_data *pri = data;
     40
     41	if (pri->conn != NULL)
     42		return vde_datafd(pri->conn);
     43
     44	printk(UM_KERN_WARNING "vde_open - we have no VDECONN to open");
     45	return -EINVAL;
     46}
     47
     48static void vde_remove(void *data)
     49{
     50	struct vde_data *pri = data;
     51
     52	if (pri->conn != NULL) {
     53		printk(UM_KERN_INFO "vde backend - closing connection\n");
     54		vde_close(pri->conn);
     55		pri->conn = NULL;
     56		kfree(pri->args);
     57		pri->args = NULL;
     58		return;
     59	}
     60
     61	printk(UM_KERN_WARNING "vde_remove - we have no VDECONN to remove");
     62}
     63
     64const struct net_user_info vde_user_info = {
     65	.init		= vde_user_init,
     66	.open		= vde_user_open,
     67	.close	 	= NULL,
     68	.remove	 	= vde_remove,
     69	.add_address	= NULL,
     70	.delete_address = NULL,
     71	.mtu		= ETH_MAX_PACKET,
     72	.max_packet	= ETH_MAX_PACKET + ETH_HEADER_OTHER,
     73};
     74
     75void vde_init_libstuff(struct vde_data *vpri, struct vde_init *init)
     76{
     77	struct vde_open_args *args;
     78
     79	vpri->args = uml_kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL);
     80	if (vpri->args == NULL) {
     81		printk(UM_KERN_ERR "vde_init_libstuff - vde_open_args "
     82		       "allocation failed");
     83		return;
     84	}
     85
     86	args = vpri->args;
     87
     88	args->port = init->port;
     89	args->group = init->group;
     90	args->mode = init->mode ? init->mode : 0700;
     91
     92	args->port ?  printk("port %d", args->port) :
     93		printk("undefined port");
     94}
     95
     96int vde_user_read(void *conn, void *buf, int len)
     97{
     98	VDECONN *vconn = conn;
     99	int rv;
    100
    101	if (vconn == NULL)
    102		return 0;
    103
    104	rv = vde_recv(vconn, buf, len, 0);
    105	if (rv < 0) {
    106		if (errno == EAGAIN)
    107			return 0;
    108		return -errno;
    109	}
    110	else if (rv == 0)
    111		return -ENOTCONN;
    112
    113	return rv;
    114}
    115
    116int vde_user_write(void *conn, void *buf, int len)
    117{
    118	VDECONN *vconn = conn;
    119
    120	if (vconn == NULL)
    121		return 0;
    122
    123	return vde_send(vconn, buf, len, 0);
    124}
    125