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