linux/arch/um/drivers/vde_user.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2007 Luca Bigliardi (shammash@artha.org).
   3 * Licensed under the GPL.
   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
 126
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.