1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*4882a593Smuzhiyun #ifndef __NET_DROPMON_H 3*4882a593Smuzhiyun #define __NET_DROPMON_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/types.h> 6*4882a593Smuzhiyun #include <linux/netlink.h> 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun struct net_dm_drop_point { 9*4882a593Smuzhiyun __u8 pc[8]; 10*4882a593Smuzhiyun __u32 count; 11*4882a593Smuzhiyun }; 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define is_drop_point_hw(x) do {\ 14*4882a593Smuzhiyun int ____i, ____j;\ 15*4882a593Smuzhiyun for (____i = 0; ____i < 8; i ____i++)\ 16*4882a593Smuzhiyun ____j |= x[____i];\ 17*4882a593Smuzhiyun ____j;\ 18*4882a593Smuzhiyun } while (0) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define NET_DM_CFG_VERSION 0 21*4882a593Smuzhiyun #define NET_DM_CFG_ALERT_COUNT 1 22*4882a593Smuzhiyun #define NET_DM_CFG_ALERT_DELAY 2 23*4882a593Smuzhiyun #define NET_DM_CFG_MAX 3 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun struct net_dm_config_entry { 26*4882a593Smuzhiyun __u32 type; 27*4882a593Smuzhiyun __u64 data __attribute__((aligned(8))); 28*4882a593Smuzhiyun }; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun struct net_dm_config_msg { 31*4882a593Smuzhiyun __u32 entries; 32*4882a593Smuzhiyun struct net_dm_config_entry options[0]; 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun struct net_dm_alert_msg { 36*4882a593Smuzhiyun __u32 entries; 37*4882a593Smuzhiyun struct net_dm_drop_point points[0]; 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun struct net_dm_user_msg { 41*4882a593Smuzhiyun union { 42*4882a593Smuzhiyun struct net_dm_config_msg user; 43*4882a593Smuzhiyun struct net_dm_alert_msg alert; 44*4882a593Smuzhiyun } u; 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* These are the netlink message types for this protocol */ 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun enum { 51*4882a593Smuzhiyun NET_DM_CMD_UNSPEC = 0, 52*4882a593Smuzhiyun NET_DM_CMD_ALERT, 53*4882a593Smuzhiyun NET_DM_CMD_CONFIG, 54*4882a593Smuzhiyun NET_DM_CMD_START, 55*4882a593Smuzhiyun NET_DM_CMD_STOP, 56*4882a593Smuzhiyun NET_DM_CMD_PACKET_ALERT, 57*4882a593Smuzhiyun NET_DM_CMD_CONFIG_GET, 58*4882a593Smuzhiyun NET_DM_CMD_CONFIG_NEW, 59*4882a593Smuzhiyun NET_DM_CMD_STATS_GET, 60*4882a593Smuzhiyun NET_DM_CMD_STATS_NEW, 61*4882a593Smuzhiyun _NET_DM_CMD_MAX, 62*4882a593Smuzhiyun }; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #define NET_DM_CMD_MAX (_NET_DM_CMD_MAX - 1) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* 67*4882a593Smuzhiyun * Our group identifiers 68*4882a593Smuzhiyun */ 69*4882a593Smuzhiyun #define NET_DM_GRP_ALERT 1 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun enum net_dm_attr { 72*4882a593Smuzhiyun NET_DM_ATTR_UNSPEC, 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun NET_DM_ATTR_ALERT_MODE, /* u8 */ 75*4882a593Smuzhiyun NET_DM_ATTR_PC, /* u64 */ 76*4882a593Smuzhiyun NET_DM_ATTR_SYMBOL, /* string */ 77*4882a593Smuzhiyun NET_DM_ATTR_IN_PORT, /* nested */ 78*4882a593Smuzhiyun NET_DM_ATTR_TIMESTAMP, /* u64 */ 79*4882a593Smuzhiyun NET_DM_ATTR_PROTO, /* u16 */ 80*4882a593Smuzhiyun NET_DM_ATTR_PAYLOAD, /* binary */ 81*4882a593Smuzhiyun NET_DM_ATTR_PAD, 82*4882a593Smuzhiyun NET_DM_ATTR_TRUNC_LEN, /* u32 */ 83*4882a593Smuzhiyun NET_DM_ATTR_ORIG_LEN, /* u32 */ 84*4882a593Smuzhiyun NET_DM_ATTR_QUEUE_LEN, /* u32 */ 85*4882a593Smuzhiyun NET_DM_ATTR_STATS, /* nested */ 86*4882a593Smuzhiyun NET_DM_ATTR_HW_STATS, /* nested */ 87*4882a593Smuzhiyun NET_DM_ATTR_ORIGIN, /* u16 */ 88*4882a593Smuzhiyun NET_DM_ATTR_HW_TRAP_GROUP_NAME, /* string */ 89*4882a593Smuzhiyun NET_DM_ATTR_HW_TRAP_NAME, /* string */ 90*4882a593Smuzhiyun NET_DM_ATTR_HW_ENTRIES, /* nested */ 91*4882a593Smuzhiyun NET_DM_ATTR_HW_ENTRY, /* nested */ 92*4882a593Smuzhiyun NET_DM_ATTR_HW_TRAP_COUNT, /* u32 */ 93*4882a593Smuzhiyun NET_DM_ATTR_SW_DROPS, /* flag */ 94*4882a593Smuzhiyun NET_DM_ATTR_HW_DROPS, /* flag */ 95*4882a593Smuzhiyun NET_DM_ATTR_FLOW_ACTION_COOKIE, /* binary */ 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun __NET_DM_ATTR_MAX, 98*4882a593Smuzhiyun NET_DM_ATTR_MAX = __NET_DM_ATTR_MAX - 1 99*4882a593Smuzhiyun }; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /** 102*4882a593Smuzhiyun * enum net_dm_alert_mode - Alert mode. 103*4882a593Smuzhiyun * @NET_DM_ALERT_MODE_SUMMARY: A summary of recent drops is sent to user space. 104*4882a593Smuzhiyun * @NET_DM_ALERT_MODE_PACKET: Each dropped packet is sent to user space along 105*4882a593Smuzhiyun * with metadata. 106*4882a593Smuzhiyun */ 107*4882a593Smuzhiyun enum net_dm_alert_mode { 108*4882a593Smuzhiyun NET_DM_ALERT_MODE_SUMMARY, 109*4882a593Smuzhiyun NET_DM_ALERT_MODE_PACKET, 110*4882a593Smuzhiyun }; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun enum { 113*4882a593Smuzhiyun NET_DM_ATTR_PORT_NETDEV_IFINDEX, /* u32 */ 114*4882a593Smuzhiyun NET_DM_ATTR_PORT_NETDEV_NAME, /* string */ 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun __NET_DM_ATTR_PORT_MAX, 117*4882a593Smuzhiyun NET_DM_ATTR_PORT_MAX = __NET_DM_ATTR_PORT_MAX - 1 118*4882a593Smuzhiyun }; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun enum { 121*4882a593Smuzhiyun NET_DM_ATTR_STATS_DROPPED, /* u64 */ 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun __NET_DM_ATTR_STATS_MAX, 124*4882a593Smuzhiyun NET_DM_ATTR_STATS_MAX = __NET_DM_ATTR_STATS_MAX - 1 125*4882a593Smuzhiyun }; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun enum net_dm_origin { 128*4882a593Smuzhiyun NET_DM_ORIGIN_SW, 129*4882a593Smuzhiyun NET_DM_ORIGIN_HW, 130*4882a593Smuzhiyun }; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun #endif 133