1/*
2 * Copyright 2018, NICTA
3 *
4 * This software may be distributed and modified according to the terms of
5 * the GNU General Public License version 2. Note that NO WARRANTY is provided.
6 * See "LICENSE_GPLv2.txt" for details.
7 *
8 * @TAG(NICTA_GPL)
9 */
10
11/*
12 *  This file contains wrappers for various linux kernel api calls that we need
13 * to make from Cogent code.
14*/
15
16inline $ty:(R (SysState, NetDeviceAbstractType) SysState) alloc_netdev_lo_ac($ty:(SysState) st)
17{
18        $ty:(R (SysState, NetDeviceAbstractType) SysState) ret;
19        $ty:(NetDeviceAbstractType) dev;
20
21        dev = alloc_netdev(0, "cglo", NET_NAME_UNKNOWN, cg_loopback_setup_ac);
22        if (!dev) {
23                ret.tag = TAG_ENUM_Error;
24                ret.Error = st;
25        } else {
26                ret.tag = TAG_ENUM_Success;
27                ret.Success.p1 = st;
28                ret.Success.p2 = dev;
29        }
30
31        return ret;
32}
33
34inline $ty:((SysState, NetDeviceAbstractType, NetAbstractType)) dev_net_set_ac($ty:((SysState, NetDeviceAbstractType, NetAbstractType)) args)
35{
36        dev_net_set(args.p2, args.p3);
37
38        return args;
39}
40
41inline $ty:(RR (SysState, NetDeviceAbstractType) () ()) register_net_dev_ac($ty:((SysState, NetDeviceAbstractType)) args)
42{
43        int err;
44        $ty:((SysState, NetDeviceAbstractType)) data;
45        $ty:(RR (SysState, NetDeviceAbstractType) () ()) ret;
46
47        err = register_netdev(args.p2);
48        if (err) {
49                ret.p2.tag = TAG_ENUM_Error;
50        } else {
51                ret.p2.tag = TAG_ENUM_Success;
52        }
53
54        data.p1 = args.p1;
55        data.p2 = args.p2;
56
57        ret.p1 = data;
58
59        return ret;
60}
61
62inline $ty:((SysState, NetAbstractType)) assign_loopback_dev_in_net_ac($ty:((SysState, NetDeviceAbstractType, NetAbstractType)) args)
63{
64        $ty:((SysState, NetAbstractType)) ret;
65        $ty:(NetAbstractType) net = args.p3;
66
67        net->loopback_dev = args.p2;
68
69        ret.p1 = args.p1;
70        ret.p2 = net;
71
72        return ret;
73}
74
75inline $ty:(SysState) free_netdev_ac($ty:((SysState, NetDeviceAbstractType)) args)
76{
77        free_netdev(args.p2);
78
79        return args.p1;
80}
81
82inline $ty:(RR (SysState, NetDeviceAbstractType) () ()) netdev_alloc_pcpu_stats_ac($ty:((SysState, NetDeviceAbstractType)) args)
83{
84        $ty:((SysState, NetDeviceAbstractType)) data;
85        $ty:(RR (SysState, NetDeviceAbstractType) () ()) ret;
86        $ty:(PCPULStats) stat;
87
88        /* Ugly ugly type cast below, */
89        (args.p2)->lstats = (struct pcpu_lstats *)netdev_alloc_pcpu_stats(*stat);
90        if (!(args.p2)->lstats) {
91                ret.p2.tag = TAG_ENUM_Error;
92        } else {
93                ret.p2.tag = TAG_ENUM_Success;
94        }
95
96        data.p1 = args.p1;
97        data.p2 = args.p2;
98        ret.p1 = data;
99
100        return ret;
101}
102
103inline $ty:((SysState, NetDeviceAbstractType)) netdev_free_pcpu_stats_ac($ty:((SysState, NetDeviceAbstractType)) args)
104{
105        dev_net(args.p2)->loopback_dev = NULL;
106        free_percpu((args.p2)->lstats);
107
108        return args;
109}
110