uml: network formatting
[linux-2.6/x86.git] / arch / um / drivers / vde_user.c
blob7533cd3cbba40e3ce604e43c67a02ba093f87e50
1 /*
2 * Copyright (C) 2007 Luca Bigliardi (shammash@artha.org).
3 * Licensed under the GPL.
4 */
6 #include <stddef.h>
7 #include <errno.h>
8 #include <libvdeplug.h>
9 #include "kern_constants.h"
10 #include "net_user.h"
11 #include "um_malloc.h"
12 #include "user.h"
13 #include "vde.h"
15 #define MAX_PACKET (ETH_MAX_PACKET + ETH_HEADER_OTHER)
17 static int vde_user_init(void *data, void *dev)
19 struct vde_data *pri = data;
20 VDECONN *conn = NULL;
21 int err = -EINVAL;
23 pri->dev = dev;
25 conn = vde_open(pri->vde_switch, pri->descr, pri->args);
27 if (conn == NULL) {
28 err = -errno;
29 printk(UM_KERN_ERR "vde_user_init: vde_open failed, "
30 "errno = %d\n", errno);
31 return err;
34 printk(UM_KERN_INFO "vde backend - connection opened\n");
36 pri->conn = conn;
38 return 0;
41 static int vde_user_open(void *data)
43 struct vde_data *pri = data;
45 if (pri->conn != NULL)
46 return vde_datafd(pri->conn);
48 printk(UM_KERN_WARNING "vde_open - we have no VDECONN to open");
49 return -EINVAL;
52 static void vde_remove(void *data)
54 struct vde_data *pri = data;
56 if (pri->conn != NULL) {
57 printk(UM_KERN_INFO "vde backend - closing connection\n");
58 vde_close(pri->conn);
59 pri->conn = NULL;
60 kfree(pri->args);
61 pri->args = NULL;
62 return;
65 printk(UM_KERN_WARNING "vde_remove - we have no VDECONN to remove");
68 static int vde_set_mtu(int mtu, void *data)
70 return mtu;
73 const struct net_user_info vde_user_info = {
74 .init = vde_user_init,
75 .open = vde_user_open,
76 .close = NULL,
77 .remove = vde_remove,
78 .set_mtu = vde_set_mtu,
79 .add_address = NULL,
80 .delete_address = NULL,
81 .max_packet = MAX_PACKET - ETH_HEADER_OTHER
84 void vde_init_libstuff(struct vde_data *vpri, struct vde_init *init)
86 struct vde_open_args *args;
88 vpri->args = kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL);
89 if (vpri->args == NULL) {
90 printk(UM_KERN_ERR "vde_init_libstuff - vde_open_args"
91 "allocation failed");
92 return;
95 args = vpri->args;
97 args->port = init->port;
98 args->group = init->group;
99 args->mode = init->mode ? init->mode : 0700;
101 args->port ? printk(UM_KERN_INFO "port %d", args->port) :
102 printk(UM_KERN_INFO "undefined port");
105 int vde_user_read(void *conn, void *buf, int len)
107 VDECONN *vconn = conn;
108 int rv;
110 if (vconn == NULL)
111 return 0;
113 rv = vde_recv(vconn, buf, len, 0);
114 if (rv < 0) {
115 if (errno == EAGAIN)
116 return 0;
117 return -errno;
119 else if (rv == 0)
120 return -ENOTCONN;
122 return rv;
125 int vde_user_write(void *conn, void *buf, int len)
127 VDECONN *vconn = conn;
129 if (vconn == NULL)
130 return 0;
132 return vde_send(vconn, buf, len, 0);