/* * Copyright (C) 2017-2018 Red Hat, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Author: Gris Ge */ #ifndef __ISCSI_USR_IFACE_H__ #define __ISCSI_USR_IFACE_H__ #include "libopeniscsiusr/libopeniscsiusr_common.h" #include #include #include #define VALUE_MAXVAL 256 /* the maximum length of 223 bytes in the RFC. */ /* ^ VALUE_MAXVAL is copied from usr/idbm.h * The RFC 3720 only said: * If not otherwise specified, the maximum length of a simple-value (not * its encoded representation) is 255 bytes, not including the delimiter * (comma or zero byte). */ #define ISCSI_MAX_IFACE_LEN 65 #define ISCSI_TRANSPORT_NAME_MAXLEN 16 #define ISCSI_MAX_STR_LEN 80 #define ISCSI_HWADDRESS_BUF_SIZE 18 #define TARGET_NAME_MAXLEN VALUE_MAXVAL /* ^ TODO(Gris Ge): Above 5 constants are copy from usr/config.h, need to * verify them in linux kernel code */ struct iscsi_iface { /* iscsi iface record name */ char name[ISCSI_MAX_IFACE_LEN]; uint32_t iface_num; /* network layer iface name (eth0) */ char netdev[IFNAMSIZ]; char ipaddress[NI_MAXHOST]; char subnet_mask[NI_MAXHOST]; char gateway[NI_MAXHOST]; char bootproto[ISCSI_MAX_STR_LEN]; char ipv6_linklocal[NI_MAXHOST]; char ipv6_router[NI_MAXHOST]; char ipv6_autocfg[NI_MAXHOST]; char linklocal_autocfg[NI_MAXHOST]; char router_autocfg[NI_MAXHOST]; uint8_t prefix_len; /* ^ prefix_len is removed, as linux kernel has no such sysfs property * and there is no actual code in usr/ folder set this property * * Added back, we need to be backward compatible with iface records * created by older tools. Look at fixing code to ignore in record * files instead? - cleech */ uint16_t vlan_id; uint8_t vlan_priority; char vlan_state[ISCSI_MAX_STR_LEN]; char state[ISCSI_MAX_STR_LEN]; /* 0 = disable, * 1 = enable */ uint16_t mtu; uint16_t port; char delayed_ack[ISCSI_MAX_STR_LEN]; char nagle[ISCSI_MAX_STR_LEN]; char tcp_wsf_state[ISCSI_MAX_STR_LEN]; uint8_t tcp_wsf; uint8_t tcp_timer_scale; char tcp_timestamp[ISCSI_MAX_STR_LEN]; char dhcp_dns[ISCSI_MAX_STR_LEN]; char dhcp_slp_da[ISCSI_MAX_STR_LEN]; char tos_state[ISCSI_MAX_STR_LEN]; uint8_t tos; char gratuitous_arp[ISCSI_MAX_STR_LEN]; char dhcp_alt_client_id_state[ISCSI_MAX_STR_LEN]; char dhcp_alt_client_id[ISCSI_MAX_STR_LEN]; char dhcp_req_vendor_id_state[ISCSI_MAX_STR_LEN]; char dhcp_vendor_id_state[ISCSI_MAX_STR_LEN]; char dhcp_vendor_id[ISCSI_MAX_STR_LEN]; char dhcp_learn_iqn[ISCSI_MAX_STR_LEN]; char fragmentation[ISCSI_MAX_STR_LEN]; char incoming_forwarding[ISCSI_MAX_STR_LEN]; uint8_t ttl; char gratuitous_neighbor_adv[ISCSI_MAX_STR_LEN]; char redirect[ISCSI_MAX_STR_LEN]; char mld[ISCSI_MAX_STR_LEN]; uint32_t flow_label; uint32_t traffic_class; uint8_t hop_limit; uint32_t nd_reachable_tmo; uint32_t nd_rexmit_time; uint32_t nd_stale_tmo; uint8_t dup_addr_detect_cnt; uint32_t router_adv_link_mtu; uint16_t def_task_mgmt_tmo; char header_digest[ISCSI_MAX_STR_LEN]; char data_digest[ISCSI_MAX_STR_LEN]; char immediate_data[ISCSI_MAX_STR_LEN]; char initial_r2t[ISCSI_MAX_STR_LEN]; char data_seq_inorder[ISCSI_MAX_STR_LEN]; char data_pdu_inorder[ISCSI_MAX_STR_LEN]; uint8_t erl; uint32_t max_recv_dlength; uint32_t first_burst_len; uint16_t max_out_r2t; uint32_t max_burst_len; char chap_auth[ISCSI_MAX_STR_LEN]; char bidi_chap[ISCSI_MAX_STR_LEN]; char strict_login_comp[ISCSI_MAX_STR_LEN]; char discovery_auth[ISCSI_MAX_STR_LEN]; char discovery_logout[ISCSI_MAX_STR_LEN]; char port_state[ISCSI_MAX_STR_LEN]; char port_speed[ISCSI_MAX_STR_LEN]; /* * TODO: we may have to make this bigger and interconnect * specific for infiniband */ char hwaddress[ISCSI_HWADDRESS_BUF_SIZE]; char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; /* * This is only used for boot now, but the iser guys * can use this for their virtualization idea. */ char alias[TARGET_NAME_MAXLEN + 1]; char iname[TARGET_NAME_MAXLEN + 1]; bool is_ipv6; }; __DLL_LOCAL int _iscsi_iface_get_from_sysfs(struct iscsi_context *ctx, uint32_t host_id, uint32_t sid, char *iface_kern_id, struct iscsi_iface **iface); __DLL_LOCAL bool _iface_is_valid(struct iscsi_iface *iface); #endif /* End of __ISCSI_USR_IFACE_H__ */