From 527ac435e46c59f9ee83aced36ccf83a0518f7fe Mon Sep 17 00:00:00 2001 From: John Fastabend Date: Wed, 27 Jul 2011 15:08:04 -0700 Subject: [PATCH 17/29] lldpad: Do not enable CEE mode if explicitly disabled Do not re-enable CEE mode by default after it has been explicitly disabled. Signed-off-by: John Fastabend Signed-off-by: Petr Sabata --- lldp_dcbx.c | 15 ++++++++++++--- lldp_dcbx_cmds.c | 11 ++--------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/lldp_dcbx.c b/lldp_dcbx.c index 4cf2cb5..7949147 100644 --- a/lldp_dcbx.c +++ b/lldp_dcbx.c @@ -563,10 +563,15 @@ initialized: /* if the dcbx field is not filled in by the capabilities * query, then the kernel is older and does not support - * IEEE mode, so make CEE DCBX active by default. + * IEEE mode, so make CEE DCBX active by default. Unless + * the dcb state has been disabled from command line. */ get_dcb_capabilities(ifname, &dcb_support); - if (!dcb_support.dcbx || (gdcbx_subtype & ~MASK_DCBX_FORCE)) { + + exists = get_dcb_enable_state(ifname, &dcb_enable); + + if ((exists < 0 || dcb_enable) && + (!dcb_support.dcbx || (gdcbx_subtype & ~MASK_DCBX_FORCE))) { set_dcbx_mode(tlvs->ifname, DCB_CAP_DCBX_HOST | DCB_CAP_DCBX_VER_CEE); set_hw_state(ifname, 1); @@ -719,8 +724,12 @@ int dcbx_rchange(struct port *port, struct unpacked_tlv *tlv) } if (tlv->type == TYPE_0) { + int enabled; + int exists = get_dcb_enable_state(dcbx->ifname, &enabled); + if (!dcbx->active && !ieee8021qaz_tlvs_rxed(dcbx->ifname) && - dcbx->rxed_tlvs) { + dcbx->rxed_tlvs && + (exists < 0 || enabled)) { LLDPAD_INFO("CEE DCBX %s going ACTIVE\n", dcbx->ifname); set_dcbx_mode(port->ifname, DCB_CAP_DCBX_HOST | DCB_CAP_DCBX_VER_CEE); diff --git a/lldp_dcbx_cmds.c b/lldp_dcbx_cmds.c index 7799557..9ec671e 100644 --- a/lldp_dcbx_cmds.c +++ b/lldp_dcbx_cmds.c @@ -245,7 +245,6 @@ static int get_dcb_state(char *port_id, char *rbuf) static dcb_result set_dcb_state(char *port_id, char *ibuf, int ilen) { bool state; - int tmp; int off; int plen; dcb_result rval = dcb_success; @@ -255,14 +254,8 @@ static dcb_result set_dcb_state(char *port_id, char *ibuf, int ilen) if (ilen == (off + CFG_DCB_DLEN)) { state = (*(ibuf+off+DCB_STATE)) ^ '0'; - /* if get_hw_state fails, then don't bother - * trying to set the state. - */ - if (get_hw_state(port_id, &tmp) || - set_hw_state(port_id, state)) - rval = dcb_failed; - else - rval = save_dcb_enable_state(port_id, state); + set_hw_state(port_id, state); + rval = save_dcb_enable_state(port_id, state); } else { printf("error - setcommand has invalid argument length\n"); rval = dcb_bad_params; -- 1.7.6