File dcbd-0.7.35rt.patch of Package dcbd
Index: dcbd-0.7.31rt/clif_cmds.c
===================================================================
--- dcbd-0.7.31rt.orig/clif_cmds.c
+++ dcbd-0.7.31rt/clif_cmds.c
@@ -869,18 +869,18 @@ static int get_bcn_data(bcn_attribs *bcn
for (i = 0; i < MAX_USER_PRIORITIES; i++) {
sprintf(rbuf+BCN_UP_RP(i), "%1x",
- bcn_data->bcn.bcn_up_settings[i].rp_admin);
+ bcn_data->bcn.up_settings[i].rp_admin);
}
if (cmd == CMD_GET_PEER || cmd == CMD_GET_OPER) {
bitmap = 0;
for (i = 0; i < MAX_USER_PRIORITIES; i++)
- if (bcn_data->bcn.bcn_up_settings[i].rp_oper)
+ if (bcn_data->bcn.up_settings[i].rp_oper)
bitmap |= (1<<i);
sprintf(rbuf+BCN_UP_RP_OP, "%02x", bitmap);
bitmap = 0;
for (i = 0; i < MAX_USER_PRIORITIES; i++)
- if (bcn_data->bcn.bcn_up_settings[i].rem_tag_oper)
+ if (bcn_data->bcn.up_settings[i].rem_tag_oper)
bitmap |= (1<<i);
sprintf(rbuf+BCN_UP_RP_RTAG_OP, "%02x", bitmap);
} else {
@@ -894,7 +894,7 @@ static int get_bcn_data(bcn_attribs *bcn
if (cmd == CMD_GET_PEER) {
bitmap = 0;
for (i = 0; i < MAX_USER_PRIORITIES; i++)
- if (bcn_data->bcn.bcn_up_settings[i].cp_admin)
+ if (bcn_data->bcn.up_settings[i].cp_admin)
bitmap |= (1<<i);
sprintf(rbuf+BCN_UP_CP, "%02x", bitmap);
} else {
@@ -941,6 +941,7 @@ static int get_bcn_data(bcn_attribs *bcn
static int set_pg_config(pg_attribs *pg_data, char *port_id, char *ibuf,
int ilen)
{
+ full_dcb_attrib_ptrs dcb_data;
u8 flag;
dcb_result status = dcb_success;
int i;
@@ -1051,7 +1052,9 @@ static int set_pg_config(pg_attribs *pg_
return dcb_bad_params;
}
- status = dcb_check_config(pg_data);
+ memset((void *)&dcb_data, 0, sizeof(dcb_data));
+ dcb_data.pg = pg_data;
+ status = dcb_check_config(&dcb_data);
/* if the rule checking fails and client did not supply
* user priority percentages, then compute new percentages
@@ -1059,7 +1062,7 @@ static int set_pg_config(pg_attribs *pg_
*/
if (status == dcb_bad_params && !uppcts_changed) {
rebalance_uppcts(pg_data);
- status = dcb_check_config(pg_data);
+ status = dcb_check_config(&dcb_data);
}
if (status != dcb_success) {
@@ -1222,9 +1225,9 @@ static int set_bcn_config(bcn_attribs *b
if (flag == CLIF_NOT_SUPPLIED)
continue;
if (flag & 0x07)
- bcn_data->bcn.bcn_up_settings[i].rp_admin = 1;
+ bcn_data->bcn.up_settings[i].rp_admin = 1;
else
- bcn_data->bcn.bcn_up_settings[i].rp_admin = 0;
+ bcn_data->bcn.up_settings[i].rp_admin = 0;
}
off += MAX_USER_PRIORITIES;
Index: dcbd-0.7.31rt/config.c
===================================================================
--- dcbd-0.7.31rt.orig/config.c
+++ dcbd-0.7.31rt/config.c
@@ -846,12 +846,12 @@ static dcb_result _set_persistent(char *
goto set_error;
}
if (!config_setting_set_int_elem(setting, i,
- bcn->bcn.bcn_up_settings[i].cp_admin)) {
+ bcn->bcn.up_settings[i].cp_admin)) {
goto set_error;
}
TRACE1("BCN TC element # : ", i)
TRACE1("the value is : ",
- bcn->bcn.bcn_up_settings[i].cp_admin)
+ bcn->bcn.up_settings[i].cp_admin)
}
}
@@ -866,12 +866,12 @@ static dcb_result _set_persistent(char *
goto set_error;
}
if (!config_setting_set_int_elem(setting, i,
- bcn->bcn.bcn_up_settings[i].rp_admin)) {
+ bcn->bcn.up_settings[i].rp_admin)) {
goto set_error;
}
TRACE1("BCN TC element # : ", i)
TRACE1("the value is : ",
- bcn->bcn.bcn_up_settings[i].rp_admin)
+ bcn->bcn.up_settings[i].rp_admin)
}
}
@@ -1178,16 +1178,16 @@ static int get_bcn_array_config(config_s
switch(int_type) {
case TYPE_BCN_CP:
- result->bcn_up_settings[i].cp_admin =
+ result->up_settings[i].cp_admin =
(char)config_setting_get_int(setting_value);
rval = check_bool(
- result->bcn_up_settings[i].cp_admin);
+ result->up_settings[i].cp_admin);
break;
case TYPE_BCN_RP:
- result->bcn_up_settings[i].rp_admin =
+ result->up_settings[i].rp_admin =
(char)config_setting_get_int(setting_value);
rval = check_bool(
- result->bcn_up_settings[i].rp_admin);
+ result->up_settings[i].rp_admin);
break;
default:
break;
Index: dcbd-0.7.31rt/dcbd.spec
===================================================================
--- dcbd-0.7.31rt.orig/dcbd.spec
+++ dcbd-0.7.31rt/dcbd.spec
@@ -1,6 +1,6 @@
Name: dcbd
Summary: Intel(R) EEDC Connection
-Version: 0.7.31rt
+Version: 0.7.35rt
Release: 1
Source: %{name}-%{version}.tar.gz
Vendor: Intel Corporation
Index: dcbd-0.7.31rt/dcb_protocol.cpp
===================================================================
--- dcbd-0.7.31rt.orig/dcb_protocol.cpp
+++ dcbd-0.7.31rt/dcb_protocol.cpp
@@ -36,6 +36,8 @@
#include <map>
#include <string>
+static void send_oper_events(char *device_name);
+
boolean_t bLLDPPresent = TRUE;
u8 gdcbx_subtype = dcbx_subtype1;
@@ -145,7 +147,17 @@ boolean_t add_pg(char *device_name, pg_a
void init_oper_pg(pg_attribs *Attrib)
{
+ char sTmp[MAX_DESCRIPTION_LEN];
+
memset(Attrib,0,sizeof(*Attrib));
+ snprintf(sTmp, MAX_DESCRIPTION_LEN, DEF_CFG_STORE);
+ pg_it itpg = pg.find(sTmp);
+ if (itpg == pg.end()) {
+ return;
+ }
+ Attrib->num_tcs = itpg->second->num_tcs;
+ memcpy(&(Attrib->rx), &(itpg->second->rx), sizeof(Attrib->rx));
+ memcpy(&(Attrib->tx), &(itpg->second->tx), sizeof(Attrib->tx));
}
boolean_t add_oper_pg(char *device_name)
@@ -243,9 +255,18 @@ boolean_t add_apptlv(char *device_name,
CATCH_END(FALSE);
}
-void init_oper_apptlv(app_attribs *Store)
+void init_oper_apptlv(app_attribs *Store, u32 Subtype)
{
+ char sTmp[MAX_DESCRIPTION_LEN];
+
memset(Store,0,sizeof(*Store));
+ snprintf(sTmp, MAX_DESCRIPTION_LEN, "%s%hu", DEF_CFG_STORE, Subtype);
+ app_it itapp = apptlv.find(sTmp);
+ if (itapp == apptlv.end()) {
+ return;
+ }
+ Store->Length =itapp->second->Length;
+ memcpy(&(Store->AppData), &(itapp->second->AppData), sizeof(Store->Length));
}
boolean_t add_oper_apptlv(char *device_name, u32 Subtype)
@@ -265,7 +286,7 @@ boolean_t add_oper_apptlv(char *device_n
/* Device not present: add */
app_attribs *store = (app_attribs*)malloc(sizeof(*store));
if (!store) return FALSE;
- init_oper_apptlv(store);
+ init_oper_apptlv(store, Subtype);
oper_apptlv.insert(make_pair(dn, store));
}
return TRUE;
@@ -403,7 +424,16 @@ boolean_t add_pfc(char *device_name, pfc
void init_oper_pfc(pfc_attribs *Attrib)
{
+ char sTmp[MAX_DESCRIPTION_LEN];
+
memset(Attrib,0,sizeof(*Attrib));
+ snprintf(sTmp, MAX_DESCRIPTION_LEN, DEF_CFG_STORE);
+ pfc_it itpfc = pfc.find(sTmp);
+ if (itpfc == pfc.end()) {
+ return;
+ }
+ Attrib->num_tcs = itpfc->second->num_tcs;
+ memcpy(&(Attrib->admin), &(itpfc->second->admin), sizeof(Attrib->admin));
}
boolean_t add_oper_pfc(char *device_name)
@@ -523,7 +553,15 @@ boolean_t add_bcn(char *device_name, bcn
}
void init_oper_bcn(bcn_attribs *Attrib)
{
+ char sTmp[MAX_DESCRIPTION_LEN];
+
memset(Attrib,0,sizeof(*Attrib));
+ snprintf(sTmp, MAX_DESCRIPTION_LEN, DEF_CFG_STORE);
+ bcn_it itbcn = bcn.find(sTmp);
+ if (itbcn == bcn.end()) {
+ return;
+ }
+ memcpy(&(Attrib->bcn), &(itbcn->second->bcn), sizeof(Attrib->bcn));
}
boolean_t add_oper_bcn(char *device_name)
@@ -620,9 +658,17 @@ boolean_t add_llink(char *device_name, l
CATCH_END(FALSE);
}
-void init_oper_llink(llink_attribs *Attrib)
+void init_oper_llink(llink_attribs *Attrib, u32 Subtype)
{
+ char sTmp[MAX_DESCRIPTION_LEN];
+
memset(Attrib,0,sizeof(*Attrib));
+ snprintf(sTmp, MAX_DESCRIPTION_LEN, "%s%hu", DEF_CFG_STORE, Subtype);
+ llink_it itllink = llink.find(sTmp);
+ if (itllink == llink.end()) {
+ return;
+ }
+ memcpy(&(Attrib->llink), &(itllink->second->llink), sizeof(Attrib->llink));
}
boolean_t add_oper_llink(char *device_name, u32 subtype)
@@ -644,7 +690,7 @@ boolean_t add_oper_llink(char *device_na
if (!store) return 0;
- init_oper_llink(store);
+ init_oper_llink(store, subtype);
oper_llink.insert(make_pair(dn, store));
}
return TRUE;
@@ -754,7 +800,9 @@ dcb_result get_dcb_support(char *device_
boolean_t add_adapter(char *device_name)
{
u32 EventFlag = 0;
- full_dcb_attribs attribs;
+ full_dcb_attrib_ptrs attr_ptr;
+ full_dcb_attribs attribs;
+ feature_support dcb_support = {0};
dcb_result sResult = dcb_success;
printf("add_adapter (%s)\n", device_name);
@@ -767,7 +815,10 @@ boolean_t add_adapter(char *device_name)
}
printf(" dcbx subtype = %d\n", gdcbx_subtype);
- if ((sResult = dcb_check_config(&attribs.pg)) != dcb_success) {
+ memset (&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.pg = &(attribs.pg);
+ attr_ptr.bcn = &(attribs.bcn);
+ if ((sResult = dcb_check_config(&attr_ptr)) != dcb_success) {
printf("Rule checker returned error %d\n", sResult);
} else { /* big else */
@@ -874,6 +925,8 @@ boolean_t add_adapter(char *device_name)
sResult = dcb_failed;
goto add_adapter_error;
}
+ }
+ for(int i = 0; i < DCB_MAX_LLKTLV ; i++) {
if (!add_llink(device_name, &attribs.llink[i], i)) {
log_message(MSG_ERR_RESOURCE_MEMORY, "%s",
device_name);
@@ -897,6 +950,11 @@ boolean_t add_adapter(char *device_name)
}
}
+ if (get_dcb_support(device_name, &dcb_support) != dcb_success) {
+ sResult = dcb_failed;
+ goto add_adapter_error;
+ }
+
/* Initialize features state machines for PG and PFC and
* APPTLVs. */
@@ -913,7 +971,7 @@ boolean_t add_adapter(char *device_name)
sResult = dcb_failed;
goto add_adapter_error;
}
- if (run_feature_protocol(device_name,
+ if (dcb_support.bcn && run_feature_protocol(device_name,
DCB_LOCAL_CHANGE_BCN) != dcb_success) {
printf("run_feature_protocol error (BCN)\n");
sResult = dcb_failed;
@@ -930,11 +988,13 @@ boolean_t add_adapter(char *device_name)
goto add_adapter_error;
}
}
- if (run_feature_protocol(device_name,
- DCB_LOCAL_CHANGE_LLINK) != dcb_success) {
- printf("run_feature_protocol error (LLINK)\n");
- sResult = dcb_failed;
- goto add_adapter_error;
+ for (int i = 0; i < DCB_MAX_LLKTLV ; i++) {
+ if (run_feature_protocol(device_name,
+ DCB_LOCAL_CHANGE_LLINK, i) != dcb_success) {
+ printf("run_feature_protocol error (LLINK)\n");
+ sResult = dcb_failed;
+ goto add_adapter_error;
+ }
}
/* apply all feature setting to the driver:linux only */
@@ -980,6 +1040,8 @@ boolean_t remove_adapter(char *device_na
feature_protocol_attribs *pFP;
void *itp = NULL;
+ send_oper_events(device_name);
+
/* save device name for remove port */
if (device_name == NULL) {
printf("remove_adapter: null device\n");
@@ -1193,6 +1255,15 @@ boolean_t remove_adapter(char *device_na
if (itp) free (itp);
itp = NULL;
}
+ }
+ for(int i = 0; i < DCB_MAX_LLKTLV ; i++) {
+ string dn1 = dn;
+ char sTemp[SHORT_STRING];
+ /* Localization OK */
+ snprintf(sTemp, SHORT_STRING, "%hu", i);
+ /* Append device name with subtype */
+ dn1.append(sTemp);
+
/* Release LLINK data store */
llink_it itllink = llink.find(dn1);
if (itllink != llink.end()) {
@@ -1406,9 +1477,9 @@ boolean_t add_app_defaults(u32 subtype)
snprintf(sTmp, MAX_DESCRIPTION_LEN, DEF_CFG_STORE);
switch (subtype) {
- case 0: /* FCoE subtype */
+ case APP_FCOE_STYPE: /* FCoE subtype */
app_data.Length = 1;
- app_data.AppData[0] = 0x08;
+ app_data.AppData[0] = 0x08; /* bit pattern: User Priority 3 */
break;
default:
break;
@@ -1472,7 +1543,7 @@ boolean_t add_bcn_defaults()
bcn_data.bcn.rp_ru = DEF_BCN_RATE_UNIT;
bcn_data.bcn.rp_ri = DEF_BCN_INITIAL_RATE;
bcn_data.bcn.rp_wrtt = DEF_BCN_RTT_AVG_WEIGHT;
- bcn_data.bcn.cp_sf = BCN_CP_SAMP_INTERVAL;
+ bcn_data.bcn.cp_sf = DEF_BCN_CP_SAMP_INTERVAL;
snprintf(sTmp, MAX_DESCRIPTION_LEN, DEF_CFG_STORE);
/* Create bcn default data store for the device. */
@@ -1703,12 +1774,12 @@ void mark_llink_sent(char *device_name,
dcb_result put_pg(char *device_name, pg_attribs *pg_data)
{
TRY_BEGIN;
- u32 EventFlag = 0;
- dcb_result result = dcb_success;
- full_dcb_attribs attribs;
- boolean_t bChange = FALSE;
- string dn(device_name);
- full_dcb_attrib_ptrs att_ptrs;
+ full_dcb_attribs attribs;
+ full_dcb_attrib_ptrs attr_ptr;
+ string dn(device_name);
+ u32 EventFlag = 0;
+ dcb_result result = dcb_success;
+ boolean_t bChange = FALSE;
if (!pg_data) return dcb_bad_params;
@@ -1723,15 +1794,15 @@ dcb_result put_pg(char *device_name, pg
}
/* Check the rules */
- if (dcb_check_config(pg_data) != dcb_success) {
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.pg = pg_data;
+ if (dcb_check_config(&attr_ptr) != dcb_success) {
printf("Rule checking failed in put_pg()\n");
result = dcb_bad_params;
goto Exit;
}
bChange = TRUE;
- memset(&att_ptrs, 0, sizeof(att_ptrs));
- att_ptrs.pg = pg_data;
- if (set_persistent(device_name, &att_ptrs) !=
+ if (set_persistent(device_name, &attr_ptr) !=
dcb_success) {
printf("Set persistent failed put_pg()\n");
result = dcb_device_not_found;
@@ -1765,10 +1836,10 @@ dcb_result put_pg(char *device_name, pg
} else {
/* Not in DCB data store, so store in persistent storage */
if (get_persistent(device_name, &attribs) == dcb_success) {
- memset(&att_ptrs, 0, sizeof(att_ptrs));
- att_ptrs.pg = pg_data;
- att_ptrs.pgid = &attribs.descript;
- if (set_persistent(device_name, &att_ptrs) !=
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.pg = pg_data;
+ attr_ptr.pgid = &attribs.descript;
+ if (set_persistent(device_name, &attr_ptr) !=
dcb_success) {
printf("Set persistent failed in put_pg()\n");
result = dcb_device_not_found;
@@ -1908,7 +1979,7 @@ dcb_result put_pfc(char *device_name, pf
full_dcb_attribs attribs;
boolean_t bChange = FALSE;
string dn(device_name);
- full_dcb_attrib_ptrs att_ptrs;
+ full_dcb_attrib_ptrs attr_ptr;
if (!pfc_data) return dcb_bad_params;
@@ -1921,9 +1992,9 @@ dcb_result put_pfc(char *device_name, pf
goto Exit;
}
bChange = TRUE;
- memset(&att_ptrs, 0, sizeof(att_ptrs));
- att_ptrs.pfc = pfc_data;
- if (set_persistent(device_name, &att_ptrs) != dcb_success) {
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.pfc = pfc_data;
+ if (set_persistent(device_name, &attr_ptr) != dcb_success) {
printf("Set persistent failed in put_pfc()\n");
result = dcb_device_not_found;
goto Exit;
@@ -1954,10 +2025,10 @@ dcb_result put_pfc(char *device_name, pf
} else {
/* Store in persistent storage - not in DCB data store */
if (get_persistent(device_name, &attribs) == dcb_success) {
- memset(&att_ptrs, 0, sizeof(att_ptrs));
- att_ptrs.pfc = pfc_data;
- att_ptrs.pgid = &attribs.descript;
- if (set_persistent(device_name, &att_ptrs) !=
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.pfc = pfc_data;
+ attr_ptr.pgid = &attribs.descript;
+ if (set_persistent(device_name, &attr_ptr) !=
dcb_success) {
result = dcb_device_not_found;
}
@@ -2023,7 +2094,7 @@ dcb_result put_bcn(char *device_name, bc
full_dcb_attribs attribs;
boolean_t bChange = FALSE;
string dn(device_name);
- full_dcb_attrib_ptrs att_ptrs;
+ full_dcb_attrib_ptrs attr_ptr;
if (!bcn_data) return dcb_bad_params;
@@ -2036,10 +2107,16 @@ dcb_result put_bcn(char *device_name, bc
if (memcmp((*it).second, bcn_data, sizeof(*bcn_data)) == 0) {
goto Exit;
}
+ /* Check the rules */
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.bcn = bcn_data;
+ if (dcb_check_config(&attr_ptr) != dcb_success) {
+ printf("Rule checking failed in put_bcn()\n");
+ result = dcb_bad_params;
+ goto Exit;
+ }
bChange = TRUE;
- memset(&att_ptrs, 0, sizeof(att_ptrs));
- att_ptrs.bcn = bcn_data;
- if (set_persistent(device_name, &att_ptrs) != dcb_success) {
+ if (set_persistent(device_name, &attr_ptr) != dcb_success) {
printf("Set persistent failed in put_bcn()\n");
result = dcb_device_not_found;
goto Exit;
@@ -2067,10 +2144,10 @@ dcb_result put_bcn(char *device_name, bc
} else {
/* Store in persistent storage - not in DCB data store */
if (get_persistent(device_name, &attribs) == dcb_success) {
- memset(&att_ptrs, 0, sizeof(att_ptrs));
- att_ptrs.bcn = bcn_data;
- att_ptrs.pgid = &attribs.descript;
- if (set_persistent(device_name, &att_ptrs) !=
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.bcn = bcn_data;
+ attr_ptr.pgid = &attribs.descript;
+ if (set_persistent(device_name, &attr_ptr) !=
dcb_success) {
result = dcb_device_not_found;
}
@@ -2275,7 +2352,7 @@ dcb_result put_app(char *device_name, u3
full_dcb_attribs attribs;
boolean_t bChange = FALSE;
string dn(device_name);
- full_dcb_attrib_ptrs att_ptrs;
+ full_dcb_attrib_ptrs attr_ptr;
/* append device name with subtype */
snprintf(stmp, SHORT_STRING, "%hu", subtype); /* Localization OK */
@@ -2293,10 +2370,10 @@ dcb_result put_app(char *device_name, u3
}
/* Store in persistent storage */
bChange = TRUE;
- memset(&att_ptrs, 0, sizeof(att_ptrs));
- att_ptrs.app = app_data;
- att_ptrs.app_subtype = (u8)subtype;
- if (set_persistent(device_name, &att_ptrs) != dcb_success) {
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.app = app_data;
+ attr_ptr.app_subtype = (u8)subtype;
+ if (set_persistent(device_name, &attr_ptr) != dcb_success) {
printf("Set persistent failed in put_app()\n");
return dcb_device_not_found;
}
@@ -2327,11 +2404,11 @@ dcb_result put_app(char *device_name, u3
} else {
/* Not in DCB data store, store in persistent storage */
if (get_persistent(device_name, &attribs) == dcb_success) {
- memset(&att_ptrs, 0, sizeof(att_ptrs));
- att_ptrs.app = app_data;
- att_ptrs.app_subtype = (u8)subtype;
- att_ptrs.pgid = &attribs.descript;
- if (set_persistent(device_name, &att_ptrs) !=
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.app = app_data;
+ attr_ptr.app_subtype = (u8)subtype;
+ attr_ptr.pgid = &attribs.descript;
+ if (set_persistent(device_name, &attr_ptr) !=
dcb_success) {
printf("Set persistent failed in put_app()\n");
result = dcb_device_not_found;
@@ -2402,7 +2479,7 @@ dcb_result put_llink(char *device_name,
boolean_t bChange = FALSE;
string dn(device_name);
char stmp[SHORT_STRING];
- full_dcb_attrib_ptrs att_ptrs;
+ full_dcb_attrib_ptrs attr_ptr;
/* append device name with subtype */
snprintf(stmp, SHORT_STRING, "%hu", subtype); /* Localization OK */
@@ -2421,10 +2498,10 @@ dcb_result put_llink(char *device_name,
goto Exit;
}
bChange = TRUE;
- memset(&att_ptrs, 0, sizeof(att_ptrs));
- att_ptrs.llink = llink_data;
- att_ptrs.llink_subtype = LLINK_FCOE_STYPE;
- if (set_persistent(device_name, &att_ptrs) != dcb_success) {
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.llink = llink_data;
+ attr_ptr.llink_subtype = LLINK_FCOE_STYPE;
+ if (set_persistent(device_name, &attr_ptr) != dcb_success) {
printf("Set persistent failed in put_llink()\n");
result = dcb_device_not_found;
goto Exit;
@@ -2455,11 +2532,11 @@ dcb_result put_llink(char *device_name,
} else {
/* Store in persistent storage - though not in DCB data store*/
if (get_persistent(device_name, &attribs) == dcb_success) {
- memset(&att_ptrs, 0, sizeof(att_ptrs));
- att_ptrs.llink = llink_data;
- att_ptrs.llink_subtype = LLINK_FCOE_STYPE;
- att_ptrs.pgid = &attribs.descript;
- if (set_persistent(device_name, &att_ptrs)
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.llink = llink_data;
+ attr_ptr.llink_subtype = LLINK_FCOE_STYPE;
+ attr_ptr.pgid = &attribs.descript;
+ if (set_persistent(device_name, &attr_ptr)
!= dcb_success) {
result = dcb_device_not_found;
}
@@ -2733,7 +2810,7 @@ dcb_result put_bwg_descrpt(char *device_
dcb_result result = dcb_success;
full_dcb_attribs attribs;
unsigned int size;
- full_dcb_attrib_ptrs att_ptrs;
+ full_dcb_attrib_ptrs attr_ptr;
if (!name) return dcb_bad_params;
size = (unsigned int)strlen(name); /* Localization OK */
@@ -2750,9 +2827,9 @@ dcb_result put_bwg_descrpt(char *device_
memcpy(((*it).second)->pgid_desc[bwgid], name, size);
/* Put a null at the end incase it was truncated */
((*it).second)->pgid_desc[bwgid][size] = '\0';
- memset(&att_ptrs, 0, sizeof(att_ptrs));
- att_ptrs.pgid = ((*it).second);
- if (set_persistent(device_name, &att_ptrs) != dcb_success) {
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.pgid = ((*it).second);
+ if (set_persistent(device_name, &attr_ptr) != dcb_success) {
return dcb_device_not_found;
}
} else {
@@ -2768,9 +2845,9 @@ dcb_result put_bwg_descrpt(char *device_
/* Put a null at the end in case it was
* truncated */
attribs.descript.pgid_desc[bwgid][size] = '\0';
- memset(&att_ptrs, 0, sizeof(att_ptrs));
- att_ptrs.pgid = &attribs.descript;
- if (set_persistent(device_name, &att_ptrs)
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.pgid = &attribs.descript;
+ if (set_persistent(device_name, &attr_ptr)
!= dcb_success) {
printf("Set persistent failed "
"in put_bwg_descrpt()\n");
@@ -2838,9 +2915,7 @@ void CopyConfigToOper(char *device_name,
return;
}
/* Copy Src to Oper. */
- int i;
-
- for (i = 0; i < MAX_USER_PRIORITIES; i++) {
+ for (int i = 0; i < MAX_USER_PRIORITIES; i++) {
(*Oper).second->tx.up[i].pgid =
(*Src).second->tx.up[i].pgid;
(*Oper).second->rx.up[i].pgid =
@@ -2869,7 +2944,7 @@ void CopyConfigToOper(char *device_name,
}
}
- for (i = 0; i < MAX_BANDWIDTH_GROUPS; i++) {
+ for (int i = 0; i < MAX_BANDWIDTH_GROUPS; i++) {
(*Oper).second->tx.pg_percent[i] =
(*Src).second->tx.pg_percent[i];
(*Oper).second->rx.pg_percent[i] =
@@ -3040,8 +3115,6 @@ void CopyConfigToOper(char *device_name,
******************************************************************************/
boolean_t LocalPeerCompatible(char *device_name, u32 EventFlag, u32 Subtype)
{
- int i;
-
TRY_BEGIN;
string dn(device_name);
if (DCB_TEST_FLAGS(EventFlag, DCB_LOCAL_CHANGE_PG, DCB_LOCAL_CHANGE_PG)
@@ -3067,7 +3140,7 @@ boolean_t LocalPeerCompatible(char *devi
match = TRUE;
if (ppg->protocol.dcbx_st == dcbx_subtype1) {
- for (i = 0; i < MAX_USER_PRIORITIES; i++) {
+ for (int i = 0; i < MAX_USER_PRIORITIES; i++) {
if (lpg->tx.up[i].pgid !=
ppg->tx.up[i].pgid)
match = FALSE;
@@ -3078,7 +3151,7 @@ boolean_t LocalPeerCompatible(char *devi
ppg->tx.up[i].percent_of_pg_cap)
match = FALSE;
}
- for (i = 0; i < MAX_BANDWIDTH_GROUPS; i++) {
+ for (int i = 0; i < MAX_BANDWIDTH_GROUPS; i++) {
if (lpg->tx.pg_percent[i] !=
ppg->tx.pg_percent[i])
match = FALSE;
@@ -3209,6 +3282,7 @@ int set_configuration(char *device_name,
TRY_BEGIN;
string dn(device_name);
dcb_result sResult;
+ full_dcb_attrib_ptrs attr_ptr;
if (DCB_TEST_FLAGS(EventFlag, DCB_LOCAL_CHANGE_PG, DCB_LOCAL_CHANGE_PG)
||
@@ -3224,9 +3298,11 @@ int set_configuration(char *device_name,
pgroup_attribs pg_data;
if (DCB_TEST_FLAGS(EventFlag, DCB_REMOTE_CHANGE_PG,
DCB_REMOTE_CHANGE_PG)) {
- if ((sResult = dcb_check_config((*Oper).second))
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.pg = ((*Oper).second);
+ if ((sResult = dcb_check_config(&attr_ptr))
!= dcb_success) {
- printf("Rule check returned error %d\n",
+ printf("PG rule check returned error %d\n",
sResult); /* Localization OK */
return sResult;
}
@@ -3246,6 +3322,17 @@ int set_configuration(char *device_name,
if (Oper == oper_bcn.end() || Local == bcn.end()) {
return 1;
}
+ if (DCB_TEST_FLAGS(EventFlag, DCB_REMOTE_CHANGE_BCN,
+ DCB_REMOTE_CHANGE_BCN)) {
+ memset(&attr_ptr, 0, sizeof(attr_ptr));
+ attr_ptr.bcn = ((*Oper).second);
+ if ((sResult = dcb_check_config(&attr_ptr))
+ != dcb_success) {
+ printf("BCN rule check returned error %d\n",
+ sResult); /* Localization OK */
+ return sResult;
+ }
+ }
return set_hw_bcn(device_name, &(*Oper).second->bcn,
(*Local).second->protocol.OperMode);
} else if (DCB_TEST_FLAGS(EventFlag, DCB_LOCAL_CHANGE_PFC,
@@ -3275,6 +3362,51 @@ int set_configuration(char *device_name,
/******************************************************************************
**
+** Method: send_oper_events
+**
+** Description: This routine is called by remove_adapter.
+** For any feature whose OperMode is TRUE, send an
+** event since the port is going away - indicating an
+** OperMode change.
+**
+** Arguments: char *device_name
+**
+** Returns: dcb_success if successful, failure code otherwise.
+**
+******************************************************************************/
+static void send_oper_events(char *device_name)
+{
+ pg_attribs pg_data;
+ pfc_attribs pfc_data;
+ bcn_attribs bcn_data;
+ app_attribs app_data;
+ llink_attribs llink_data;
+
+ if (get_pg(device_name, &pg_data) == dcb_success)
+ if (pg_data.protocol.OperMode)
+ pg_event(device_name, EVENT_OPERMODE);
+
+ if (get_pfc(device_name, &pfc_data) == dcb_success)
+ if (pfc_data.protocol.OperMode)
+ pfc_event(device_name, EVENT_OPERMODE);
+
+ if (get_bcn(device_name, &bcn_data) == dcb_success)
+ if (bcn_data.protocol.OperMode)
+ bcn_event(device_name, EVENT_OPERMODE);
+
+ for (int i = 0; i < DCB_MAX_APPTLV ; i++)
+ if (get_app(device_name, i, &app_data) == dcb_success)
+ if (app_data.protocol.OperMode)
+ app_event(device_name, i, EVENT_OPERMODE);
+
+ for (int i = 0; i < DCB_MAX_LLKTLV ; i++)
+ if (get_llink(device_name, i, &llink_data) == dcb_success)
+ if (llink_data.protocol.OperMode)
+ llink_event(device_name, i, EVENT_OPERMODE);
+}
+
+/******************************************************************************
+**
** Method: run_feature_protocol
**
** Description: This function runs feature state machine for a local or remote
@@ -4246,11 +4378,13 @@ void update_feature_syncd(char *device_n
}
}
- /* Get the local LLINK feature protocol */
- llink_it it4 = llink.find(dn);
- if (it4 != llink.end())
- if ((&((*it4).second)->protocol)->Advertise == FALSE)
- (&((*it4).second)->protocol)->Syncd = TRUE;
+ for (int i = 0; i < DCB_MAX_LLKTLV ; i++) {
+ /* Get the local LLINK feature protocol */
+ llink_it it4 = llink.find(dn);
+ if (it4 != llink.end())
+ if ((&((*it4).second)->protocol)->Advertise == FALSE)
+ (&((*it4).second)->protocol)->Syncd = TRUE;
+ }
CATCH_END_VOID;
@@ -4490,7 +4624,7 @@ send:
** u32 EventFlag
** u32 SubType - This is valid for APPTLV event flags only.
** If >= DCB_MAX_APPTLV, then we process all Subtypes
-** for APPTLV flags.
+** for APPTLV flags.
** Returns: dcb_success if successful, failure code otherwise.
**
*******************************************************************************/
@@ -4545,8 +4679,11 @@ dcb_result run_dcb_protocol(char *device
if (DCB_TEST_FLAGS(EventFlag, DCB_LOCAL_CHANGE_LLINK,
DCB_LOCAL_CHANGE_LLINK)
&& (result != dcb_ctrl_vers_not_compatible)) {
- result = run_feature_protocol(device_name,
- DCB_LOCAL_CHANGE_LLINK);
+
+ for (i = SubTypeMin; i < SubTypeMax; i++) {
+ result = run_feature_protocol(device_name,
+ DCB_LOCAL_CHANGE_LLINK, i);
+ }
LocalChange = TRUE;
}
/* Only allow local or remote change at a time. */
@@ -4580,8 +4717,10 @@ dcb_result run_dcb_protocol(char *device
if (DCB_TEST_FLAGS(EventFlag, DCB_REMOTE_CHANGE_LLINK,
DCB_REMOTE_CHANGE_LLINK)
&& (result != dcb_ctrl_vers_not_compatible)) {
- result = run_feature_protocol(device_name,
- DCB_REMOTE_CHANGE_LLINK);
+ for (i = SubTypeMin; i < SubTypeMax; i++) {
+ result = run_feature_protocol(device_name,
+ DCB_REMOTE_CHANGE_LLINK, i);
+ }
}
}
Index: dcbd-0.7.31rt/dcb_rule_chk.cpp
===================================================================
--- dcbd-0.7.31rt.orig/dcb_rule_chk.cpp
+++ dcbd-0.7.31rt/dcb_rule_chk.cpp
@@ -44,186 +44,270 @@
* return : dcb_result
*****************************************************************************/
dcb_result
-dcb_check_config (pg_attribs *pg)
+dcb_check_config (full_dcb_attrib_ptrs *attribs)
{
+ pg_attribs *pg;
+ bcn_cfg *bcn;
u8 i, tx_bw, rx_bw, tx_bw_id, rx_bw_id;
u8 tx_bw_sum[MAX_BW_GROUP],rx_bw_sum[MAX_BW_GROUP];
boolean_t tx_link_strict[MAX_BW_GROUP], rx_link_strict[MAX_BW_GROUP];
u8 link_strict_pgid;
- memset(tx_bw_sum,0,sizeof(tx_bw_sum));
- memset(rx_bw_sum,0,sizeof(rx_bw_sum));
- memset(tx_link_strict,0,sizeof(tx_link_strict));
- memset(rx_link_strict,0,sizeof(rx_link_strict));
-
- tx_bw = 0, rx_bw = 0;
- /* Internally in the pg_attribs structure, a link strict PGID is
- * maintained as a PGID value (0-7) with a corresponding
- * strict_priority field value of 'dcb_link'. Only one link strict
- * PGID is allowed.
- */
- link_strict_pgid = LINK_STRICT_PGID;
- /* Check rules for Tx and Rx Bandwidth Groups */
- for (i = 0; i < MAX_BW_GROUP; i++) {
- tx_bw = tx_bw + pg->tx.pg_percent[i];
-
- /* check for >1 link strict PGID */
- if (pg->tx.up[i].strict_priority == dcb_link) {
- if (link_strict_pgid == LINK_STRICT_PGID) {
- link_strict_pgid = pg->tx.up[i].pgid;
- } else if (pg->tx.up[i].pgid != link_strict_pgid) {
- log_message(MSG_ERR_DCB_TOO_MANY_LSP_PGIDS,
- "%d", (int)pg->tx.up[i].pgid);
- return dcb_bad_params;
+ if (attribs == NULL) {
+ return dcb_failed;
+ }
+
+ if (attribs->pg) {
+ pg = attribs->pg;
+ memset(tx_bw_sum,0,sizeof(tx_bw_sum));
+ memset(rx_bw_sum,0,sizeof(rx_bw_sum));
+ memset(tx_link_strict,0,sizeof(tx_link_strict));
+ memset(rx_link_strict,0,sizeof(rx_link_strict));
+
+ tx_bw = 0, rx_bw = 0;
+ /* Internally in the pg_attribs structure, a link strict PGID is
+ * maintained as a PGID value (0-7) with a corresponding
+ * strict_priority field value of 'dcb_link'. Only one link strict
+ * PGID is allowed.
+ */
+ link_strict_pgid = LINK_STRICT_PGID;
+ /* Check rules for Tx and Rx Bandwidth Groups */
+ for (i = 0; i < MAX_BW_GROUP; i++) {
+ tx_bw = tx_bw + pg->tx.pg_percent[i];
+
+ /* check for >1 link strict PGID */
+ if (pg->tx.up[i].strict_priority == dcb_link) {
+ if (link_strict_pgid == LINK_STRICT_PGID) {
+ link_strict_pgid = pg->tx.up[i].pgid;
+ } else if (pg->tx.up[i].pgid != link_strict_pgid) {
+ log_message(MSG_ERR_DCB_TOO_MANY_LSP_PGIDS,
+ "%d", (int)pg->tx.up[i].pgid);
+ return dcb_bad_params;
+ }
+ /* don't include link strict group %'s */
+ tx_bw = tx_bw - pg->tx.pg_percent[i];
}
- /* don't include link strict group %'s */
- tx_bw = tx_bw - pg->tx.pg_percent[i];
}
- }
- if (tx_bw != BW_PERCENT) {
- /* only valid scenario for BWT!=100 is BWT==0 and all BWGs
- * link strict
- */
+ if (tx_bw != BW_PERCENT) {
+ /* only valid scenario for BWT!=100 is BWT==0 and all BWGs
+ * link strict
+ */
+ for (i = 0; i < MAX_BW_GROUP; i++) {
+ if ((tx_bw != 0) || (pg->tx.up[i].strict_priority !=
+ dcb_link)) {
+ log_message(MSG_ERR_DCB_INVALID_TX_TOTAL_BWG,
+ "%d", (int)tx_bw);
+ return dcb_bad_params;
+ }
+ }
+ }
+
+ link_strict_pgid = LINK_STRICT_PGID;
for (i = 0; i < MAX_BW_GROUP; i++) {
- if ((tx_bw != 0) || (pg->tx.up[i].strict_priority !=
- dcb_link)) {
- log_message(MSG_ERR_DCB_INVALID_TX_TOTAL_BWG,
- "%d", (int)tx_bw);
+ rx_bw = rx_bw + pg->rx.pg_percent[i];
+
+ /* check for >1 link strict PGID */
+ if (pg->rx.up[i].strict_priority == dcb_link) {
+ if (link_strict_pgid == LINK_STRICT_PGID) {
+ link_strict_pgid = pg->rx.up[i].pgid;
+ } else if (pg->rx.up[i].pgid != link_strict_pgid) {
+ log_message(MSG_ERR_DCB_TOO_MANY_LSP_PGIDS,
+ "%d", (int)pg->rx.up[i].pgid);
+ return dcb_bad_params;
+ }
+ /* don't include link strict group %'s */
+ rx_bw = rx_bw - pg->rx.pg_percent[i];
+ }
+ }
+ if (rx_bw != BW_PERCENT) {
+ /* only valid scenario for BWT!=100 is BWT==0 and all BWGs
+ * link strict
+ */
+ for (i = 0; i < MAX_BW_GROUP; i++) {
+ if ((rx_bw != 0) || (pg->rx.up[i].strict_priority !=
+ dcb_link)) {
+ log_message(MSG_ERR_DCB_INVALID_RX_TOTAL_BWG,
+ "%d", (int)rx_bw);
+ return dcb_bad_params;
+ }
+ }
+ }
+
+ /* Go through each traffic class and check rules for Tx and Rx */
+ for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
+
+ /* Since we assign strict priority to RX & TX via enumeration,
+ * from the data stores and from the peer. It would be
+ * impossible for both of them to be set.
+ * So that is no longer checked in this function.
+ */
+
+ /* Transmit Check */
+ tx_bw = 0, tx_bw_id = 0;
+ tx_bw = (u8)(pg->tx.up[i].percent_of_pg_cap);
+ tx_bw_id = (u8)(pg->tx.up[i].pgid);
+
+ if (tx_bw_id >= MAX_BW_GROUP) {
+ log_message(MSG_ERR_DCB_INVALID_TX_BWG_IDX, "%d",
+ (int)tx_bw_id);
+ return dcb_bad_params;
+ }
+ if (pg->tx.up[i].strict_priority == dcb_link) {
+ tx_link_strict[tx_bw_id] = TRUE;
+ /* Link strict should have zero bandwidth */
+ if (tx_bw){
+ log_message(
+ MSG_ERR_DCB_INVALID_TX_LSP_NZERO_BW_TC,
+ "%d%d", i, (int)tx_bw);
+ return dcb_bad_params;
+ }
+ } else if (!tx_bw) {
+ log_message(MSG_ERR_DCB_INVALID_TX_ZERO_BW_TC, "%d", i);
+ /* Non link strict should have non zero bandwidth*/
+ return dcb_bad_params;
+ }
+ /* Receive Check */
+ rx_bw = 0, rx_bw_id = 0;
+ rx_bw = (u8)(pg->rx.up[i].percent_of_pg_cap);
+ rx_bw_id = (u8)(pg->rx.up[i].pgid);
+
+ if (rx_bw_id >= MAX_BW_GROUP) {
+ log_message(MSG_ERR_DCB_INVALID_RX_BWG_IDX, "%d",
+ (int)rx_bw_id);
return dcb_bad_params;
}
+ if (pg->rx.up[i].strict_priority == dcb_link) {
+ rx_link_strict[rx_bw_id] = TRUE;
+ /* Link strict class should have zero bandwidth */
+ if (rx_bw){
+ log_message(MSG_ERR_DCB_INVALID_RX_LSP_NZERO_BW_TC,
+ "%d%d", i, (int)rx_bw);
+ return dcb_bad_params;
+ }
+ } else if (!rx_bw) {
+ log_message(MSG_ERR_DCB_INVALID_RX_ZERO_BW_TC, "%d", i);
+ /* Non link strict class should have non-zero bw */
+ return dcb_bad_params; /* DCB_RX_ERR_TC_BW_ZERO; */
+ }
+ tx_bw_sum[tx_bw_id] = tx_bw_sum[tx_bw_id] + tx_bw;
+ rx_bw_sum[rx_bw_id] = rx_bw_sum[rx_bw_id] + rx_bw;
+
}
- }
- link_strict_pgid = LINK_STRICT_PGID;
- for (i = 0; i < MAX_BW_GROUP; i++) {
- rx_bw = rx_bw + pg->rx.pg_percent[i];
-
- /* check for >1 link strict PGID */
- if (pg->rx.up[i].strict_priority == dcb_link) {
- if (link_strict_pgid == LINK_STRICT_PGID) {
- link_strict_pgid = pg->rx.up[i].pgid;
- } else if (pg->rx.up[i].pgid != link_strict_pgid) {
- log_message(MSG_ERR_DCB_TOO_MANY_LSP_PGIDS,
- "%d", (int)pg->rx.up[i].pgid);
+ /* Transmit Check */
+ for (i = 0; i < MAX_BW_GROUP; i++) {
+ /* sum of bandwidth percentages of all traffic classes within
+ * a Bandwidth Group must total 100 except for link strict
+ * group (zero bandwidth).
+ */
+ if (tx_link_strict[i]) {
+ if (tx_bw_sum[i] && pg->tx.pg_percent[i]) {
+ log_message(MSG_ERR_DCB_INVALID_TX_LSP_NZERO_BWG,
+ "%d%d", i, (int)tx_bw_sum[i]);
+ /* Link strict group should have zero bw */
+ return dcb_bad_params;
+ }
+ } else if (tx_bw_sum[i] != BW_PERCENT && tx_bw_sum[i] != 0) {
+ log_message(MSG_ERR_DCB_INVALID_TX_BWG, "%d%d",
+ i, (int)tx_bw_sum[i]);
return dcb_bad_params;
}
- /* don't include link strict group %'s */
- rx_bw = rx_bw - pg->rx.pg_percent[i];
}
- }
- if (rx_bw != BW_PERCENT) {
- /* only valid scenario for BWT!=100 is BWT==0 and all BWGs
- * link strict
- */
+ /* Receive Check */
for (i = 0; i < MAX_BW_GROUP; i++) {
- if ((rx_bw != 0) || (pg->rx.up[i].strict_priority !=
- dcb_link)) {
- log_message(MSG_ERR_DCB_INVALID_RX_TOTAL_BWG,
- "%d", (int)rx_bw);
+ /* sum of bandwidth percentages of all traffic classes
+ * within a Bandwidth Group must total 100 except for
+ * link strict group ( zero bandwidth).
+ */
+ if (rx_link_strict[i]) {
+ if (rx_bw_sum[i] && pg->rx.pg_percent[i]) {
+ log_message(MSG_ERR_DCB_INVALID_RX_LSP_NZERO_BWG,
+ "%d%d", i, (int)rx_bw_sum[i]);
+ /* Link strict group should have zero bw */
+ return dcb_bad_params;
+ }
+ } else if (rx_bw_sum[i] != BW_PERCENT && rx_bw_sum[i] != 0) {
+ log_message(MSG_ERR_DCB_INVALID_RX_BWG, "%d%d",
+ i, (int)rx_bw_sum[i]);
return dcb_bad_params;
}
}
}
- /* Go through each traffic class and check rules for Tx and Rx */
- for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
-
- /* Since we assign strict priority to RX & TX via enumeration,
- * from the data stores and from the peer. It would be
- * impossible for both of them to be set.
- * So that is no longer checked in this function.
- */
-
- /* Transmit Check */
- tx_bw = 0, tx_bw_id = 0;
- tx_bw = (u8)(pg->tx.up[i].percent_of_pg_cap);
- tx_bw_id = (u8)(pg->tx.up[i].pgid);
-
- if (tx_bw_id >= MAX_BW_GROUP) {
- log_message(MSG_ERR_DCB_INVALID_TX_BWG_IDX, "%d",
- (int)tx_bw_id);
- return dcb_bad_params;
- }
- if (pg->tx.up[i].strict_priority == dcb_link) {
- tx_link_strict[tx_bw_id] = TRUE;
- /* Link strict should have zero bandwidth */
- if (tx_bw){
- log_message(
- MSG_ERR_DCB_INVALID_TX_LSP_NZERO_BW_TC,
- "%d%d", i, (int)tx_bw);
- return dcb_bad_params;
- }
- } else if (!tx_bw) {
- log_message(MSG_ERR_DCB_INVALID_TX_ZERO_BW_TC, "%d", i);
- /* Non link strict should have non zero bandwidth*/
+ if (attribs->bcn) {
+ bcn = &(attribs->bcn->bcn);
+ // bcn->cp_sf is not used, and not checked
+ if ((bcn->rp_alpha < MIN_BCN_DELTA) ||
+ (bcn->rp_alpha > MAX_BCN_DELTA)) {
return dcb_bad_params;
}
- /* Receive Check */
- rx_bw = 0, rx_bw_id = 0;
- rx_bw = (u8)(pg->rx.up[i].percent_of_pg_cap);
- rx_bw_id = (u8)(pg->rx.up[i].pgid);
-
- if (rx_bw_id >= MAX_BW_GROUP) {
- log_message(MSG_ERR_DCB_INVALID_RX_BWG_IDX, "%d",
- (int)rx_bw_id);
- return dcb_bad_params;
- }
- if (pg->rx.up[i].strict_priority == dcb_link) {
- rx_link_strict[rx_bw_id] = TRUE;
- /* Link strict class should have zero bandwidth */
- if (rx_bw){
- log_message(MSG_ERR_DCB_INVALID_RX_LSP_NZERO_BW_TC,
- "%d%d", i, (int)rx_bw);
- return dcb_bad_params;
- }
- } else if (!rx_bw) {
- log_message(MSG_ERR_DCB_INVALID_RX_ZERO_BW_TC, "%d", i);
- /* Non link strict class should have non-zero bw */
- return dcb_bad_params; /* DCB_RX_ERR_TC_BW_ZERO; */
+ if ((bcn->rp_beta < MIN_BCN_DELTA) ||
+ (bcn->rp_beta > MAX_BCN_DELTA)) {
+ return dcb_bad_params;
}
- tx_bw_sum[tx_bw_id] = tx_bw_sum[tx_bw_id] + tx_bw;
- rx_bw_sum[rx_bw_id] = rx_bw_sum[rx_bw_id] + rx_bw;
-
- }
-
- /* Transmit Check */
- for (i = 0; i < MAX_BW_GROUP; i++) {
- /* sum of bandwidth percentages of all traffic classes within
- * a Bandwidth Group must total 100 except for link strict
- * group (zero bandwidth).
- */
- if (tx_link_strict[i]) {
- if (tx_bw_sum[i] && pg->tx.pg_percent[i]) {
- log_message(MSG_ERR_DCB_INVALID_TX_LSP_NZERO_BWG,
- "%d%d", i, (int)tx_bw_sum[i]);
- /* Link strict group should have zero bw */
- return dcb_bad_params;
- }
- } else if (tx_bw_sum[i] != BW_PERCENT && tx_bw_sum[i] != 0) {
- log_message(MSG_ERR_DCB_INVALID_TX_BWG, "%d%d",
- i, (int)tx_bw_sum[i]);
+ if ((bcn->rp_gd < MIN_BCN_DELTA) ||
+ (bcn->rp_gd > MAX_BCN_DELTA)) {
return dcb_bad_params;
}
- }
- /* Receive Check */
- for (i = 0; i < MAX_BW_GROUP; i++) {
- /* sum of bandwidth percentages of all traffic classes
- * within a Bandwidth Group must total 100 except for
- * link strict group ( zero bandwidth).
- */
- if (rx_link_strict[i]) {
- if (rx_bw_sum[i] && pg->rx.pg_percent[i]) {
- log_message(MSG_ERR_DCB_INVALID_RX_LSP_NZERO_BWG,
- "%d%d", i, (int)rx_bw_sum[i]);
- /* Link strict group should have zero bw */
- return dcb_bad_params;
- }
- } else if (rx_bw_sum[i] != BW_PERCENT && rx_bw_sum[i] != 0) {
- log_message(MSG_ERR_DCB_INVALID_RX_BWG, "%d%d",
- i, (int)rx_bw_sum[i]);
+ if ((bcn->rp_gi < MIN_BCN_DELTA) ||
+ (bcn->rp_gi > MAX_BCN_DELTA)) {
+ return dcb_bad_params;
+ }
+ if ((bcn->rp_tmax < MIN_BCN_BKOFF_TMR_RNG) ||
+ (bcn->rp_tmax > MAX_BCN_BKOFF_TMR_RNG)) {
+ return dcb_bad_params;
+ }
+ if ((bcn->rp_c < MIN_BCN_LINK_CAPACITY) ||
+ (bcn->rp_c > MAX_BCN_LINK_CAPACITY)) {
+ return dcb_bad_params;
+ }
+ if ((bcn->rp_ri < MIN_BCN_INITIAL_RATE) ||
+ (bcn->rp_ri > MAX_BCN_INITIAL_RATE)) {
+ return dcb_bad_params;
+ }
+ if ((bcn->rp_td < MIN_BCN_DRIFT_TIMER) ||
+ (bcn->rp_td > MAX_BCN_DRIFT_TIMER)) {
+ return dcb_bad_params;
+ }
+ if ((bcn->rp_rmin < MIN_BCN_RESTRT_RATE) ||
+ (bcn->rp_rmin > MAX_BCN_RESTRT_RATE)) {
+ return dcb_bad_params;
+ }
+ if ((bcn->rp_w < MIN_BCN_DERVD_WEIGHT) ||
+ (bcn->rp_w > MAX_BCN_DERVD_WEIGHT)) {
+ return dcb_bad_params;
+ }
+ if ((bcn->rp_rd < MIN_BCN_DRIFT_INC) ||
+ (bcn->rp_rd > MAX_BCN_DRIFT_INC)) {
return dcb_bad_params;
}
+ if ((bcn->rp_ru < MIN_BCN_RATE_UNIT) ||
+ (bcn->rp_ru > MAX_BCN_RATE_UNIT)) {
+ return dcb_bad_params;
+ }
+ if (bcn->rp_wrtt > MAX_BCN_RTT_AVG_WEIGHT) {
+ return dcb_bad_params;
+ }
+ for (i=0; i < MAX_TRAFFIC_CLASSES; i++) {
+ if ((bcn->up_settings[i].cp_admin < 0) ||
+ (bcn->up_settings[i].cp_admin > 1)) {
+ return dcb_bad_params;
+ }
+ if ((bcn->up_settings[i].rp_admin < 0) ||
+ (bcn->up_settings[i].rp_admin > 1)) {
+ return dcb_bad_params;
+ }
+ if ((bcn->up_settings[i].rp_oper < 0) ||
+ (bcn->up_settings[i].rp_oper > 1)) {
+ return dcb_bad_params;
+ }
+ if ((bcn->up_settings[i].rem_tag_oper < 0) ||
+ (bcn->up_settings[i].rem_tag_oper > 1)) {
+ return dcb_bad_params;
+ }
+ }
}
+
return dcb_success;
}
Index: dcbd-0.7.31rt/dcbtool.c
===================================================================
--- dcbd-0.7.31rt.orig/dcbtool.c
+++ dcbd-0.7.31rt/dcbtool.c
@@ -105,43 +105,97 @@ static const char *cli_full_license =
"\n";
static const char *commands_help =
-"Commands:\n"
+"DCBX Commands:\n"
" <gc|go> dcbx get configured or operational DCBX versions\n"
" the operational version takes effect on next\n"
" restart of the dcbd service\n"
-" sc dcbx v:[12] set the DCBX version to be used on next\n"
+" sc dcbx v:[12] set the DCBX version to be used after next\n"
" dcbd restart\n"
+"Per Port Commands:\n"
" gc <ifname> <feature> get configuration of <feature> on port <ifname>\n"
" go <ifname> <feature> get operational status of <feature>\n"
" on port <ifname>\n"
" gp <ifname> <feature> get peer configuration of <feature>\n"
" on port <ifname>\n"
-" features:\n"
-" dcb DCB state of port (only for the 'gc' command)\n"
-" pg priority groups\n"
-" pfc priority groups\n"
-" app:<subtype> application specific\n"
-" bcn backwards congestion notification\n"
-" ll:<subtype> logical link status\n"
-" subtype = [0|fcoe]: FCoE\n\n"
-" sc <ifname> dcb [<on|off>] set the DCB state of the port\n"
-" sc <ifname> pg \\ set priority group configuration\n"
-" [e:<0|1>] \\ enable/disable feature\n"
-" [a:<0|1>] \\ enable/disable advertise\n"
-" [w:<0|1>] \\ enable/disable willing mode\n"
-" [[up2tc:xxxxxxxx] \\ user priority to traffic class mapping\n"
-" pgpct:x,x,x,x,x,x,x,x \\ priority group percent of link\n"
-" pgid:xxxxxxxx \\ priority group ID of user priority\n"
-" uppct:x,x,x,x,x,x,x,x \\ user priority percent of bandwidth group\n"
-" [ strict:xxxxxxxx ]] strict priority setting\n"
-" sc <ifname> pfc \\ set priority flow control settings\n"
-" [e:x] [a:x] [w:x] \\\n"
-" [pfcup:xxxxxxxx] ] enable/disable priority flow control\n"
-" sc <ifname> app:<subtype> \\\n"
-" [e:x] [a:x] [w:x] \\\n"
-" [appcfg:xxxx...xxxx] application config data\n\n"
+" sc <ifname> <feature> <args> general form of set feature configuration\n\n"
+" 'feature' can be:\n"
+" dcb DCB state of port\n"
+" pg priority groups\n"
+" pfc priority groups\n"
+" app:<subtype> application specific data\n"
+" bcn backwards congestion notification\n"
+" ll:<subtype> logical link status\n\n"
+" 'subtype' can be:\n"
+" [0|fcoe] FCoE\n\n"
+" 'args' can include:\n"
+" [e:<0|1>] controls feature enable\n"
+" [a:<0|1>] controls feature advertise via DCBX\n"
+" [w:<0|1>] controls feature DCBX willing mode\n"
+" [feature specific args] arguments specific to a feature\n\n"
+" feature specific arguments for 'dcb':\n"
+" [on|off] the 'dcb' configuration does not use the\n"
+" enable, advertise or willing mode parameters\n"
+" 'dcb' also does not use the 'go' or 'gp'\n"
+" commands.\n\n"
+" feature specific arguments for 'pg':\n"
+" [pgid:xxxxxxxx] priority group ID of user priority.\n"
+" From left to right (priorities 0-7), x is\n"
+" the corresponding priority group value\n"
+" 0-7 (for priority groups with bandwidth)\n"
+" or 'f' (the no bandwidth allocation group)\n"
+" [pgpct:x,x,x,x,x,x,x,x] priority group percent of link.\n"
+" From left to right (priority groups 0-7),\n"
+" x is the percentage of link bandwidth\n"
+" assigned the total must equal 100%.\n"
+" [uppct:x,x,x,x,x,x,x,x] user priority percent of bandwidth group.\n"
+" From left to right (priorities 0-7),\n"
+" x is the percentage of priority group\n"
+" bandwidth assigned to the priority.\n"
+" The sum of percentages for priorities in the\n"
+" same priority group must be 100.\n"
+" [strict:xxxxxxxx] strict priority setting.\n"
+" From left to right (priorities 0-7),\n"
+" x is 0 or 1. 1 indicates that the priority\n"
+" may utilize all of the bandwidth allocated\n"
+" to its priority group.\n"
+" [up2tc:xxxxxxxx] user priority to traffic class mapping.\n"
+" From left to right (priorities 0-7), x is\n"
+" a the corresponding traffic class (0-7)\n"
+" (this argument is currently ignored).\n\n"
+" feature specific arguments for 'pfc':\n"
+" [pfcup:xxxxxxxx] enable/disable priority flow control.\n"
+" From left to right (priorities 0-7),\n"
+" x is 0 or 1. 1 indicates that the priority\n"
+" is configured to transmit priority pause.\n\n"
+" feature specific arguments for 'app:<subtype>':\n"
+" [appcfg:xx] 'xx' is a hexadecimal value representing an\n"
+" 8 bit bitmap where 1 bits indicate the\n"
+" priority which frames for the application\n"
+" specified by the subtype should use.\n"
+" The lowest order bit maps to priority 0.\n\n"
+" feature specific arguments for 'll:<subtype>':\n"
+" [status:<0|1>] for testing, the logical link status may\n"
+" be set to 0 or 1. This setting is not\n"
+" persisted.\n\n"
+" feature specific arguments for 'bcn':\n"
+" [rpadmin:xxxxxxxx] user priorities for which a reaction point\n"
+" should be enabled. From left to right\n"
+" (priorities 0-7), x is 0 or 1\n"
+" [alpha:<0.0-1.0>] alpha - floating point value between 0 and 1\n"
+" [beta:<0.0-1.0>] beta - floating point value between 0 and 1\n"
+" [gd:<0.0-1.0>] decrement coefficient - floating point value\n"
+" between 0 and 1\n"
+" [gi:<0.0-1.0>] increment coefficient - floating point value\n"
+" between 0 and 1\n"
+" [tmax:<0-1000000>] max time to backoff after BCN0\n"
+" [td:<1-10000>] drift interval\n"
+" [rmin:<1-1000>] default rate after first BCN0\n"
+" [dw:<1-64>] derived weight (1 = 0.125)\n"
+" [rd:<1-100>] drift factor\n"
+" [ru:<1-100>] rate unit\n"
+" [wrtt:<0-10>] RTT moving average weight\n"
+" [ri:<0-10000>] initial rate\n\n"
" help show command information\n"
-" level <value > set debug level for events\n"
" license show license information\n";
static struct clif *clif_conn;
@@ -313,19 +367,6 @@ static int cli_cmd_quit(struct clif *cli
}
-static int cli_cmd_level(struct clif *clif, int argc, char *argv[], int raw)
-{
- char cmd[256];
- if (argc != 1) {
- printf("Invalid LEVEL command: needs one argument (debug "
- "level)\n");
- return 0;
- }
- snprintf(cmd, sizeof(cmd), "L%s", argv[0]);
- return clif_command(clif, cmd, raw);
-}
-
-
static void cli_list_interfaces(struct clif *clif)
{
struct dirent *dent;
@@ -384,7 +425,6 @@ static struct cli_cmd cli_commands[] = {
{ "ping", cli_cmd_ping },
{ "help", cli_cmd_help },
{ "interface", cli_cmd_interface },
- { "level", cli_cmd_level },
{ "license", cli_cmd_license },
{ "quit", cli_cmd_quit },
{ NULL, NULL }
Index: dcbd-0.7.31rt/drv_cfg.c
===================================================================
--- dcbd-0.7.31rt.orig/drv_cfg.c
+++ dcbd-0.7.31rt/drv_cfg.c
@@ -703,7 +703,7 @@ static int set_bcn_cfg(char *ifname, bcn
rta_parent = add_rta(nlh, DCB_ATTR_BCN, NULL, 0);
for (i = DCB_BCN_ATTR_RP_0; i <= DCB_BCN_ATTR_RP_7; i++) {
rta_child = add_rta(nlh, i,
- (void *)&bcn_data->bcn_up_settings[i - DCB_BCN_ATTR_RP_0].rp_admin,
+ (void *)&bcn_data->up_settings[i - DCB_BCN_ATTR_RP_0].rp_admin,
sizeof(__u8));
rta_parent->rta_len += NLA_ALIGN(rta_child->rta_len);
}
@@ -717,7 +717,7 @@ static int set_bcn_cfg(char *ifname, bcn
temp_int = 0;
for (i = BCN_ADDR_OPTION_LEN/2; i < BCN_ADDR_OPTION_LEN; i++)
- temp_int |= bcn_data->bcna[i]<<(i- BCN_ADDR_OPTION_LEN/2)*8;
+ temp_int |= bcn_data->bcna[i] << ((i- BCN_ADDR_OPTION_LEN/2)*8);
rta_child = add_rta(nlh, DCB_BCN_ATTR_BCNA_1,
(void *)&temp_int, sizeof(__u32));
rta_parent->rta_len += NLA_ALIGN(rta_child->rta_len);
@@ -797,10 +797,10 @@ int set_hw_bcn(char *ifname, bcn_cfg *bc
}
for (i = 0; i < MAX_TRAFFIC_CLASSES; i++) {
- if (bcn_temp->bcn_up_settings[i].cp_admin)
- bcn_temp->bcn_up_settings[i].cp_admin = 1;
+ if (bcn_temp->up_settings[i].cp_admin)
+ bcn_temp->up_settings[i].cp_admin = 1;
else
- bcn_temp->bcn_up_settings[i].cp_admin = 0;
+ bcn_temp->up_settings[i].cp_admin = 0;
}
return set_bcn_cfg(ifname, bcn_temp);
Index: dcbd-0.7.31rt/event_iface.c
===================================================================
--- dcbd-0.7.31rt.orig/event_iface.c
+++ dcbd-0.7.31rt/event_iface.c
@@ -165,7 +165,10 @@ static void event_if_decode_nlmsg(int ro
val = get_port_hw_resetting(
device_name);
if (val != 1) {
+ if (!init_cfg())
+ break;
remove_adapter(device_name);
+ destroy_cfg();
} else {
printf("******* IGNORING: %s\n",
device_name);
Index: dcbd-0.7.31rt/include/dcb_protocol.h
===================================================================
--- dcbd-0.7.31rt.orig/include/dcb_protocol.h
+++ dcbd-0.7.31rt/include/dcb_protocol.h
@@ -131,7 +131,7 @@ dcb_result get_oper_llink(char *device_n
dcb_result get_peer_llink(char *device_name, u32 subtype,
llink_attribs *llink_data);
-dcb_result dcb_check_config(pg_attribs *pg);
+dcb_result dcb_check_config(full_dcb_attrib_ptrs *attribs);
void rebalance_uppcts(pg_attribs *pg);
dcb_result run_feature_protocol(char *device_name, u32 EventFlag, u32 Subtype);
@@ -141,7 +141,7 @@ dcb_result run_dcb_protocol(char *device
void remove_all_adapters(void);
-void log_message(u32 dwMsgId, char *pFormat, ...);
+void log_message(u32 dwMsgId, const char *pFormat, ...);
#ifdef __cplusplus
}
Index: dcbd-0.7.31rt/include/dcb_types.h
===================================================================
--- dcbd-0.7.31rt.orig/include/dcb_types.h
+++ dcbd-0.7.31rt/include/dcb_types.h
@@ -79,7 +79,14 @@
#define BCN_ADDR_OPTION_LEN 8 /* 8 hex digits */
#define BCN_ADDR_OPTION_BYTES 34 /* bytes for 8 hex digits plus NULL */
-#define BCN_CP_SAMP_INTERVAL 140000
+
+#define DEF_BCN_CP_SAMP_INTERVAL 140000 /* sampling interval */
+#define MIN_BCN_CP_SAMP_INTERVAL 1
+#define MAX_BCN_CP_SAMP_INTERVAL 256000
+
+#define DEF_BCN_LINK_CAPACITY 10000 /* 1 = 1 Mbps */
+#define MIN_BCN_LINK_CAPACITY 0
+#define MAX_BCN_LINK_CAPACITY 10000
/* DCBX subtypes */
typedef enum {
@@ -174,6 +181,7 @@ typedef struct dcb_pfc_stats_type{
#define APP_FCOE_STYPE 0
#define APP_FCOE_STYPE_LEN 1
#define LLINK_FCOE_STYPE 0
+#define APP_FCOE_DEFAULT_DATA 0x08 /* user priority 3 */
/* Max TLV length */
#define DCB_MAX_TLV_LENGTH 507
@@ -261,7 +269,7 @@ typedef struct bcn_cfg {
boolean_t rp_admin; /* RP admin mode */
boolean_t rp_oper; /* RP Operational mode */
boolean_t rem_tag_oper; /* Remove CM tag Operational mode */
- }bcn_up_settings[MAX_USER_PRIORITIES]; /* Index is user priority */
+ }up_settings[MAX_USER_PRIORITIES]; /* Index is user priority */
double rp_alpha; /* RP max decrease factor */
double rp_beta; /* RP max increase factor */
double rp_gd; /* RP decrement coefficient */
Index: dcbd-0.7.31rt/include/version.h
===================================================================
--- dcbd-0.7.31rt.orig/include/version.h
+++ dcbd-0.7.31rt/include/version.h
@@ -28,7 +28,7 @@
#ifndef VERSION_H
#define VERSION_H
-#define VERSION_STR "0.7.31rt"
+#define VERSION_STR "0.7.35rt"
#define DCBTOOL_VERSION VERSION_STR
#endif /* VERSION_H */
Index: dcbd-0.7.31rt/lldp/rx.c
===================================================================
--- dcbd-0.7.31rt.orig/lldp/rx.c
+++ dcbd-0.7.31rt/lldp/rx.c
@@ -191,11 +191,11 @@ void rxProcessFrame(struct port * port)
goto out;
}
- if ((tlv_length == 0) && (tlv->type != TYPE_0)) {
- printf("ERROR: tlv_length == 0\n");
- free_unpkd_tlv(tlv);
- goto out;
- }
+ if ((tlv_length == 0) && (tlv->type != TYPE_0)) {
+ printf("ERROR: tlv_length == 0\n");
+ free_unpkd_tlv(tlv);
+ goto out;
+ }
tlv->type = tlv_type;
tlv->length = tlv_length;
tlv->info = (u8 *)malloc(tlv_length);
@@ -563,6 +563,7 @@ static u32 check_feature_not_present(cha
{
pg_attribs peer_pg;
pfc_attribs peer_pfc;
+ feature_support dcb_support;
bcn_attribs peer_bcn;
app_attribs peer_app;
llink_attribs peer_llink;
@@ -587,6 +588,12 @@ static u32 check_feature_not_present(cha
}
break;
case DCB_REMOTE_CHANGE_BCN:
+ if (get_dcb_support(device_name, &dcb_support) != dcb_success)
+ return FALSE;
+
+ if (!dcb_support.bcn)
+ return FALSE;
+
if ((get_peer_bcn(device_name, &peer_bcn) == dcb_success)
&& (peer_bcn.protocol.TLVPresent == TRUE)) {
peer_bcn.protocol.TLVPresent = FALSE;
@@ -1009,31 +1016,40 @@ boolean_t unpack_dcbx1_tlvs(struct port
switch(dcbtlv->type) {
case DCB_CONTROL_TLV:
port->rx.manifest->dcbx_ctrl = dcbtlv;
- break;
+ break;
case DCB_PRIORITY_GROUPS_TLV:
/* store if subtype 2 is not present */
if (port->rx.dcbx_st == dcbx_subtype1) {
port->rx.manifest->dcbx_pg = dcbtlv;
}
- break;
+ break;
case DCB_PRIORITY_FLOW_CONTROL_TLV:
/* store if subtype 2 is not present */
if (port->rx.dcbx_st == dcbx_subtype1) {
port->rx.manifest->dcbx_pfc = dcbtlv;
}
- break;
+ break;
case DCB_BCN_TLV:
port->rx.manifest->dcbx_bcn = dcbtlv;
- break;
+ break;
case DCB_APPLICATION_TLV:
/* store if subtype 2 is not present */
- if (port->rx.dcbx_st == dcbx_subtype1) {
+ if ((port->rx.dcbx_st == dcbx_subtype1) &&
+ (dcbtlv->info[DCBX_HDR_SUB_TYPE_OFFSET]
+ == APP_FCOE_STYPE)) {
port->rx.manifest->dcbx_app = dcbtlv;
+ } else {
+ free_unpkd_tlv(dcbtlv);
}
break;
case DCB_LLINK_TLV:
- port->rx.manifest->dcbx_llink = dcbtlv;
- break;
+ if (dcbtlv->info[DCBX_HDR_SUB_TYPE_OFFSET]
+ == LLINK_FCOE_STYPE) {
+ port->rx.manifest->dcbx_llink = dcbtlv;
+ } else {
+ free_unpkd_tlv(dcbtlv);
+ }
+ break;
default:
free_unpkd_tlv(dcbtlv);
break;
@@ -1092,16 +1108,21 @@ boolean_t unpack_dcbx2_tlvs(struct port
switch(dcbtlv->type) {
case DCB_PRIORITY_GROUPS_TLV2:
port->rx.manifest->dcbx_pg = dcbtlv;
- break;
+ break;
case DCB_PRIORITY_FLOW_CONTROL_TLV2:
port->rx.manifest->dcbx_pfc = dcbtlv;
- break;
+ break;
case DCB_APPLICATION_TLV2:
- port->rx.manifest->dcbx_app = dcbtlv;
- break;
+ if (dcbtlv->info[DCBX_HDR_SUB_TYPE_OFFSET]
+ == APP_FCOE_STYPE) {
+ port->rx.manifest->dcbx_app = dcbtlv;
+ } else {
+ free_unpkd_tlv(dcbtlv);
+ }
+ break;
default:
free_unpkd_tlv(dcbtlv);
- break;
+ break;
}
dcbtlv = NULL;
} while(current < end);
@@ -1403,27 +1424,27 @@ boolean_t process_dcbx_bcn_tlv(struct po
for (i=0; i < MAX_USER_PRIORITIES; i++) {
if (port->rx.manifest->dcbx_bcn->info
[DCBX_BCN_SETTINGS_OFFSET + i] & BIT7) {
- cfg->bcn_up_settings[i].cp_admin = TRUE;
+ cfg->up_settings[i].cp_admin = TRUE;
} else {
- cfg->bcn_up_settings[i].cp_admin = FALSE;
+ cfg->up_settings[i].cp_admin = FALSE;
}
if (port->rx.manifest->dcbx_bcn->info
[DCBX_BCN_SETTINGS_OFFSET + i] & BIT6) {
- cfg->bcn_up_settings[i].rp_admin = TRUE;
+ cfg->up_settings[i].rp_admin = TRUE;
} else {
- cfg->bcn_up_settings[i].rp_admin = FALSE;
+ cfg->up_settings[i].rp_admin = FALSE;
}
if (port->rx.manifest->dcbx_bcn->info
[DCBX_BCN_SETTINGS_OFFSET + i] & BIT5) {
- cfg->bcn_up_settings[i].rp_oper = TRUE;
+ cfg->up_settings[i].rp_oper = TRUE;
} else {
- cfg->bcn_up_settings[i].rp_oper = FALSE;
+ cfg->up_settings[i].rp_oper = FALSE;
}
if (port->rx.manifest->dcbx_bcn->info
[DCBX_BCN_SETTINGS_OFFSET + i] & BIT4) {
- cfg->bcn_up_settings[i].rem_tag_oper = TRUE;
+ cfg->up_settings[i].rem_tag_oper = TRUE;
} else {
- cfg->bcn_up_settings[i].rem_tag_oper = FALSE;
+ cfg->up_settings[i].rem_tag_oper = FALSE;
}
}
@@ -1522,8 +1543,8 @@ boolean_t process_dcbx_app_tlv(struct po
}
peer_oui[0] = (u8)(pBuf[DCBX2_APP_BYTE1_OFFSET]
& PROTO_ID_OUI_MASK);
- peer_oui[1] = pBuf[DCBX2_APP_LOW_OUI_OFFSET2];
- peer_oui[2] = pBuf[DCBX2_APP_LOW_OUI_OFFSET1];
+ peer_oui[1] = pBuf[DCBX2_APP_LOW_OUI_OFFSET1];
+ peer_oui[2] = pBuf[DCBX2_APP_LOW_OUI_OFFSET2];
if (memcmp(peer_oui, oui, DCB_OUI_LEN) != 0) {
sel_field = 0;
peer_proto = 0;
Index: dcbd-0.7.31rt/lldp/tlv.c
===================================================================
--- dcbd-0.7.31rt.orig/lldp/tlv.c
+++ dcbd-0.7.31rt/lldp/tlv.c
@@ -821,7 +821,7 @@ struct unpacked_tlv *bld_dcbx2_app_tlv(s
app_info->data.prot_id = PROTO_ID_FCOE;
app_info->data.byte1 = (oui[0] & PROTO_ID_OUI_MASK)
| (PROTO_ID_L2_ETH_TYPE & PROTO_ID_SF_TYPE);
- app_info->data.low_oui = (oui[1]<<8) | oui[2];
+ app_info->data.low_oui = (oui[2]<<8) | oui[1];
memcpy (&(app_info->data.up_map), &(app_cfg.AppData[0]),
APP_FCOE_STYPE_LEN);
@@ -887,14 +887,14 @@ struct unpacked_tlv *bld_dcbx_bcn_tlv(st
pkt->bcna[i] = cfg->bcna[i];
}
for (i=0; i < MAX_USER_PRIORITIES; i++) {
- if (cfg->bcn_up_settings[i].cp_admin == TRUE)
- pkt->bcn_up_settings[i].byte |= BIT7;
- if (cfg->bcn_up_settings[i].rp_admin == TRUE)
- pkt->bcn_up_settings[i].byte |= BIT6;
- if (cfg->bcn_up_settings[i].rp_oper == TRUE)
- pkt->bcn_up_settings[i].byte |= BIT5;
- if (cfg->bcn_up_settings[i].rem_tag_oper == TRUE)
- pkt->bcn_up_settings[i].byte |= BIT4;
+ if (cfg->up_settings[i].cp_admin == TRUE)
+ pkt->up_settings[i].byte |= BIT7;
+ if (cfg->up_settings[i].rp_admin == TRUE)
+ pkt->up_settings[i].byte |= BIT6;
+ if (cfg->up_settings[i].rp_oper == TRUE)
+ pkt->up_settings[i].byte |= BIT5;
+ if (cfg->up_settings[i].rem_tag_oper == TRUE)
+ pkt->up_settings[i].byte |= BIT4;
}
pkt->rp_alpha = cfg->rp_alpha;
pkt->rp_beta = cfg->rp_beta;
Index: dcbd-0.7.31rt/lldp/tlv.h
===================================================================
--- dcbd-0.7.31rt.orig/lldp/tlv.h
+++ dcbd-0.7.31rt/lldp/tlv.h
@@ -114,8 +114,8 @@
#define DCB_APPLICATION_TLV2 4
/* Protocol EtherTypes */
-#define PROTO_ID_FCOE 0x8906
-#define PROTO_ID_FIP 0x8914
+#define PROTO_ID_FCOE 0x0689 /* network byte order */
+#define PROTO_ID_FIP 0x1489 /* network byte order */
/* Protocol Selector Field */
#define PROTO_ID_L2_ETH_TYPE 0x00
@@ -223,7 +223,7 @@ struct dcbx_bcn_cfg {
/* :1 RP Operational mode */
/* :1 Remove CM tag Operational mode */
/* :4 padding */;
- }bcn_up_settings[MAX_USER_PRIORITIES]; /* Index is user priority */
+ }up_settings[MAX_USER_PRIORITIES]; /* Index is user priority */
double rp_alpha; /* RP max decrease factor */
double rp_beta; /* RP max increase factor */
double rp_gd; /* RP decrement coefficient */
Index: dcbd-0.7.31rt/log.c
===================================================================
--- dcbd-0.7.31rt.orig/log.c
+++ dcbd-0.7.31rt/log.c
@@ -31,7 +31,7 @@
#include "messages.h"
-void log_message(u32 msgid, char *format, ...)
+void log_message(u32 msgid, const char *format, ...)
{
int a, b;
char fmt[256];
Index: dcbd-0.7.31rt/nltest.c
===================================================================
--- dcbd-0.7.31rt.orig/nltest.c
+++ dcbd-0.7.31rt/nltest.c
@@ -688,7 +688,8 @@ static int get_bcn(char *ifname, bcn_cfg
struct nlmsghdr *nlh;
struct dcbmsg *d;
struct rtattr *rta_parent, *rta_child;
- int i;
+ int i, j;
+ unsigned int temp_int;
nlh = start_msg(RTM_GETDCB, DCB_CMD_BCN_GCFG);
if (NULL==nlh)
@@ -729,9 +730,10 @@ static int get_bcn(char *ifname, bcn_cfg
NLMSG_ALIGN(rta_parent->rta_len));
for (i = 0; rta_parent > rta_child; i++) {
if (i == DCB_BCN_ATTR_RP_ALL - DCB_BCN_ATTR_RP_0) {
+ printf("bcn param out of range\n");
break;
}
- bcn_data->bcn_up_settings[rta_child->rta_type
+ bcn_data->up_settings[rta_child->rta_type
- DCB_BCN_ATTR_RP_0].rp_admin =
*(__u8 *)NLA_DATA(rta_child);
rta_child = (struct rtattr *)((char *)rta_child +
@@ -739,6 +741,16 @@ static int get_bcn(char *ifname, bcn_cfg
}
+ for (i = 0; i < BCN_ADDR_OPTION_LEN/4; i++) { /*2 bytes for BCNA data */
+ temp_int = *(__u32 *)NLA_DATA(rta_child);
+ rta_child = (struct rtattr *)((char *)rta_child +
+ NLMSG_ALIGN(rta_child->rta_len));
+ for (j = 0; j < 4; j++) {
+ bcn_data->bcna[j+i*4] =
+ (__u8)((temp_int & (0xFF << (j*8))) >> (j*8));
+ }
+ }
+
bcn_data->rp_alpha = *(__u64 *)NLA_DATA(rta_child);
rta_child = (struct rtattr *)((char *)rta_child +
NLMSG_ALIGN(rta_child->rta_len));
@@ -816,11 +828,25 @@ static int set_bcn_cfg(char *ifname, bcn
rta_parent = add_rta(nlh, DCB_ATTR_BCN, NULL, 0);
for (i = DCB_BCN_ATTR_RP_0; i <= DCB_BCN_ATTR_RP_7; i++) {
rta_child = add_rta(nlh, i,
- (void *)&bcn_data->bcn_up_settings[i - DCB_BCN_ATTR_RP_0].rp_admin,
+ (void *)&bcn_data->up_settings[i - DCB_BCN_ATTR_RP_0].rp_admin,
sizeof(__u8));
rta_parent->rta_len += NLA_ALIGN(rta_child->rta_len);
}
+ temp_int = 0;
+ for (i = 0; i < BCN_ADDR_OPTION_LEN/2; i++)
+ temp_int |= bcn_data->bcna[i]<<(i*8);
+ rta_child = add_rta(nlh, DCB_BCN_ATTR_BCNA_0,
+ (void *)&temp_int, sizeof(__u32));
+ rta_parent->rta_len += NLA_ALIGN(rta_child->rta_len);
+
+ temp_int = 0;
+ for (i = BCN_ADDR_OPTION_LEN/2; i < BCN_ADDR_OPTION_LEN; i++)
+ temp_int |= bcn_data->bcna[i]<<((i- BCN_ADDR_OPTION_LEN/2)*8);
+ rta_child = add_rta(nlh, DCB_BCN_ATTR_BCNA_1,
+ (void *)&temp_int, sizeof(__u32));
+ rta_parent->rta_len += NLA_ALIGN(rta_child->rta_len);
+
rta_child = add_rta(nlh, DCB_BCN_ATTR_ALPHA,
(void *)&bcn_data->rp_alpha, sizeof(__u32));
rta_parent->rta_len += NLA_ALIGN(rta_child->rta_len);
@@ -892,7 +918,7 @@ int set_hw_bcn(char *device_name, bcn_cf
{
for (i = 0; i <= 8; i++) {
- bcn_data->bcn_up_settings[i].rp_admin = 1;
+ bcn_data->up_settings[i].rp_admin = 1;
}
bcn_data->rp_alpha = 0.5;
bcn_data->rp_beta = 0.1;
@@ -917,10 +943,10 @@ int set_hw_bcn(char *device_name, bcn_cf
}
for (i = 0; i < 8; i++) {
- if (bcn_temp->bcn_up_settings[i].cp_admin)
- bcn_temp->bcn_up_settings[i].cp_admin = 1;
+ if (bcn_temp->up_settings[i].cp_admin)
+ bcn_temp->up_settings[i].cp_admin = 1;
else
- bcn_temp->bcn_up_settings[i].cp_admin = 0;
+ bcn_temp->up_settings[i].cp_admin = 0;
}
return set_bcn_cfg(device_name, bcn_temp);
@@ -1085,7 +1111,7 @@ int main(int argc, char *argv[])
printf("\nGETTING BCN: \n");
for (i = 0; i < 8; i++) {
printf("BCN RP %d: %d\n", i,
- bcn_data.bcn_up_settings[i].rp_admin);
+ bcn_data.up_settings[i].rp_admin);
}
printf("\nBCN RP ALPHA: %f\n", bcn_data.rp_alpha);
printf("BCN RP BETA : %f\n", bcn_data.rp_beta);
Index: dcbd-0.7.31rt/nltest.h
===================================================================
--- dcbd-0.7.31rt.orig/nltest.h
+++ dcbd-0.7.31rt/nltest.h
@@ -41,6 +41,8 @@
#include <linux/rtnetlink.h>
#include <linux/dcbnl.h>
+#define BCN_ADDR_OPTION_LEN 8 /* 8 hex digits */
+
enum dcb_pfc_type {
pfc_disabled = 0,
pfc_enabled_tx,
@@ -68,7 +70,7 @@ typedef struct bcn_cfg {
char rp_admin; /* RP admin mode */
char rp_oper; /* RP Operational mode */
char rem_tag_oper; /* Remove CM tag Operational mode */
- }bcn_up_settings[8]; /* Index is user priority */
+ }up_settings[8]; /* Index is user priority */
float rp_alpha; /* RP max decrease factor */
float rp_beta; /* RP max increase factor */
float rp_gd; /* RP decrement coefficient */
Index: dcbd-0.7.31rt/SUMS
===================================================================
--- dcbd-0.7.31rt.orig/SUMS
+++ dcbd-0.7.31rt/SUMS
@@ -1,30 +1,30 @@
53544 3 dcbd7
-43967 36 clif_cmds.c
+23633 36 clif_cmds.c
23104 2 libconfig/Makefile
61336 131 libconfig/libconfig-1.3.1.patch
25761 517 libconfig/libconfig-1.3.1.tar.gz
-09662 5 log.c
-13193 5 Makefile
+04094 5 log.c
+08091 5 Makefile
28010 10 common.c
30806 9 ctrl_iface.c
21712 23 dcbtool_cmds.c
-32874 16 dcbtool.c
+48513 19 dcbtool.c
01403 6 clif.c
39773 19 COPYING
-42709 28 nltest.c
+51226 29 nltest.c
41214 11 eloop.c
11591 5 bonding.c
28102 24 parse_cli.c
-55083 10 dcb_rule_chk.cpp
+13564 12 dcb_rule_chk.cpp
56189 4 os_unix.c
49466 19 README
62150 7 dcbtool7
-49463 21 drv_cfg.c
-50144 121 dcb_protocol.cpp
+58582 21 drv_cfg.c
+00978 126 dcb_protocol.cpp
62067 3 include/ctrl_iface.h
55879 2 include/includes.h
04121 2 include/dcb_persist_store.h
-35724 6 include/dcb_protocol.h
+41008 6 include/dcb_protocol.h
36575 2 include/dcb_driver_interface.h
01776 3 include/dcbd.h
23709 3 include/dcb_rule_chk.h
@@ -33,7 +33,7 @@
08794 7 include/clif_cmds.h
08101 7 include/clif.h
44799 2 include/config.h
-29498 2 include/version.h
+29502 2 include/version.h
27192 3 include/messages.h
41092 12 include/common.h
55964 2 include/dcb_osdep.h
@@ -43,24 +43,24 @@
40725 3 include/drv_cfg.h
23005 2 include/dcb_events.h
11584 2 include/event_iface.h
-32443 10 include/dcb_types.h
+50008 11 include/dcb_types.h
56688 3 include/parse_cli.h
-06160 2 dcbd.spec
-11817 7 dcbd.init
-52046 8 event_iface.c
-45559 4 nltest.h
+05164 2 dcbd.spec
+04129 7 dcbd.init
+52219 8 event_iface.c
+62795 4 nltest.h
37630 9 lldp/l2_packet_linux.c
01032 3 lldp/agent.c
39750 6 lldp/l2_packet.h
-16207 13 lldp/tlv.h
+34822 13 lldp/tlv.h
08229 2 lldp/agent.h
15669 2 lldp/Makefile
44452 10 lldp/ports.c
-41749 45 lldp/rx.c
+16276 46 lldp/rx.c
24608 5 lldp/ports.h
-54424 25 lldp/tlv.c
+48526 25 lldp/tlv.c
15542 2 lldp/mibdata.h
07239 7 lldp/states.h
11172 14 lldp/tx.c
-51199 44 config.c
+24432 44 config.c
58610 9 dcbd.c
Index: dcbd-0.7.31rt/dcbd.init
===================================================================
--- dcbd-0.7.31rt.orig/dcbd.init
+++ dcbd-0.7.31rt/dcbd.init
@@ -150,6 +150,11 @@ rc_reset
# See how we were called.
case "$1" in
start)
+ if ! /sbin/lsmod | grep dcbnl > /dev/null ; then
+ if find /lib/modules/$(uname -r)/kernel/net/dcb/dcbnl.ko ; then
+ modprobe dcbnl > /dev/null 2>&1
+ fi
+ fi
echo -n $"Starting $DCBD: "
start_daemon $DCBD_BIN -d $OPTIONS
rc_status -v
Index: dcbd-0.7.31rt/Makefile
===================================================================
--- dcbd-0.7.31rt.orig/Makefile
+++ dcbd-0.7.31rt/Makefile
@@ -36,8 +36,8 @@ LIB_DIR = lib
CC = gcc
CPP = g++
LD = g++
-CFLAGS = -g -Iinclude -I$(LIBCONFIG_H) -DDCBTRACE -Wall
-CPPFLAGS = -g -static-libgcc -Iinclude -Wall
+CFLAGS += -Iinclude -I$(LIBCONFIG_H) -DDCBTRACE $(OPT_FLAGS)
+CPPFLAGS += -static-libgcc -Iinclude $(OPT_FLAGS)
# files removal
RM = /bin/rm -f
Index: dcbd-0.7.31rt/lldp/Makefile
===================================================================
--- dcbd-0.7.31rt.orig/lldp/Makefile
+++ dcbd-0.7.31rt/lldp/Makefile
@@ -29,7 +29,7 @@
CC = gcc
LD = gcc
# CFLAGS = -I. -ggdb -I../include -DDEBUG -Wall
-CFLAGS = -I. -ggdb -I../include -Wall
+CFLAGS += -I. -ggdb -I../include -Wall
# library's object files.
LLDP_OBJS = ports.o agent.o tlv.o l2_packet_linux.o tx.o rx.o