1 /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ 2 3 #ifndef _LINUX_DRBD_GEN_H 4 #define _LINUX_DRBD_GEN_H 5 6 #include <net/netlink.h> 7 #include <net/genetlink.h> 8 9 #include <uapi/linux/drbd_genl.h> 10 #include <linux/drbd.h> 11 #include <linux/drbd_limits.h> 12 13 /* Common nested types */ 14 extern const struct nla_policy drbd_connection_info_nl_policy[DRBD_A_CONNECTION_INFO_CONN_ROLE + 1]; 15 extern const struct nla_policy drbd_connection_statistics_nl_policy[DRBD_A_CONNECTION_STATISTICS_CONN_CONGESTED + 1]; 16 extern const struct nla_policy drbd_detach_parms_nl_policy[DRBD_A_DETACH_PARMS_FORCE_DETACH + 1]; 17 extern const struct nla_policy drbd_device_info_nl_policy[DRBD_A_DEVICE_INFO_DEV_DISK_STATE + 1]; 18 extern const struct nla_policy drbd_device_statistics_nl_policy[DRBD_A_DEVICE_STATISTICS_HISTORY_UUIDS + 1]; 19 extern const struct nla_policy drbd_disconnect_parms_nl_policy[DRBD_A_DISCONNECT_PARMS_FORCE_DISCONNECT + 1]; 20 extern const struct nla_policy drbd_disk_conf_nl_policy[DRBD_A_DISK_CONF_DISABLE_WRITE_SAME + 1]; 21 extern const struct nla_policy drbd_drbd_cfg_context_nl_policy[DRBD_A_DRBD_CFG_CONTEXT_CTX_PEER_ADDR + 1]; 22 extern const struct nla_policy drbd_net_conf_nl_policy[DRBD_A_NET_CONF_SOCK_CHECK_TIMEO + 1]; 23 extern const struct nla_policy drbd_new_c_uuid_parms_nl_policy[DRBD_A_NEW_C_UUID_PARMS_CLEAR_BM + 1]; 24 extern const struct nla_policy drbd_peer_device_info_nl_policy[DRBD_A_PEER_DEVICE_INFO_PEER_RESYNC_SUSP_DEPENDENCY + 1]; 25 extern const struct nla_policy drbd_peer_device_statistics_nl_policy[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_FLAGS + 1]; 26 extern const struct nla_policy drbd_res_opts_nl_policy[DRBD_A_RES_OPTS_ON_NO_DATA + 1]; 27 extern const struct nla_policy drbd_resize_parms_nl_policy[DRBD_A_RESIZE_PARMS_AL_STRIPE_SIZE + 1]; 28 extern const struct nla_policy drbd_resource_info_nl_policy[DRBD_A_RESOURCE_INFO_RES_SUSP_FEN + 1]; 29 extern const struct nla_policy drbd_resource_statistics_nl_policy[DRBD_A_RESOURCE_STATISTICS_RES_STAT_WRITE_ORDERING + 1]; 30 extern const struct nla_policy drbd_set_role_parms_nl_policy[DRBD_A_SET_ROLE_PARMS_ASSUME_UPTODATE + 1]; 31 extern const struct nla_policy drbd_start_ov_parms_nl_policy[DRBD_A_START_OV_PARMS_OV_STOP_SECTOR + 1]; 32 33 /* Ops table for drbd */ 34 extern const struct genl_split_ops drbd_nl_ops[32]; 35 36 int drbd_pre_doit(const struct genl_split_ops *ops, struct sk_buff *skb, 37 struct genl_info *info); 38 void 39 drbd_post_doit(const struct genl_split_ops *ops, struct sk_buff *skb, 40 struct genl_info *info); 41 int drbd_adm_dump_devices_done(struct netlink_callback *cb); 42 int drbd_adm_dump_connections_done(struct netlink_callback *cb); 43 int drbd_adm_dump_peer_devices_done(struct netlink_callback *cb); 44 45 int drbd_nl_get_status_doit(struct sk_buff *skb, struct genl_info *info); 46 int drbd_nl_get_status_dumpit(struct sk_buff *skb, struct netlink_callback *cb); 47 int drbd_nl_new_minor_doit(struct sk_buff *skb, struct genl_info *info); 48 int drbd_nl_del_minor_doit(struct sk_buff *skb, struct genl_info *info); 49 int drbd_nl_new_resource_doit(struct sk_buff *skb, struct genl_info *info); 50 int drbd_nl_del_resource_doit(struct sk_buff *skb, struct genl_info *info); 51 int drbd_nl_resource_opts_doit(struct sk_buff *skb, struct genl_info *info); 52 int drbd_nl_connect_doit(struct sk_buff *skb, struct genl_info *info); 53 int drbd_nl_disconnect_doit(struct sk_buff *skb, struct genl_info *info); 54 int drbd_nl_attach_doit(struct sk_buff *skb, struct genl_info *info); 55 int drbd_nl_resize_doit(struct sk_buff *skb, struct genl_info *info); 56 int drbd_nl_primary_doit(struct sk_buff *skb, struct genl_info *info); 57 int drbd_nl_secondary_doit(struct sk_buff *skb, struct genl_info *info); 58 int drbd_nl_new_c_uuid_doit(struct sk_buff *skb, struct genl_info *info); 59 int drbd_nl_start_ov_doit(struct sk_buff *skb, struct genl_info *info); 60 int drbd_nl_detach_doit(struct sk_buff *skb, struct genl_info *info); 61 int drbd_nl_invalidate_doit(struct sk_buff *skb, struct genl_info *info); 62 int drbd_nl_inval_peer_doit(struct sk_buff *skb, struct genl_info *info); 63 int drbd_nl_pause_sync_doit(struct sk_buff *skb, struct genl_info *info); 64 int drbd_nl_resume_sync_doit(struct sk_buff *skb, struct genl_info *info); 65 int drbd_nl_suspend_io_doit(struct sk_buff *skb, struct genl_info *info); 66 int drbd_nl_resume_io_doit(struct sk_buff *skb, struct genl_info *info); 67 int drbd_nl_outdate_doit(struct sk_buff *skb, struct genl_info *info); 68 int drbd_nl_get_timeout_type_doit(struct sk_buff *skb, struct genl_info *info); 69 int drbd_nl_down_doit(struct sk_buff *skb, struct genl_info *info); 70 int drbd_nl_chg_disk_opts_doit(struct sk_buff *skb, struct genl_info *info); 71 int drbd_nl_chg_net_opts_doit(struct sk_buff *skb, struct genl_info *info); 72 int drbd_nl_get_resources_dumpit(struct sk_buff *skb, 73 struct netlink_callback *cb); 74 int drbd_nl_get_devices_dumpit(struct sk_buff *skb, 75 struct netlink_callback *cb); 76 int drbd_nl_get_connections_dumpit(struct sk_buff *skb, 77 struct netlink_callback *cb); 78 int drbd_nl_get_peer_devices_dumpit(struct sk_buff *skb, 79 struct netlink_callback *cb); 80 int drbd_nl_get_initial_state_dumpit(struct sk_buff *skb, 81 struct netlink_callback *cb); 82 83 enum { 84 DRBD_NLGRP_EVENTS, 85 }; 86 87 struct drbd_cfg_reply { 88 char info_text[0]; 89 __u32 info_text_len; 90 }; 91 92 struct drbd_cfg_context { 93 __u32 ctx_volume; 94 char ctx_resource_name[128]; 95 __u32 ctx_resource_name_len; 96 char ctx_my_addr[128]; 97 __u32 ctx_my_addr_len; 98 char ctx_peer_addr[128]; 99 __u32 ctx_peer_addr_len; 100 }; 101 102 struct disk_conf { 103 char backing_dev[128]; 104 __u32 backing_dev_len; 105 char meta_dev[128]; 106 __u32 meta_dev_len; 107 __s32 meta_dev_idx; 108 __u64 disk_size; 109 __u32 max_bio_bvecs; 110 __u32 on_io_error; 111 __u32 fencing; 112 __u32 resync_rate; 113 __s32 resync_after; 114 __u32 al_extents; 115 __u32 c_plan_ahead; 116 __u32 c_delay_target; 117 __u32 c_fill_target; 118 __u32 c_max_rate; 119 __u32 c_min_rate; 120 unsigned char disk_barrier; 121 unsigned char disk_flushes; 122 unsigned char disk_drain; 123 unsigned char md_flushes; 124 __u32 disk_timeout; 125 __u32 read_balancing; 126 unsigned char al_updates; 127 unsigned char discard_zeroes_if_aligned; 128 __u32 rs_discard_granularity; 129 unsigned char disable_write_same; 130 }; 131 132 struct res_opts { 133 char cpu_mask[DRBD_CPU_MASK_SIZE]; 134 __u32 cpu_mask_len; 135 __u32 on_no_data; 136 }; 137 138 struct net_conf { 139 char shared_secret[SHARED_SECRET_MAX]; 140 __u32 shared_secret_len; 141 char cram_hmac_alg[SHARED_SECRET_MAX]; 142 __u32 cram_hmac_alg_len; 143 char integrity_alg[SHARED_SECRET_MAX]; 144 __u32 integrity_alg_len; 145 char verify_alg[SHARED_SECRET_MAX]; 146 __u32 verify_alg_len; 147 char csums_alg[SHARED_SECRET_MAX]; 148 __u32 csums_alg_len; 149 __u32 wire_protocol; 150 __u32 connect_int; 151 __u32 timeout; 152 __u32 ping_int; 153 __u32 ping_timeo; 154 __u32 sndbuf_size; 155 __u32 rcvbuf_size; 156 __u32 ko_count; 157 __u32 max_buffers; 158 __u32 max_epoch_size; 159 __u32 unplug_watermark; 160 __u32 after_sb_0p; 161 __u32 after_sb_1p; 162 __u32 after_sb_2p; 163 __u32 rr_conflict; 164 __u32 on_congestion; 165 __u32 cong_fill; 166 __u32 cong_extents; 167 unsigned char two_primaries; 168 unsigned char discard_my_data; 169 unsigned char tcp_cork; 170 unsigned char always_asbp; 171 unsigned char tentative; 172 unsigned char use_rle; 173 unsigned char csums_after_crash_only; 174 __u32 sock_check_timeo; 175 }; 176 177 struct set_role_parms { 178 unsigned char assume_uptodate; 179 }; 180 181 struct resize_parms { 182 __u64 resize_size; 183 unsigned char resize_force; 184 unsigned char no_resync; 185 __u32 al_stripes; 186 __u32 al_stripe_size; 187 }; 188 189 struct state_info { 190 __u32 sib_reason; 191 __u32 current_state; 192 __u64 capacity; 193 __u64 ed_uuid; 194 __u32 prev_state; 195 __u32 new_state; 196 char uuids[DRBD_NL_UUIDS_SIZE]; 197 __u32 uuids_len; 198 __u32 disk_flags; 199 __u64 bits_total; 200 __u64 bits_oos; 201 __u64 bits_rs_total; 202 __u64 bits_rs_failed; 203 char helper[32]; 204 __u32 helper_len; 205 __u32 helper_exit_code; 206 __u64 send_cnt; 207 __u64 recv_cnt; 208 __u64 read_cnt; 209 __u64 writ_cnt; 210 __u64 al_writ_cnt; 211 __u64 bm_writ_cnt; 212 __u32 ap_bio_cnt; 213 __u32 ap_pending_cnt; 214 __u32 rs_pending_cnt; 215 }; 216 217 struct start_ov_parms { 218 __u64 ov_start_sector; 219 __u64 ov_stop_sector; 220 }; 221 222 struct new_c_uuid_parms { 223 unsigned char clear_bm; 224 }; 225 226 struct timeout_parms { 227 __u32 timeout_type; 228 }; 229 230 struct disconnect_parms { 231 unsigned char force_disconnect; 232 }; 233 234 struct detach_parms { 235 unsigned char force_detach; 236 }; 237 238 struct resource_info { 239 __u32 res_role; 240 unsigned char res_susp; 241 unsigned char res_susp_nod; 242 unsigned char res_susp_fen; 243 }; 244 245 struct device_info { 246 __u32 dev_disk_state; 247 }; 248 249 struct connection_info { 250 __u32 conn_connection_state; 251 __u32 conn_role; 252 }; 253 254 struct peer_device_info { 255 __u32 peer_repl_state; 256 __u32 peer_disk_state; 257 __u32 peer_resync_susp_user; 258 __u32 peer_resync_susp_peer; 259 __u32 peer_resync_susp_dependency; 260 }; 261 262 struct resource_statistics { 263 __u32 res_stat_write_ordering; 264 }; 265 266 struct device_statistics { 267 __u64 dev_size; 268 __u64 dev_read; 269 __u64 dev_write; 270 __u64 dev_al_writes; 271 __u64 dev_bm_writes; 272 __u32 dev_upper_pending; 273 __u32 dev_lower_pending; 274 unsigned char dev_upper_blocked; 275 unsigned char dev_lower_blocked; 276 unsigned char dev_al_suspended; 277 __u64 dev_exposed_data_uuid; 278 __u64 dev_current_uuid; 279 __u32 dev_disk_flags; 280 char history_uuids[DRBD_NL_HISTORY_UUIDS_SIZE]; 281 __u32 history_uuids_len; 282 }; 283 284 struct connection_statistics { 285 unsigned char conn_congested; 286 }; 287 288 struct peer_device_statistics { 289 __u64 peer_dev_received; 290 __u64 peer_dev_sent; 291 __u32 peer_dev_pending; 292 __u32 peer_dev_unacked; 293 __u64 peer_dev_out_of_sync; 294 __u64 peer_dev_resync_failed; 295 __u64 peer_dev_bitmap_uuid; 296 __u32 peer_dev_flags; 297 }; 298 299 struct drbd_notification_header { 300 __u32 nh_type; 301 }; 302 303 struct drbd_helper_info { 304 char helper_name[32]; 305 __u32 helper_name_len; 306 __u32 helper_status; 307 }; 308 309 int drbd_cfg_reply_to_skb(struct sk_buff *skb, struct drbd_cfg_reply *s); 310 311 int drbd_cfg_context_from_attrs(struct drbd_cfg_context *s, struct genl_info *info); 312 int drbd_cfg_context_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 313 int drbd_cfg_context_to_skb(struct sk_buff *skb, struct drbd_cfg_context *s); 314 315 int disk_conf_from_attrs(struct disk_conf *s, struct genl_info *info); 316 int disk_conf_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 317 int disk_conf_to_skb(struct sk_buff *skb, struct disk_conf *s); 318 void set_disk_conf_defaults(struct disk_conf *x); 319 320 int res_opts_from_attrs(struct res_opts *s, struct genl_info *info); 321 int res_opts_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 322 int res_opts_to_skb(struct sk_buff *skb, struct res_opts *s); 323 void set_res_opts_defaults(struct res_opts *x); 324 325 int net_conf_from_attrs(struct net_conf *s, struct genl_info *info); 326 int net_conf_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 327 int net_conf_to_skb(struct sk_buff *skb, struct net_conf *s); 328 void set_net_conf_defaults(struct net_conf *x); 329 330 int set_role_parms_from_attrs(struct set_role_parms *s, struct genl_info *info); 331 int set_role_parms_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 332 int set_role_parms_to_skb(struct sk_buff *skb, struct set_role_parms *s); 333 334 int resize_parms_from_attrs(struct resize_parms *s, struct genl_info *info); 335 int resize_parms_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 336 int resize_parms_to_skb(struct sk_buff *skb, struct resize_parms *s); 337 void set_resize_parms_defaults(struct resize_parms *x); 338 339 int state_info_to_skb(struct sk_buff *skb, struct state_info *s); 340 341 int start_ov_parms_from_attrs(struct start_ov_parms *s, struct genl_info *info); 342 int start_ov_parms_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 343 int start_ov_parms_to_skb(struct sk_buff *skb, struct start_ov_parms *s); 344 345 int new_c_uuid_parms_from_attrs(struct new_c_uuid_parms *s, struct genl_info *info); 346 int new_c_uuid_parms_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 347 int new_c_uuid_parms_to_skb(struct sk_buff *skb, struct new_c_uuid_parms *s); 348 349 int timeout_parms_to_skb(struct sk_buff *skb, struct timeout_parms *s); 350 351 int disconnect_parms_from_attrs(struct disconnect_parms *s, struct genl_info *info); 352 int disconnect_parms_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 353 int disconnect_parms_to_skb(struct sk_buff *skb, struct disconnect_parms *s); 354 355 int detach_parms_from_attrs(struct detach_parms *s, struct genl_info *info); 356 int detach_parms_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 357 int detach_parms_to_skb(struct sk_buff *skb, struct detach_parms *s); 358 359 int resource_info_from_attrs(struct resource_info *s, struct genl_info *info); 360 int resource_info_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 361 int resource_info_to_skb(struct sk_buff *skb, struct resource_info *s); 362 363 int device_info_from_attrs(struct device_info *s, struct genl_info *info); 364 int device_info_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 365 int device_info_to_skb(struct sk_buff *skb, struct device_info *s); 366 367 int connection_info_from_attrs(struct connection_info *s, struct genl_info *info); 368 int connection_info_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 369 int connection_info_to_skb(struct sk_buff *skb, struct connection_info *s); 370 371 int peer_device_info_from_attrs(struct peer_device_info *s, struct genl_info *info); 372 int peer_device_info_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 373 int peer_device_info_to_skb(struct sk_buff *skb, struct peer_device_info *s); 374 375 int resource_statistics_from_attrs(struct resource_statistics *s, struct genl_info *info); 376 int resource_statistics_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 377 int resource_statistics_to_skb(struct sk_buff *skb, struct resource_statistics *s); 378 379 int device_statistics_from_attrs(struct device_statistics *s, struct genl_info *info); 380 int device_statistics_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 381 int device_statistics_to_skb(struct sk_buff *skb, struct device_statistics *s); 382 383 int connection_statistics_from_attrs(struct connection_statistics *s, struct genl_info *info); 384 int connection_statistics_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 385 int connection_statistics_to_skb(struct sk_buff *skb, struct connection_statistics *s); 386 387 int peer_device_statistics_from_attrs(struct peer_device_statistics *s, struct genl_info *info); 388 int peer_device_statistics_ntb_from_attrs(struct nlattr ***ret_nested_attribute_table, struct genl_info *info); 389 int peer_device_statistics_to_skb(struct sk_buff *skb, struct peer_device_statistics *s); 390 391 int drbd_notification_header_to_skb(struct sk_buff *skb, struct drbd_notification_header *s); 392 393 int drbd_helper_info_to_skb(struct sk_buff *skb, struct drbd_helper_info *s); 394 395 #endif /* _LINUX_DRBD_GEN_H */ 396