xref: /qemu/hw/net/rocker/rocker_world.c (revision 107e4b35)
1dc488f88SScott Feldman /*
2dc488f88SScott Feldman  * QEMU rocker switch emulation - switch worlds
3dc488f88SScott Feldman  *
4dc488f88SScott Feldman  * Copyright (c) 2014 Scott Feldman <sfeldma@gmail.com>
5dc488f88SScott Feldman  *
6dc488f88SScott Feldman  * This program is free software; you can redistribute it and/or modify
7dc488f88SScott Feldman  * it under the terms of the GNU General Public License as published by
8dc488f88SScott Feldman  * the Free Software Foundation; either version 2 of the License, or
9dc488f88SScott Feldman  * (at your option) any later version.
10dc488f88SScott Feldman  *
11dc488f88SScott Feldman  * This program is distributed in the hope that it will be useful,
12dc488f88SScott Feldman  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13dc488f88SScott Feldman  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14dc488f88SScott Feldman  * GNU General Public License for more details.
15dc488f88SScott Feldman  */
16dc488f88SScott Feldman 
17e8d40465SPeter Maydell #include "qemu/osdep.h"
18dc488f88SScott Feldman #include "qemu/iov.h"
19dc488f88SScott Feldman 
20dc488f88SScott Feldman #include "rocker.h"
21dc488f88SScott Feldman #include "rocker_world.h"
22dc488f88SScott Feldman 
23dc488f88SScott Feldman struct world {
24dc488f88SScott Feldman     Rocker *r;
25dc488f88SScott Feldman     enum rocker_world_type type;
26dc488f88SScott Feldman     WorldOps *ops;
27dc488f88SScott Feldman };
28dc488f88SScott Feldman 
world_ingress(World * world,uint32_t pport,const struct iovec * iov,int iovcnt)29dc488f88SScott Feldman ssize_t world_ingress(World *world, uint32_t pport,
30dc488f88SScott Feldman                       const struct iovec *iov, int iovcnt)
31dc488f88SScott Feldman {
32dc488f88SScott Feldman     if (world->ops->ig) {
33dc488f88SScott Feldman         return world->ops->ig(world, pport, iov, iovcnt);
34dc488f88SScott Feldman     }
35dc488f88SScott Feldman 
3696497af0SScott Feldman     return -1;
37dc488f88SScott Feldman }
38dc488f88SScott Feldman 
world_do_cmd(World * world,DescInfo * info,char * buf,uint16_t cmd,RockerTlv * cmd_info_tlv)39dc488f88SScott Feldman int world_do_cmd(World *world, DescInfo *info,
40dc488f88SScott Feldman                  char *buf, uint16_t cmd, RockerTlv *cmd_info_tlv)
41dc488f88SScott Feldman {
42dc488f88SScott Feldman     if (world->ops->cmd) {
43dc488f88SScott Feldman         return world->ops->cmd(world, info, buf, cmd, cmd_info_tlv);
44dc488f88SScott Feldman     }
45dc488f88SScott Feldman 
46dc488f88SScott Feldman     return -ROCKER_ENOTSUP;
47dc488f88SScott Feldman }
48dc488f88SScott Feldman 
world_alloc(Rocker * r,size_t sizeof_private,enum rocker_world_type type,WorldOps * ops)49dc488f88SScott Feldman World *world_alloc(Rocker *r, size_t sizeof_private,
50dc488f88SScott Feldman                    enum rocker_world_type type, WorldOps *ops)
51dc488f88SScott Feldman {
52dc488f88SScott Feldman     World *w = g_malloc0(sizeof(World) + sizeof_private);
53dc488f88SScott Feldman 
54dc488f88SScott Feldman     w->r = r;
55dc488f88SScott Feldman     w->type = type;
56dc488f88SScott Feldman     w->ops = ops;
57dc488f88SScott Feldman     if (w->ops->init) {
58dc488f88SScott Feldman         w->ops->init(w);
59dc488f88SScott Feldman     }
60dc488f88SScott Feldman 
61dc488f88SScott Feldman     return w;
62dc488f88SScott Feldman }
63dc488f88SScott Feldman 
world_free(World * world)64dc488f88SScott Feldman void world_free(World *world)
65dc488f88SScott Feldman {
66dc488f88SScott Feldman     if (world->ops->uninit) {
67dc488f88SScott Feldman         world->ops->uninit(world);
68dc488f88SScott Feldman     }
69dc488f88SScott Feldman     g_free(world);
70dc488f88SScott Feldman }
71dc488f88SScott Feldman 
world_reset(World * world)72dc488f88SScott Feldman void world_reset(World *world)
73dc488f88SScott Feldman {
74dc488f88SScott Feldman     if (world->ops->uninit) {
75dc488f88SScott Feldman         world->ops->uninit(world);
76dc488f88SScott Feldman     }
77dc488f88SScott Feldman     if (world->ops->init) {
78dc488f88SScott Feldman         world->ops->init(world);
79dc488f88SScott Feldman     }
80dc488f88SScott Feldman }
81dc488f88SScott Feldman 
world_private(World * world)82dc488f88SScott Feldman void *world_private(World *world)
83dc488f88SScott Feldman {
84dc488f88SScott Feldman     return world + 1;
85dc488f88SScott Feldman }
86dc488f88SScott Feldman 
world_rocker(World * world)87dc488f88SScott Feldman Rocker *world_rocker(World *world)
88dc488f88SScott Feldman {
89dc488f88SScott Feldman     return world->r;
90dc488f88SScott Feldman }
91dc488f88SScott Feldman 
world_type(World * world)92dc488f88SScott Feldman enum rocker_world_type world_type(World *world)
93dc488f88SScott Feldman {
94dc488f88SScott Feldman     return world->type;
95dc488f88SScott Feldman }
96dc488f88SScott Feldman 
world_name(World * world)97dc488f88SScott Feldman const char *world_name(World *world)
98dc488f88SScott Feldman {
99*031143c8SJiri Pirko     return world->ops->name;
100dc488f88SScott Feldman }
101