/* * Copyright(c) 2009 Intel Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope 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, write to the Free Software Foundation, Inc., * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * * Maintained at www.Open-FCoE.org */ #ifndef _FCOEMON_H_ #define _FCOEMON_H_ #include "fcoe_utils.h" struct fcoe_config { int debug; int use_syslog; int dcb_init; struct fcoe_port *port; } fcoe_config; /* * Log message. */ #define FCM_LOG(...) \ do { \ sa_log(__VA_ARGS__); \ } while (0) #define FCM_LOG_ERR(error, ...) \ do { \ sa_log_err(error, NULL, __VA_ARGS__); \ } while (0) #define FCM_LOG_DBG(fmt, args...) \ do { \ sa_log_debug(fmt, ##args); \ } while (0) #define FCM_LOG_DEV_DBG(fcm, fmt, args...) \ do { \ sa_log_debug("%s, " fmt, fcm->ifname, ##args); \ } while (0) #define FCM_LOG_DEV(fcm, fmt, args...) \ do { \ sa_log("%s, " fmt, fcm->ifname, ##args); \ } while (0) /* * States for HBAs relative to the DCB daemon. * States advance sequentially if conditions are right. */ enum fcm_dcbd_state { FCD_INIT = 0, /* starting state */ FCD_GET_DCB_STATE, /* getting DCB state */ FCD_SEND_CONF, /* set proposed configuration */ FCD_GET_PFC_CONFIG, /* getting PFC configuration */ FCD_GET_APP_CONFIG, /* getting APP configuration */ FCD_GET_PFC_OPER, /* getting PFC operational mode */ FCD_GET_APP_OPER, /* getting AAP operational mode */ FCD_GET_PEER, /* getting peer configuration */ FCD_DONE, /* DCB exchanges complete */ FCD_ERROR, /* DCB error or port unknown by DCB */ }; /* * States for IEEE DCB devices. */ enum ieee_state { IEEE_INIT = 0, /* Starting state */ IEEE_GET_STATE, /* Getting IEEE DCB state */ IEEE_DONE, /* Received IEEE DCB state */ IEEE_ACTIVE, /* IEEE is in ACTIVE state */ IEEE_ERROR, /* Error receiving IEEE DCB state */ }; #define MSG_RBUF sizeof(int) struct sock_info { int sock; struct sockaddr_un from; socklen_t fromlen; }; /* * Action codes for FCoE ports */ enum fcp_action { FCP_WAIT = 0, /* waiting for something to happen */ FCP_CREATE_IF, /* create FCoE interface */ FCP_DESTROY_IF, /* destroy FCoE interface */ FCP_RESET_IF, /* reset FCoE interface */ FCP_SCAN_IF, /* scan FCoE interface */ FCP_ENABLE_IF, /* enable FCoE interface */ FCP_DISABLE_IF, /* disable FCoE interface */ FCP_ACTIVATE_IF, /* create or enable FCoE interface */ FCP_ERROR, /* error condition */ FCP_VLAN_DISC, /* start VLAN discovery */ }; #define FCM_DCBD_STATES { \ { "INIT", FCD_INIT }, \ { "GET_DCB_STATE", FCD_GET_DCB_STATE }, \ { "SEND_CONF", FCD_SEND_CONF }, \ { "GET_PFC_CONFIG", FCD_GET_PFC_CONFIG }, \ { "GET_APP_CONFIG", FCD_GET_APP_CONFIG }, \ { "GET_PFC_OPER", FCD_GET_PFC_OPER }, \ { "GET_APP_OPER", FCD_GET_APP_OPER }, \ { "GET_PEER", FCD_GET_PEER }, \ { "DONE", FCD_DONE }, \ { "ERROR", FCD_ERROR }, \ { NULL, 0 } \ } struct feature_info { u_int32_t enable; /* enable/disable feature */ u_int32_t advertise; /* enable/disable advertise */ u_int32_t willing; /* enable/disable willing mode */ u_int32_t syncd; /* synchronized with switch */ u_int32_t op_mode; /* operational mode */ u_int32_t op_vers; /* feature operational version */ u_int32_t op_error; /* operational error */ u_int32_t subtype; /* subtype */ union { u_int32_t pfcup; u_int32_t appcfg; } u; }; /* * Description of potential FCoE network interface. */ struct fcm_netif { TAILQ_ENTRY(fcm_netif) ff_list; /* list linkage */ u_int32_t ff_enabled:1; /* operational status */ u_int32_t ff_dcb_state; /* DCB feature state */ u_int32_t dcbx_cap; /* DCBX capability */ enum ieee_state ieee_state; /* IEEE state */ u_int32_t ieee_resp_pending;/* IEEE response pending */ u_int32_t ieee_pfc_info; /* IEEE pfc info */ u_int32_t ieee_app_info; /* IEEE app info */ struct feature_info ff_pfc_info; /* PFC feature info */ struct feature_info ff_app_info; /* App feature info */ u_int8_t ff_operstate; /* RFC 2863 operational status */ enum fcm_dcbd_state ff_dcbd_state; /* DCB daemon state */ char ifname[IFNAMSIZ]; /* Ethernet interface name */ int response_pending; /* dcbd query in progress */ int dcbd_retry_cnt; /* Number of query attempts */ struct sa_timer dcbd_retry_timer; /* dcbd retry timer */ }; /* * Description of fcoe socket server interface */ struct fcm_srv_info { int srv_sock; }; TAILQ_HEAD(fcm_netif_head, fcm_netif); struct fcm_netif_head fcm_netif_head; static void fcm_dcbd_init(void); static void fcm_dcbd_shutdown(void); static void fcm_fcoe_init(void); static struct fcm_netif *fcm_netif_lookup(char *); static struct fcm_netif *fcm_netif_lookup_create(char *); static int fcm_link_init(void); static void fcm_dcbd_state_set(struct fcm_netif *, enum fcm_dcbd_state); #endif /* _FCOEMON_H_ */