diff --git a/lldpad-0.9.43-Avoid-possible-resource-leaks.patch b/lldpad-0.9.43-Avoid-possible-resource-leaks.patch new file mode 100644 index 0000000..3a2845d --- /dev/null +++ b/lldpad-0.9.43-Avoid-possible-resource-leaks.patch @@ -0,0 +1,33 @@ +From e81f41287bbdb61da21b51e1e75423ad188003ca Mon Sep 17 00:00:00 2001 +From: Petr Sabata +Date: Mon, 15 Aug 2011 18:13:42 -0700 +Subject: [PATCH 23/29] Avoid possible resource leaks + +This patch prevents possible resource leaks in mand_clif_cmd(). + +Signed-off-by: Petr Sabata +Signed-off-by: John Fastabend +--- + lldp_mand_cmds.c | 5 ++++- + 1 files changed, 4 insertions(+), 1 deletions(-) + +diff --git a/lldp_mand_cmds.c b/lldp_mand_cmds.c +index d09d6a5..264d836 100644 +--- a/lldp_mand_cmds.c ++++ b/lldp_mand_cmds.c +@@ -492,8 +492,11 @@ int mand_clif_cmd(void *data, + + /* Confirm port is a lldpad managed port */ + port = port_find_by_name(cmd.ifname); +- if (!port) ++ if (!port) { ++ free(argvals); ++ free(args); + return cmd_device_not_found; ++ } + + switch (cmd.cmd) { + case cmd_getstats: +-- +1.7.6 + diff --git a/lldpad-0.9.43-Create-man-page-for-MED-usage.patch b/lldpad-0.9.43-Create-man-page-for-MED-usage.patch new file mode 100644 index 0000000..931c07d --- /dev/null +++ b/lldpad-0.9.43-Create-man-page-for-MED-usage.patch @@ -0,0 +1,177 @@ +From 489085ba1ea0c12216d941d238af16b49c14174b Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:03:51 -0700 +Subject: [PATCH 09/29] Create man page for MED usage. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + Makefile.am | 2 +- + docs/lldptool-med.8 | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++ + docs/lldptool.8 | 1 + + 3 files changed, 131 insertions(+), 1 deletions(-) + create mode 100644 docs/lldptool-med.8 + +diff --git a/Makefile.am b/Makefile.am +index 4bf9566..63cfb93 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -69,7 +69,7 @@ nltest_SOURCES = nltest.c nltest.h + ## man pages + dist_man_MANS = docs/lldpad.8 docs/dcbtool.8 docs/lldptool.8 \ + docs/lldptool-ets.8 docs/lldptool-pfc.8 docs/lldptool-app.8 \ +- docs/lldptool-evb.8 docs/lldptool-vdp.8 ++ docs/lldptool-evb.8 docs/lldptool-vdp.8 docs/lldptool-med.8 + + ## force the creation of an empty configuration directory at install time + lldpadconfigdir = /var/lib/lldpad +diff --git a/docs/lldptool-med.8 b/docs/lldptool-med.8 +new file mode 100644 +index 0000000..687175c +--- /dev/null ++++ b/docs/lldptool-med.8 +@@ -0,0 +1,129 @@ ++.TH lldptool 8 "June 2011" "open-lldp" "Linux" ++.SH NAME ++LLDP-MED \- Show / manipulate MED TLV configurations ++.SH SYNOPSIS ++.B lldptool -t -i ethx -V ++.RI "[ " TLV_TYPE " ]" ++.B enableTx ++.sp ++.B lldptool -T -i ethx -V ++.RI "[ " TLV_TYPE " ]" ++.B enableTx = ++{ yes | no } ++.sp ++.B lldptool -T -i ethx -V ++LLDP-MED ++.B devtype = ++{ class1 | class2 | class3 } ++.sp ++.B lldptool -t -i ethx -V ++LLDP-MED ++.B devtype ++.sp ++.ti -8 ++.IR TLV_TYPE " : = {LLDP-MED | medCap | medPolicy | medLoc | medPower | medHwRev | medFwRev | medSwRev | medSerNum | medManuf | medModel | medAssetID }" ++ ++.SH DESCRIPTION ++ ++The ++.B LLDP-MED ++extensions support the Link Layer Discovery Protocol for ++.B Media Endpoint Devices ++defined in the ++.B ANSI/TIA-1057-2006 ++document. Each TLV can be configured as a ++.B class1 ++, ++.B class2 ++or ++.B class3 ++device. Class I devices are the most basic class of Endpoint Device, Class II devices support media stream capabilities and Class III devices directly support end users of the IP communication system. See ++.B ANS-TIA-1057 ++for clarification of class types. ++ ++ ++.SH ARGUMENTS ++.TP ++.B enableTx ++Enables the TLV to be transmitted ++.TP ++.B devtype ++Set or query the class type of the device. ++ ++.SH TLV_TYPE ++List of supported TLV specifiers applicable to Media Endpoint Devices. ++ ++.TP ++.BR LLDP-MED ++apply arguments to all supported MED TLVs. ++ ++.TP ++.BR medCAP ++LLDP-MED Capabilities TLV ++ ++.TP ++.BR medPolicy ++LLDP-MED Network Policy TLV ++ ++.TP ++.BR medLoc ++LLDP-MED Location TLV ++ ++.TP ++.BR medPower ++LLDP-MED Extended Power-via-MDI TLV ++ ++.TP ++.BR medHwRev ++LLDP-MED Hardware Revision TLV ++ ++.TP ++.BR medFwRev ++LLDP-MED Firmware Revision TLV ++ ++.TP ++.BR medSwRev ++LLDP-MED Software Revision TLV ++ ++.TP ++.BR medSerNum ++LLDP-MED Serial Number TLV ++ ++.TP ++.BR medManuf ++LLDP-MED Manufacturer Name TL ++ ++.TP ++.BR medModel ++LLDP-MED Model Name TLV ++ ++.TP ++.BR medAssetID ++LLDP-MED Asset ID TLV ++ ++.SH EXAMPLE & USAGE ++.TP ++Enable class1 MED device on \fIeth2\fR ++.B lldptool -T -i eth2 -V LLDP-MED enableTx=yes devtype=class1 ++.TP ++Query class type of MED on \fIeth2\fR ++.B lldptool -t -i eth2 -V LLDP-MED -c devtype ++.TP ++Query transmit state of medPolicy on device \fIeth2\fR ++.B lldptool -t -i eth2 -V medPolicy -c enableTx ++.TP ++ ++.SH SOURCE ++.TP ++o ++Link Layer Discovery Protocol for Media Endpoint Devices (http://www.tiaonline.org/standards/technology/voip/documents/ANSI-TIA-1057_final_for_publication.pdf) ++ ++.SH NOTES ++ ++.SH SEE ALSO ++.BR lldptool (8), ++.BR lldpad (8) ++ ++.SH AUTHOR ++John Fastabend ++ +diff --git a/docs/lldptool.8 b/docs/lldptool.8 +index ea5787d..5ad7b50 100644 +--- a/docs/lldptool.8 ++++ b/docs/lldptool.8 +@@ -223,6 +223,7 @@ Configurations per port have higher precedence than global configurations. + .BR lldptool-ets (8), + .BR lldptool-pfc (8), + .BR lldptool-app (8), ++.BR lldptool-med (8), + .BR dcbtool (8), + .BR lldpad (8) + .br +-- +1.7.6 + diff --git a/lldpad-0.9.43-This-patch-fixes-a-warning-issued-when-building-the-.patch b/lldpad-0.9.43-This-patch-fixes-a-warning-issued-when-building-the-.patch new file mode 100644 index 0000000..ed5d891 --- /dev/null +++ b/lldpad-0.9.43-This-patch-fixes-a-warning-issued-when-building-the-.patch @@ -0,0 +1,33 @@ +From 106310e4027e8cd86305d9948a2cf0f537d0781f Mon Sep 17 00:00:00 2001 +From: Jens Osterkamp +Date: Tue, 9 Aug 2011 21:41:35 -0700 +Subject: [PATCH 21/29] This patch fixes a warning issued when building the + lexer generated file parse_cli.c: +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +parse_cli.c:2147: warning: ‘input’ defined but not used + +Signed-off-by: Jens Osterkamp +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + parse_cli.l | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/parse_cli.l b/parse_cli.l +index fd481bb..53dd83a 100644 +--- a/parse_cli.l ++++ b/parse_cli.l +@@ -25,6 +25,7 @@ + *******************************************************************************/ + + %option nounput ++%option noinput + + %{ + #include +-- +1.7.6 + diff --git a/lldpad-0.9.43-add-man-page-for-EVB-TLV.patch b/lldpad-0.9.43-add-man-page-for-EVB-TLV.patch new file mode 100644 index 0000000..0b10a99 --- /dev/null +++ b/lldpad-0.9.43-add-man-page-for-EVB-TLV.patch @@ -0,0 +1,148 @@ +From 2b2b5b038f97ed111e0ae52af7bcec78636610f8 Mon Sep 17 00:00:00 2001 +From: Jens Osterkamp +Date: Tue, 12 Jul 2011 00:42:18 -0700 +Subject: [PATCH 01/29] add man page for EVB TLV + +This add a man page for the EVB TLV similar to the already existing ones. + +Signed-off-by: Jens Osterkamp +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + docs/lldptool-evb.8 | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 124 insertions(+), 0 deletions(-) + create mode 100644 docs/lldptool-evb.8 + +diff --git a/docs/lldptool-evb.8 b/docs/lldptool-evb.8 +new file mode 100644 +index 0000000..f62dce2 +--- /dev/null ++++ b/docs/lldptool-evb.8 +@@ -0,0 +1,124 @@ ++.TH lldptool 8 "February 2010" "open-lldp" "Linux" ++.SH NAME ++evb \- Show / manipulate EVB TLV configuration ++.SH SYNOPSIS ++.B lldptool -t -i ethx -V evbCfg -c enableTx ++.sp ++.B lldptool -T -i ethx -V evbCfg -c enableTx=[yes|no] ++.sp ++.B lldptool -t -i ethx -V evbCfg -c fmode ++.sp ++.B lldptool -T -i ethx -V evbCfg -c fmode=[bridge|reflectiverelay] ++.sp ++.B lldptool -t -i ethx -V evbCfg -c capabilities ++.sp ++.B lldptool -T -i ethx -V evbCfg -c capabilities=[rte|ecp|vdp|none] ++.sp ++.B lldptool -t -i ethx -V evbCfg -c rte ++.sp ++.B lldptool -T -i ethx -V evbCfg -c rte=[] ++.sp ++.B lldptool -t -i ethx -V evbCfg -c vsis ++.sp ++.B lldptool -T -i ethx -V evbCfg -c vsis=[] ++.sp ++.SH DESCRIPTION ++The EVB TLV is a TLV to announce the station and bridge's edge virtual ++bridging (evb) capabilities and request the bridge forwarding mode. If both ++sides have agree on edge control protocol (ECP), VSI discovery protocol (VDP) ++capabilities, both sides can exchange VDP TLV using ECP frames. ++The vsis parameter will set the maximum number of VSIs and show the number ++of currently configured VSIs. ++ ++.SH ARGUMENTS ++.TP ++.B enableTx ++Enables the EVB TLV to be transmitted ++.TP ++.B fmode ++shows or sets the forwarding mode between bridge (default) or ++reflectiverelay (RR). ++.TP ++.B capabilities ++shows or sets the local capabilities that are announced to the adjacent ++switch in the TLV. This parameter will accept any combination of rte, vdp or ++ecp, separated by ",". Use the keyword "none" if you do not want to set any ++capabilities. ++.TP ++.B rte ++shows or set the local run time exponent (RTE). The RTE will be used as the ++base for the timing of the ECP and VDP protocols. ++.TP ++.B vsis ++shows or sets the number of virtual station interfaces (VSIs) that are ++announced to the adjacent switch in the TLV. This parameter expects a number ++between 0 and 65535. ++ ++.SH Theory of Operation ++The EVB TLV is used to announce and exchange supported parameters between ++the station and an adjacent switch. ++ ++If "reflectiverelay" is set as forwarding mode, the switch will allow ++"reflection" of frames coming from different sources at the same port back ++to the port. This will allow communication between virtual machines on the ++same host via the switch. ++ ++The capabilities parameter is used to set RTE, ECP and VDP support. VDP TLVs ++in ECP frames can only be exchanged if both sides agree on ECP and VDP as ++capabilities. RTE will be used as the base timing parameter for ECP and VDP. ++ ++.SH EXAMPLE & USAGE ++.TP ++Display locally configured values for \fIeth8\fR ++.B lldptool -t -i eth8 -V evbCfg ++.TP ++Display remotely configured values for \fIeth8\fR ++.B lldptool -n -t -i eth8 -V evbCfg ++.TP ++Display wether evb tlv is configured for tx on \fIeth8\fR ++.B lldptool -t -i eth8 -V evbCfg -c enableTx ++.TP ++Display the currently requested forwarding mode for \fIeth8\fR ++.B lldptool -t -i eth8 -V evbCfg -c fmode ++.TP ++Set the forwarding mode to reflective relay ++.B lldptool -T -i eth8 -V evbCfg -c fmode=reflectiverelay ++.TP ++Display the currently configured capabilities ++.B lldptool -t -i ethx -V evbCfg -c capabilities ++.TP ++Set the locally possible capabilities to RTE, ECP and VDP ++.B lldptool -T -i ethx -V evbCfg -c capabilities=rte,ecp,vdp ++.TP ++Resets the locally possible capabilities to "none" ++.B lldptool -T -i ethx -V evbCfg -c capabilities=none ++.TP ++Display the locally configured value for RTE ++.B lldptool -t -i ethx -V evbCfg -c rte ++.TP ++Set the value for RTE ++.B lldptool -T -i ethx -V evbCfg -c rte=[] ++.TP ++Display the configured maximum number of VSIs ++.B lldptool -t -i ethx -V evbCfg -c vsis ++.TP ++Set the maximum number of VSIs ++.B lldptool -T -i ethx -V evbCfg -c vsis=[] ++.sp ++ ++.SH SOURCE ++.TP ++o ++IEEE 802.1Qbg (http://www.ieee802.org/1/pages/802.1bg.html) ++ ++.SH NOTES ++Currently the code in lldpad reflects draft 0 of the upcoming standard. EVB ++TLVs on the wire can be decoded with wireshark > v1.6. ++ ++.SH SEE ALSO ++.BR lldptool-vdp (8), ++.BR lldptool (8), ++.BR lldpad (8) ++ ++.SH AUTHOR ++Jens Osterkamp +-- +1.7.6 + diff --git a/lldpad-0.9.43-add-man-page-for-VDP.patch b/lldpad-0.9.43-add-man-page-for-VDP.patch new file mode 100644 index 0000000..0fddf18 --- /dev/null +++ b/lldpad-0.9.43-add-man-page-for-VDP.patch @@ -0,0 +1,124 @@ +From 708db0bc2ca085cf25f1421b6d7258a6132abb9b Mon Sep 17 00:00:00 2001 +From: Jens Osterkamp +Date: Tue, 12 Jul 2011 00:54:50 -0700 +Subject: [PATCH 02/29] add man page for VDP + +This adds a man page for the VDP similar to the already +existing ones. + +Signed-off-by: Jens Osterkamp +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + docs/lldptool-vdp.8 | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 99 insertions(+), 0 deletions(-) + create mode 100644 docs/lldptool-vdp.8 + +diff --git a/docs/lldptool-vdp.8 b/docs/lldptool-vdp.8 +new file mode 100644 +index 0000000..6b254ad +--- /dev/null ++++ b/docs/lldptool-vdp.8 +@@ -0,0 +1,99 @@ ++.TH lldptool 8 "February 2010" "open-lldp" "Linux" ++.SH NAME ++vdp \- Show / manipulate VDP TLV configuration ++.SH SYNOPSIS ++.B lldptool -t -i ethx -V vdp -c enableTx ++.sp ++.B lldptool -T -i ethx -V vdp -c enableTx=[yes|no] ++.sp ++.B lldptool -t -i ethx -V vdp -c mode ++.sp ++.B lldptool -T -i ethx -V vdp -c mode=,,,,,, ++.sp ++.B lldptool -t -i ethx -V vdp -c role ++.sp ++.B lldptool -T -i ethx -V vdp -c role=[station|bridge] ++.sp ++.SH DESCRIPTION ++The VSI discovery protocol (VDP) is \fINOT\fR a TLV in the LLDP sense but ++rather a protocol to manage the association and deassociation of virtual ++station interfaces (VSIs) between the station and an adjacent switch. VDP ++uses ECP as transport for VDP TLVs. An ECP frame may contain multiple VDP ++TLVs. Each VDP TLVs contains a mode, typeid, version, instanceid, mac and ++vlan for a VSI. ++ ++.SH ARGUMENTS ++.TP ++.B enableTx ++Enables or disables VDP ++.TP ++.B mode ++shows or sets modes for VSIs with the following parameters: ++.RS ++.IP ++mode (0=preassociate, 1=preassociate with RR, 2=associate, 3=deassociate) ++.IP ++manager (database) id ++.IP ++VSI type id ++.IP ++VSI type id version ++.IP ++VSI instance id ++.IP ++VSI mac address ++.IP ++VSI vlan id ++.RE ++ ++.TP ++.B role ++shows or sets the role of the local machine to act as either station ++(default) or bridge. ++ ++.SH Theory of Operation ++The VDP protocol is used to pre-associate, associate or deassociate VSIs to ++and adjacent switch. Information about the VSIs is formatted into VDP TLVs ++which are then handed to ECP for lower-level transport. Each ECP frame may ++contain multiple VDP TLVs. ++ ++Two ways to receive VSI information exist in llpdad: via netlink or with ++lldptool. netlink is used by libvirt to communicate VSIs to lldpad. lldptool ++can be used to associate/deassociate VSIs from the command line. This is ++especially helpful for testing purposes. ++ ++.SH EXAMPLE & USAGE ++.TP ++Display if vdp is enabled on \fIeth8\fR ++.B lldptool -t -i eth8 -V vdp -c enableTx ++.TP ++Enable vdp on \fIeth8\fR ++.B lldptool -T -i eth8 -V vdp -c enableTx=yes ++.TP ++Display the currently configured VSIs for \fIeth8\fR ++.B lldptool -t -i eth8 -V vdp -c mode ++.TP ++Associate a VSI on \fIeth8\fR ++.B lldptool -T -i eth8 -V vdp -c mode=2,12,1193046,1,fa9b7fff-b0a0-4893-8e0e-beef4ff18f8f,52:54:00:C7:3E:CE,3 ++.TP ++Display the locally configured role for VDP on \fIeth8\fR ++.B lldptool -t -i eth8 -V vdp -c role ++.TP ++Set the local role for VDP on \fIeth8\fR ++.B lldptool -T -i eth8 -V vdp -c role=bridge ++ ++.SH SOURCE ++.TP ++o ++IEEE 802.1Qbg (http://www.ieee802.org/1/pages/802.1bg.html) ++ ++.SH NOTES ++Currently the code in lldpad reflects draft 0 of the upcoming standard. ++ ++.SH SEE ALSO ++.BR lldptool-evb (8), ++.BR lldptool (8), ++.BR lldpad (8) ++ ++.SH AUTHOR ++Jens Osterkamp +-- +1.7.6 + diff --git a/lldpad-0.9.43-add-some-files-in-include-linux-to-inst_SOURCES.patch b/lldpad-0.9.43-add-some-files-in-include-linux-to-inst_SOURCES.patch new file mode 100644 index 0000000..e474e8f --- /dev/null +++ b/lldpad-0.9.43-add-some-files-in-include-linux-to-inst_SOURCES.patch @@ -0,0 +1,32 @@ +From 594f95bfb30ff0dbdd0d6402a67ac4717ef574ac Mon Sep 17 00:00:00 2001 +From: Jens Osterkamp +Date: Tue, 12 Jul 2011 01:02:17 -0700 +Subject: [PATCH 03/29] add some files in include/linux/ to inst_SOURCES + +Add some files in include/linux/ to inst_SOURCES in Makefile.am to avoid rpm +build problems later. + +Signed-off-by: Jens Osterkamp +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + Makefile.am | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index cb192fa..30284e6 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -21,7 +21,8 @@ include/lldpad.h include/lldp_mand_cmds.h \ + include/clif_msgs.h include/lldp_basman_cmds.h include/lldp_8023_cmds.h \ + include/lldp_med_cmds.h include/lldp_util.h \ + include/lldp_evb_cmds.h include/lldp_vdp_cmds.h include/lldp_8021qaz_cmds.h \ +-include/clif_sock.h ++include/clif_sock.h include/linux/dcbnl.h \ ++include/linux/netlink.h include/linux/rtnetlink.h + + noinst_HEADERS = include/config.h include/ctrl_iface.h \ + include/dcb_driver_interface.h \ +-- +1.7.6 + diff --git a/lldpad-0.9.43-bugfix-go-to-VSI_EXIT-immediately-on-neg-response.patch b/lldpad-0.9.43-bugfix-go-to-VSI_EXIT-immediately-on-neg-response.patch new file mode 100644 index 0000000..aa5924e --- /dev/null +++ b/lldpad-0.9.43-bugfix-go-to-VSI_EXIT-immediately-on-neg-response.patch @@ -0,0 +1,33 @@ +From 08e34a83dd1415f2b4127665639011975ce91465 Mon Sep 17 00:00:00 2001 +From: Jens Osterkamp +Date: Mon, 15 Aug 2011 18:17:29 -0700 +Subject: [PATCH 28/29] bugfix: go to VSI_EXIT immediately on neg response + +If a vsi_profile receives a negative response while in ASSOCIATED state, +it has to go to VSI_EXIT immediately to avoid sitting in DEASSOC_PROCESSING +before timing out. + +Signed-off-by: Jens Osterkamp +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + lldp_vdp.c | 3 +-- + 1 files changed, 1 insertions(+), 2 deletions(-) + +diff --git a/lldp_vdp.c b/lldp_vdp.c +index 15fed51..646105a 100644 +--- a/lldp_vdp.c ++++ b/lldp_vdp.c +@@ -573,8 +573,7 @@ static bool vdp_vsi_set_station_state(struct vsi_profile *profile) + vdp_vsi_change_station_state(profile, VSI_DEASSOC_PROCESSING); + return true; + } else if (vdp_vsi_negative_response(profile)) { +- vdp_vsi_change_station_state(profile, VSI_DEASSOC_PROCESSING); +- vdp_somethingChangedLocal(profile, true); ++ vdp_vsi_change_station_state(profile, VSI_EXIT); + return true; + } else if (vdp_keepaliveTimer_expired(profile)) { + vdp_stop_keepaliveTimer(profile); +-- +1.7.6 + diff --git a/lldpad-0.9.43-bugfix-to-print-all-profiles.patch b/lldpad-0.9.43-bugfix-to-print-all-profiles.patch new file mode 100644 index 0000000..307ae82 --- /dev/null +++ b/lldpad-0.9.43-bugfix-to-print-all-profiles.patch @@ -0,0 +1,111 @@ +From 2c9ec8e6d4e7240e9a6ccc8fce7572f78752db6f Mon Sep 17 00:00:00 2001 +From: Jens Osterkamp +Date: Mon, 15 Aug 2011 18:16:42 -0700 +Subject: [PATCH 26/29] bugfix to print all profiles + +In an earlier patch a bug had been introduced which prevented all profiles +from being printed into the assigned buffer. Instead, only the last profile +for an interface would be printed in there and shown with lldptool. + +Signed-off-by: Jens Osterkamp +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + lldp_vdp_cmds.c | 25 +++++++++++++------------ + 1 files changed, 13 insertions(+), 12 deletions(-) + +diff --git a/lldp_vdp_cmds.c b/lldp_vdp_cmds.c +index 8660f98..8cc871f 100644 +--- a/lldp_vdp_cmds.c ++++ b/lldp_vdp_cmds.c +@@ -84,43 +84,44 @@ static char *check_and_update(size_t *total, size_t *length, char *s, int c) + return s + c; + } + +-static void print_profile(char *s, size_t length, struct vsi_profile *p) ++static char * print_profile(char *s, size_t length, struct vsi_profile *p) + { + int c; + size_t total = 0; ++ char *r = s; + + c = snprintf(s, length, "\nmode: %i (%s)\n", + p->mode, vsi_modes[p->mode]); + s = check_and_update(&total, &length, s, c); + if (!s) +- return; ++ return r; + + c = snprintf(s, length, "response: %i (%s)\n", p->response, + vsi_responses[p->response]); + s = check_and_update(&total, &length, s, c); + if (!s) +- return; ++ return r; + + c = snprintf(s, length, "state: %i (%s)\n", + p->state, vsi_states[p->state]); + s = check_and_update(&total, &length, s, c); + if (!s) +- return; ++ return r; + + c = snprintf(s, length, "mgrid: %i\n", p->mgrid); + s = check_and_update(&total, &length, s, c); + if (!s) +- return; ++ return r; + + c = snprintf(s, length, "id: %i (0x%x)\n", p->id, p->id); + s = check_and_update(&total, &length, s, c); + if (!s) +- return; ++ return r; + + c = snprintf(s, length, "version: %i\n", p->version); + s = check_and_update(&total, &length, s, c); + if (!s) +- return; ++ return r; + + { + char instance[INSTANCE_STRLEN + 2]; +@@ -130,7 +131,7 @@ static void print_profile(char *s, size_t length, struct vsi_profile *p) + } + s = check_and_update(&total, &length, s, c); + if (!s) +- return; ++ return r; + + { + char macbuf[MAC_ADDR_STRLEN + 1]; +@@ -140,14 +141,14 @@ static void print_profile(char *s, size_t length, struct vsi_profile *p) + } + s = check_and_update(&total, &length, s, c); + if (!s) +- return; ++ return r; + + c = snprintf(s, length, "vlan: %i\n\n", p->vlan); + s = check_and_update(&total, &length, s, c); + if (!s) +- return; ++ return r; + +- return; ++ return s; + } + + static int get_arg_tlvtxenable(struct cmd *cmd, char *arg, char *argvalue, +@@ -271,7 +272,7 @@ static int get_arg_mode(struct cmd *cmd, char *arg, char *argvalue, + memset(s, 0, (count+1)*VDP_BUF_SIZE); + + LIST_FOREACH(np, &vd->profile_head, profile) { +- print_profile(t, (count + 1) * VDP_BUF_SIZE, np); ++ t = print_profile(t, (count + 1) * VDP_BUF_SIZE, np); + } + + snprintf(obuf, obuf_len, "%02x%s%04x%s", +-- +1.7.6 + diff --git a/lldpad-0.9.43-dcbtool-return-different-error-codes-for-invalid-dev.patch b/lldpad-0.9.43-dcbtool-return-different-error-codes-for-invalid-dev.patch new file mode 100644 index 0000000..f032523 --- /dev/null +++ b/lldpad-0.9.43-dcbtool-return-different-error-codes-for-invalid-dev.patch @@ -0,0 +1,51 @@ +From dcb32bd003d89158b5b82296116690d57ca0338d Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:05:24 -0700 +Subject: [PATCH 11/29] dcbtool: return different error codes for invalid + device and IEEE + +dcbtool currently returns the same error code for an invalid +device name and a device in IEEE mode. This results in +the tool printing an output that gives an error about IEEE +mode in both cases. + +This patch separates the two cases and additionally allows +sets and gets to occur. Oper mode calls should still fail +device in IEEE mode errors. This is more inline with the +current lldptool behavior and supports users configuring +CEE mode before switching DCBX mode. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + lldp_dcbx_cmds.c | 11 +++++------ + 1 files changed, 5 insertions(+), 6 deletions(-) + +diff --git a/lldp_dcbx_cmds.c b/lldp_dcbx_cmds.c +index bbfbcf6..7799557 100644 +--- a/lldp_dcbx_cmds.c ++++ b/lldp_dcbx_cmds.c +@@ -533,15 +533,14 @@ int dcbx_clif_cmd(void *data, + if (!port) + return dcb_device_not_found; + +- /* DCBTOOL is not applicable in IEEE-DCBX modes */ + dcbx = dcbx_data(port->ifname); +- if (!dcbx || dcbx->active == 0) +- return cmd_not_applicable; +- +- /* check that DCB features is supported and in DCB state */ +- if (feature != FEATURE_DCB && check_port_dcb_mode(port_id) == false) ++ if (!dcbx) + return dcb_device_not_found; + ++ /* OPER and PEER cmd not applicable while in IEEE-DCBX modes */ ++ if (dcbx->active == 0 && (cmd == CMD_GET_PEER || cmd == CMD_GET_OPER)) ++ return cmd_not_applicable; ++ + switch(feature) { + case FEATURE_DCB: + if (cmd == CMD_SET_CONFIG) +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldapd-802.1Qaz-add-output-buffer-response-to-set-pf.patch b/lldpad-0.9.43-lldapd-802.1Qaz-add-output-buffer-response-to-set-pf.patch new file mode 100644 index 0000000..1d87681 --- /dev/null +++ b/lldpad-0.9.43-lldapd-802.1Qaz-add-output-buffer-response-to-set-pf.patch @@ -0,0 +1,56 @@ +From 63d97a836870bf106488efccee29d9f0ed606389 Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:08:10 -0700 +Subject: [PATCH 18/29] lldapd: 802.1Qaz, add output buffer response to set + pfc + +All other 802.1Qaz set commands report set values except +pfc enabled. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + lldp_8021qaz_cmds.c | 20 +++++++++++++++++++- + 1 files changed, 19 insertions(+), 1 deletions(-) + +diff --git a/lldp_8021qaz_cmds.c b/lldp_8021qaz_cmds.c +index 4dd8042..04556c2 100644 +--- a/lldp_8021qaz_cmds.c ++++ b/lldp_8021qaz_cmds.c +@@ -780,7 +780,8 @@ static int _set_arg_enabled(struct cmd *cmd, char *args, + char *priority, *parse; + char arg_path[256]; + long mask = 0; +- int err = cmd_success; ++ bool first; ++ int i, err = cmd_success; + + if (cmd->cmd != cmd_settlv) + return cmd_invalid; +@@ -823,6 +824,23 @@ static int _set_arg_enabled(struct cmd *cmd, char *args, + return cmd_success; + } + ++ first = true; ++ strncat(obuf, "prio = ", obuf_len - strlen(obuf) - 1); ++ for (i = 0; i < 8; i++) { ++ if (mask & (1 << i)) { ++ char val[3]; ++ ++ if (first) { ++ snprintf(val, sizeof(val), "%i", i); ++ first = false; ++ } else { ++ snprintf(val, sizeof(val), ",%i", i); ++ } ++ strncat(obuf, val, obuf_len - strlen(obuf) - 1); ++ } ++ } ++ strncat(obuf, "\n", obuf_len - strlen(obuf) - 1); ++ + /* Set configuration */ + snprintf(arg_path, sizeof(arg_path), + "%s%08x.%s", TLVID_PREFIX, cmd->tlvid, args); +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-802.1Qaz-PFC-TLV-incorrectly-sets-willing-cap.patch b/lldpad-0.9.43-lldpad-802.1Qaz-PFC-TLV-incorrectly-sets-willing-cap.patch new file mode 100644 index 0000000..a954ee8 --- /dev/null +++ b/lldpad-0.9.43-lldpad-802.1Qaz-PFC-TLV-incorrectly-sets-willing-cap.patch @@ -0,0 +1,46 @@ +From b62545fac8f28c63460e4e932a526280884d0200 Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Tue, 12 Jul 2011 09:21:21 -0700 +Subject: [PATCH 05/29] lldpad: 802.1Qaz PFC TLV incorrectly sets willing, + cap, and mac bits + +The willing, capabilities and MACSec enabled bits are incorrectly +set to peer's value in the PFC TLV. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + lldp_8021qaz.c | 15 ++++++--------- + 1 files changed, 6 insertions(+), 9 deletions(-) + +diff --git a/lldp_8021qaz.c b/lldp_8021qaz.c +index c146d4a..adeb0eb 100644 +--- a/lldp_8021qaz.c ++++ b/lldp_8021qaz.c +@@ -1192,17 +1192,14 @@ bld_ieee8021qaz_pfc_tlv(struct ieee8021qaz_tlvs *tlvs) + hton24(pfc->oui, OUI_IEEE_8021); + pfc->subtype = LLDP_8021QAZ_PFC; + +- if (tlvs->pfc->current_state == INIT) { +- pfc->wmrc = tlvs->pfc->local.willing << 7 | +- tlvs->pfc->local.mbc << 6 | +- tlvs->pfc->local.pfc_cap; ++ pfc->wmrc = tlvs->pfc->local.willing << 7 | ++ tlvs->pfc->local.mbc << 6 | ++ tlvs->pfc->local.pfc_cap; ++ ++ if (tlvs->pfc->current_state == INIT) + pfc->pfc_enable = tlvs->pfc->local.pfc_enable; +- } else { +- pfc->wmrc = tlvs->pfc->remote.willing << 7 | +- tlvs->pfc->remote.mbc << 6 | +- tlvs->pfc->remote.pfc_cap; ++ else + pfc->pfc_enable = tlvs->pfc->remote.pfc_enable; +- } + + tlv->type = ORG_SPECIFIC_TLV; + tlv->length = sizeof(struct ieee8021qaz_tlv_pfc); +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-802.1Qaz-make-ETS-CFG-willing-yes-no-values-v.patch b/lldpad-0.9.43-lldpad-802.1Qaz-make-ETS-CFG-willing-yes-no-values-v.patch new file mode 100644 index 0000000..02838dd --- /dev/null +++ b/lldpad-0.9.43-lldpad-802.1Qaz-make-ETS-CFG-willing-yes-no-values-v.patch @@ -0,0 +1,97 @@ +From b2050baf30c4c1a9e6aa4142a340dd9e9f5b0d1b Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:07:11 -0700 +Subject: [PATCH 12/29] lldpad: 802.1Qaz, make ETS-CFG willing {yes|no} values + valid + +Currently, the willing option to ETS-CFG takes a 0 or 1 value +while all other attributes use "yes" or "no". + +So make ETS-CFG willing follow the trend and use "yes" or "no" +as well. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + docs/lldptool-ets.8 | 4 ++-- + lldp_8021qaz_cmds.c | 28 ++++++++++++++++++++++++++-- + 2 files changed, 28 insertions(+), 4 deletions(-) + +diff --git a/docs/lldptool-ets.8 b/docs/lldptool-ets.8 +index 2b76b9c..16fdba9 100644 +--- a/docs/lldptool-ets.8 ++++ b/docs/lldptool-ets.8 +@@ -19,7 +19,7 @@ ETS-{CFG|REC} \- Show / manipulate ETS TLV configuration + .sp + .BR enableTx " = " {yes|no} " | " + .sp +-.BR willing " = " {0|1} " | " ++.BR willing " = " {yes|no} " | " + .sp + .BR tsa " = " tc:{ets|strict|vendor},... " | " + .sp +@@ -107,7 +107,7 @@ have support for specific protocols ie Fiber Channel over Ethernet (FCoE). + .SH EXAMPLE & USAGE + .TP + Configure willing bit for interface \fIeth2\fR +-.B lldptool -T -i eth2 -V ETS-CFG willing=1 ++.B lldptool -T -i eth2 -V ETS-CFG willing=yes + .TP + Configure traffic classes for ETS and strict priority on \fIeth2\fR + .B lldptool -T -i eth2 -V ETS-CFG tsa=0:ets,1:ets,2:ets,3:ets,4:strict,5:strict +diff --git a/lldp_8021qaz_cmds.c b/lldp_8021qaz_cmds.c +index 1ee733e..4dd8042 100644 +--- a/lldp_8021qaz_cmds.c ++++ b/lldp_8021qaz_cmds.c +@@ -142,7 +142,7 @@ static int get_arg_willing(struct cmd *cmd, char *args, + static int _set_arg_willing(struct cmd *cmd, char *args, + char *arg_value, char *obuf, int obuf_len, bool test) + { +- long willing = strtol(arg_value, NULL, 10); ++ long willing; + struct ieee8021qaz_tlvs *tlvs; + char arg_path[256]; + +@@ -153,6 +153,29 @@ static int _set_arg_willing(struct cmd *cmd, char *args, + if (!tlvs) + return cmd_device_not_found; + ++ ++ ++ /* To remain backward compatible and make it easier ++ * for everyone use to {0|1} notation we still support ++ * this but also support english variants as well ++ */ ++ if (!strcasecmp(arg_value, VAL_YES)) ++ willing = 1; ++ else if (!strcasecmp(arg_value, VAL_NO)) ++ willing = 0; ++ else { ++ char *end; ++ ++ errno = 0; ++ willing = strtol(arg_value, &end, 10); ++ ++ if (end == arg_value || *end != '\0') ++ return cmd_invalid; ++ ++ if (errno || willing < 0) ++ return cmd_invalid; ++ } ++ + switch (cmd->tlvid) { + case (OUI_IEEE_8021 << 8) | LLDP_8021QAZ_ETSCFG: + if (!test) +@@ -171,7 +194,8 @@ static int _set_arg_willing(struct cmd *cmd, char *args, + if (test) + return cmd_success; + +- snprintf(obuf, obuf_len, "willing = %i\n", !!willing); ++ snprintf(obuf, obuf_len, "willing = %s\n", ++ !!willing ? VAL_YES : VAL_NO); + + snprintf(arg_path, sizeof(arg_path), "%s%08x.%s", TLVID_PREFIX, + cmd->tlvid, args); +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-802.1Qaz-resolve-incorrect-tcbw-memcpy.patch b/lldpad-0.9.43-lldpad-802.1Qaz-resolve-incorrect-tcbw-memcpy.patch new file mode 100644 index 0000000..d9266c4 --- /dev/null +++ b/lldpad-0.9.43-lldpad-802.1Qaz-resolve-incorrect-tcbw-memcpy.patch @@ -0,0 +1,33 @@ +From 5002608af85c5efe92005f839d7417ee5c0a7cf9 Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:05:19 -0700 +Subject: [PATCH 10/29] lldpad: 802.1Qaz resolve incorrect tcbw memcpy + +The tcbw attributes were not being correctly configured on +32bit archs because of incorrect sizeof() usage in argument +handlers. x86_64 happened to work by chance. + +This patch resolves the issue. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + lldp_8021qaz_cmds.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/lldp_8021qaz_cmds.c b/lldp_8021qaz_cmds.c +index 7ddb22b..1ee733e 100644 +--- a/lldp_8021qaz_cmds.c ++++ b/lldp_8021qaz_cmds.c +@@ -471,7 +471,7 @@ static int _set_arg_tcbw(struct cmd *cmd, char *args, + free(parse); + return cmd_success; + } else { +- memcpy(tcbw, percent, sizeof(tcbw)); ++ memcpy(tcbw, percent, sizeof(*tcbw) * MAX_TCS); + } + + strncat(obuf, "tcbw = ", obuf_len - strlen(obuf) - 1); +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-Add-EVB-and-VDP-man-pages-to-install-path.patch b/lldpad-0.9.43-lldpad-Add-EVB-and-VDP-man-pages-to-install-path.patch new file mode 100644 index 0000000..2a23b11 --- /dev/null +++ b/lldpad-0.9.43-lldpad-Add-EVB-and-VDP-man-pages-to-install-path.patch @@ -0,0 +1,30 @@ +From 217a30cffb9041831f0a9ea92916bea4439d2f92 Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Tue, 12 Jul 2011 01:07:30 -0700 +Subject: [PATCH 04/29] lldpad: Add EVB and VDP man pages to install path + +EVB and VDP man pages need to be added to Makefile.am install. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + Makefile.am | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index 30284e6..4bf9566 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -68,7 +68,8 @@ nltest_SOURCES = nltest.c nltest.h + + ## man pages + dist_man_MANS = docs/lldpad.8 docs/dcbtool.8 docs/lldptool.8 \ +- docs/lldptool-ets.8 docs/lldptool-pfc.8 docs/lldptool-app.8 ++ docs/lldptool-ets.8 docs/lldptool-pfc.8 docs/lldptool-app.8 \ ++ docs/lldptool-evb.8 docs/lldptool-vdp.8 + + ## force the creation of an empty configuration directory at install time + lldpadconfigdir = /var/lib/lldpad +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-Add-ports-even-w-out-link-at-init-time.patch b/lldpad-0.9.43-lldpad-Add-ports-even-w-out-link-at-init-time.patch new file mode 100644 index 0000000..7a81f44 --- /dev/null +++ b/lldpad-0.9.43-lldpad-Add-ports-even-w-out-link-at-init-time.patch @@ -0,0 +1,44 @@ +From 215fa56eb62adcf5cfd757c2f226c58de3f07180 Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:03:33 -0700 +Subject: [PATCH 06/29] lldpad: Add ports even w/out link at init time + +It may be helpful to configure devices even before the device +has link. To facilitate this add ports to port list regardless +of link status. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + config.c | 12 +++++++----- + 1 files changed, 7 insertions(+), 5 deletions(-) + +diff --git a/config.c b/config.c +index 4d42581..a8ebe17 100644 +--- a/config.c ++++ b/config.c +@@ -358,14 +358,16 @@ void init_ports(void) + ; + } else if (is_bridge(p->if_name)) { + ; /* ignore bridge device */ +- } else if (check_link_status(p->if_name)) { ++ } else { + add_port(p->if_name); + +- LIST_FOREACH(np, &lldp_head, lldp) { +- if (np->ops->lldp_mod_ifup) +- np->ops->lldp_mod_ifup(p->if_name); ++ if (check_link_status(p->if_name)) { ++ LIST_FOREACH(np, &lldp_head, lldp) { ++ if (np->ops->lldp_mod_ifup) ++ np->ops->lldp_mod_ifup(p->if_name); ++ } ++ set_lldp_port_enable_state(p->if_name, 1); + } +- set_lldp_port_enable_state(p->if_name, 1); + } + p++; + } +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-Avoid-possible-resource-leak-in-get_bcn.patch b/lldpad-0.9.43-lldpad-Avoid-possible-resource-leak-in-get_bcn.patch new file mode 100644 index 0000000..d2d176e --- /dev/null +++ b/lldpad-0.9.43-lldpad-Avoid-possible-resource-leak-in-get_bcn.patch @@ -0,0 +1,33 @@ +From d56a0ea97410f341f8892204ca6cfad02519e8bf Mon Sep 17 00:00:00 2001 +From: Petr Sabata +Date: Mon, 15 Aug 2011 18:13:40 -0700 +Subject: [PATCH 22/29] lldpad: Avoid possible resource leak in get_bcn() + +Signed-off-by: Petr Sabata +Signed-off-by: John Fastabend +--- + nltest.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +diff --git a/nltest.c b/nltest.c +index 2ae2212..e350ca9 100644 +--- a/nltest.c ++++ b/nltest.c +@@ -781,12 +781,14 @@ static int get_bcn(char *ifname, bcn_cfg *bcn_data) + + if (d->cmd != DCB_CMD_BCN_GCFG) { + printf("Hmm, this is not the message we were expecting.\n"); ++ free(nlh); + return -EIO; + } + if (rta_parent->rta_type != DCB_ATTR_BCN) { + /* Do we really want to code up an attribute parser?? */ + printf("A full libnetlink (with rtnl and attribute support) " + "would sure be nice.\n"); ++ free(nlh); + return -EIO; + } + rta_child = NLA_DATA(rta_parent); +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-Do-not-enable-CEE-mode-if-explicitly-disabled.patch b/lldpad-0.9.43-lldpad-Do-not-enable-CEE-mode-if-explicitly-disabled.patch new file mode 100644 index 0000000..4d4905b --- /dev/null +++ b/lldpad-0.9.43-lldpad-Do-not-enable-CEE-mode-if-explicitly-disabled.patch @@ -0,0 +1,83 @@ +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 + diff --git a/lldpad-0.9.43-lldpad-ETS-add-another-example-to-man-page.patch b/lldpad-0.9.43-lldpad-ETS-add-another-example-to-man-page.patch new file mode 100644 index 0000000..e6a9959 --- /dev/null +++ b/lldpad-0.9.43-lldpad-ETS-add-another-example-to-man-page.patch @@ -0,0 +1,32 @@ +From 7b99aaad22128c4a2b66d7bc36697dca6eaae96d Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:08:15 -0700 +Subject: [PATCH 19/29] lldpad: ETS add another example to man page + +Add another example to ETS man page. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + docs/lldptool-ets.8 | 5 +++++ + 1 files changed, 5 insertions(+), 0 deletions(-) + +diff --git a/docs/lldptool-ets.8 b/docs/lldptool-ets.8 +index 16fdba9..7433a42 100644 +--- a/docs/lldptool-ets.8 ++++ b/docs/lldptool-ets.8 +@@ -120,6 +120,11 @@ Display local configured ETS-CFG parameters for tcbw + .TP + Display last transmitted ETS-CFG TLV + .B lldptool -t -i eth2 -V ETS-CFG ++.TP ++Configure ETS-CFG and ETS-REC for default DCB on \fIeth2\fR ++.B lldptool -T -i eth2 -V ETS-CFG tsa=0:ets,1:ets,2:ets,3:ets,4:ets,5:ets,6:ets,7:ets up2tc=0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7 tcbw=12,12,12,12,13,13,13,13 ++ ++.B lldptool -T -i eth2 -V ETS-REC tsa=0:ets,1:ets,2:ets,3:ets,4:ets,5:ets,6:ets,7:ets up2tc=0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7 tcbw=12,12,12,12,13,13,13,13 + + .SH SOURCE + .TP +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-Fix-error-path-in-save_dcbx_version.patch b/lldpad-0.9.43-lldpad-Fix-error-path-in-save_dcbx_version.patch new file mode 100644 index 0000000..3f36a18 --- /dev/null +++ b/lldpad-0.9.43-lldpad-Fix-error-path-in-save_dcbx_version.patch @@ -0,0 +1,46 @@ +From 411d6db2c59d4658088a20ae4fc21b04b28059c7 Mon Sep 17 00:00:00 2001 +From: Mark Rustad +Date: Mon, 15 Aug 2011 18:14:38 -0700 +Subject: [PATCH 25/29] lldpad: Fix error path in save_dcbx_version + +One error path would not return an error indication to the caller. +Fix that and eliminate the useless rval variable. + +Signed-off-by: Mark Rustad +Tested-by: Ross Brattain +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + lldp_dcbx_cfg.c | 8 +++----- + 1 files changed, 3 insertions(+), 5 deletions(-) + +diff --git a/lldp_dcbx_cfg.c b/lldp_dcbx_cfg.c +index 0477c54..7a447e3 100644 +--- a/lldp_dcbx_cfg.c ++++ b/lldp_dcbx_cfg.c +@@ -612,19 +612,17 @@ int save_dcb_enable_state(char *device_name, int dcb_enable) + + int save_dcbx_version(int dcbx_version) + { +- config_setting_t *dcbx_setting = NULL; +- config_setting_t *setting = NULL; +- int rval = dcb_success; ++ config_setting_t *dcbx_setting; ++ config_setting_t *setting; + + dcbx_setting = config_lookup(&lldpad_cfg, DCBX_SETTING); + if (!dcbx_setting) + return 1; + + setting = config_setting_get_member(dcbx_setting, "dcbx_version"); +- + if (!setting || !config_setting_set_int(setting, dcbx_version) || + !config_write_file(&lldpad_cfg, cfg_file_name)) +- rval = dcb_failed; ++ return 1; + + return 0; + } +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-Fix-logging-to-no-longer-use-message-IDs.patch b/lldpad-0.9.43-lldpad-Fix-logging-to-no-longer-use-message-IDs.patch new file mode 100644 index 0000000..dbc4aa0 --- /dev/null +++ b/lldpad-0.9.43-lldpad-Fix-logging-to-no-longer-use-message-IDs.patch @@ -0,0 +1,489 @@ +From a7542456c40a9943a92daf6c7b6fcbd520ed023e Mon Sep 17 00:00:00 2001 +From: Mark Rustad +Date: Mon, 15 Aug 2011 18:14:26 -0700 +Subject: [PATCH 24/29] lldpad: Fix logging to no longer use message IDs + +lldpad's logging was overloading the first parameter to the log_message +function as both a logging level and a message ID. There are really not +many message IDs in use, so resolve the conflict by using only log level. +This also adds a proper printf-attribute to the logging function so +that arguments can be checked and resolve those as well. A few messages +that were changed now have more useful content. + +Signed-off-by: Mark Rustad +Tested-by: Ross Brattain +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + ecp/ecp.c | 4 +- + ecp/ecp_rx.c | 12 ++-- + ecp/ecp_tx.c | 13 ++--- + include/messages.h | 30 +---------- + lldp/rx.c | 4 +- + lldp_evb.c | 8 +-- + lldp_mand.c | 4 +- + lldp_vdp.c | 24 ++++----- + lldpad.c | 6 +-- + log.c | 150 ++-------------------------------------------------- + 10 files changed, 38 insertions(+), 217 deletions(-) + +diff --git a/ecp/ecp.c b/ecp/ecp.c +index 7d9be89..638a8cb 100644 +--- a/ecp/ecp.c ++++ b/ecp/ecp.c +@@ -118,9 +118,9 @@ void ecp_ack_timeout_handler(void *eloop_data, void *user_ctx) + __func__, __LINE__, vd->ifname, vd->ecp.ackTimer); + ecp_tx_run_sm(vd); + } else { +- LLDPAD_DBG("%s(%i)-%s: BUG ! handler called but" ++ LLDPAD_DBG("%s-%s: BUG ! handler called but" + "vdp->ecp.ackTimer not expired (%i) !\n", +- __func__, __LINE__, vd->ecp.ackTimer); ++ __func__, vd->ifname, vd->ecp.ackTimer); + } + } + +diff --git a/ecp/ecp_rx.c b/ecp/ecp_rx.c +index 74e9f32..a56cd3b 100644 +--- a/ecp/ecp_rx.c ++++ b/ecp/ecp_rx.c +@@ -513,8 +513,8 @@ void ecp_rx_change_state(struct vdp_data *vd, u8 newstate) + assert(vd->ecp.rx.state == ECP_RX_RECEIVE_ECPDU); + break; + default: +- LLDPAD_ERR("ERROR: The ECP_RX State Machine is broken!\n"); +- log_message(MSG_ERR_RX_SM_INVALID, "%s", vd->ifname); ++ LLDPAD_ERR("%s: LLDP rx state machine setting invalid state %d\n", ++ vd->ifname, newstate); + } + + LLDPAD_DBG("%s(%i)-%s: state change %s -> %s\n", __func__, __LINE__, +@@ -585,8 +585,8 @@ bool ecp_set_rx_state(struct vdp_data *vd) + ecp_rx_change_state(vd, ECP_RX_RECEIVE_WAIT); + return false; + default: +- LLDPAD_ERR("ERROR: The ECP_RX State Machine is broken!\n"); +- log_message(MSG_ERR_RX_SM_INVALID, "%s", vd->ifname); ++ LLDPAD_ERR("%s: LLDP RX state machine in invalid state %d\n", ++ vd->ifname, vd->ecp.rx.state); + return false; + } + } +@@ -628,8 +628,8 @@ void ecp_rx_run_sm(struct vdp_data *vd) + } + break; + default: +- LLDPAD_ERR("ERROR: The ECP_RX State Machine is broken!\n"); +- log_message(MSG_ERR_TX_SM_INVALID, "%s", vd->ifname); ++ LLDPAD_ERR("%s: LLDP RX state machine in invalid state %d\n", ++ vd->ifname, vd->ecp.rx.state); + } + } while (ecp_set_rx_state(vd) == true); + +diff --git a/ecp/ecp_tx.c b/ecp/ecp_tx.c +index f9ee3d7..c81e101 100644 +--- a/ecp/ecp_tx.c ++++ b/ecp/ecp_tx.c +@@ -377,8 +377,8 @@ static void ecp_tx_change_state(struct vdp_data *vd, u8 newstate) + assert(vd->ecp.tx.state == ECP_TX_WAIT_FOR_ACK); + break; + default: +- LLDPAD_ERR("ERROR: The ECP_TX State Machine is broken!\n"); +- log_message(MSG_ERR_TX_SM_INVALID, "%s", vd->ifname); ++ LLDPAD_ERR("%s: LLDP TX state machine setting invalid state %d\n", ++ vd->ifname, newstate); + } + + LLDPAD_DBG("%s(%i)-%s: state change %s -> %s\n", __func__, __LINE__, +@@ -462,8 +462,8 @@ static bool ecp_set_tx_state(struct vdp_data *vd) + } + return false; + default: +- LLDPAD_ERR("ERROR: The TX State Machine is broken!\n"); +- log_message(MSG_ERR_TX_SM_INVALID, "%s", vd->ifname); ++ LLDPAD_ERR("%s: LLDP TX state machine in invalid state %d\n", ++ vd->ifname, vd->ecp.tx.state); + return false; + } + } +@@ -506,9 +506,8 @@ void ecp_tx_run_sm(struct vdp_data *vd) + vd->ifname, vd->ecp.lastSequence); + break; + default: +- LLDPAD_ERR("%s(%i): ERROR The TX State Machine is broken!\n", __func__, +- __LINE__); +- log_message(MSG_ERR_TX_SM_INVALID, "%s", vd->ifname); ++ LLDPAD_ERR("%s: LLDP TX state machine in invalid state %d\n", ++ vd->ifname, vd->ecp.tx.state); + } + } while (ecp_set_tx_state(vd) == true); + +diff --git a/include/messages.h b/include/messages.h +index 795a0df..2991d33 100644 +--- a/include/messages.h ++++ b/include/messages.h +@@ -29,37 +29,11 @@ + #include + #include + +-#define MSG_INFO_DEBUG_STRING 1 +- +-#define MSG_ERR_SERVICE_START_FAILURE 14 +-#define MSG_ERR_RESOURCE_MEMORY 15 +-#define MSG_ERR_ADD_CARD_FAILURE 16 +-#define MSG_ERR_DCB_INVALID_TX_TOTAL_BWG 17 +-#define MSG_ERR_DCB_INVALID_RX_TOTAL_BWG 18 +-#define MSG_ERR_DCB_INVALID_TX_BWG_IDX 19 +-#define MSG_ERR_DCB_INVALID_RX_BWG_IDX 20 +-#define MSG_ERR_DCB_INVALID_TX_LSP_NZERO_BW_TC 21 +-#define MSG_ERR_DCB_INVALID_RX_LSP_NZERO_BW_TC 22 +-#define MSG_ERR_DCB_TOO_MANY_LSP_PGIDS 23 +-#define MSG_ERR_DCB_INVALID_TX_ZERO_BW_TC 24 +-#define MSG_ERR_DCB_INVALID_RX_ZERO_BW_TC 25 +-#define MSG_ERR_DCB_INVALID_TX_LSP_NZERO_BWG 26 +-#define MSG_ERR_DCB_INVALID_RX_LSP_NZERO_BWG 27 +-#define MSG_ERR_DCB_INVALID_TX_BWG 28 +-#define MSG_ERR_DCB_INVALID_RX_BWG 29 +-#define MSG_ERR_TX_SM_INVALID 30 +-#define MSG_ERR_RX_SM_INVALID 31 +-#define MSG_ERR_DCB_INVALID_CONFIG_FILE 32 +- +-#define MSG_INFO_LLINK_DISABLED 37 +-#define MSG_INFO_LLINK_ENABLED 38 +-#define MSG_INFO_LLINK_OPER 39 +-#define MSG_ERR_LLINK_NONOPER 40 +- + extern bool daemonize; + extern int loglvl; + +-void log_message(__u32 dwMsgId, const char *pFormat, ...); ++void log_message(int loglvl, const char *pFormat, ...) ++ __attribute__((__format__(__printf__, 2, 3))); + + #define LLDPAD_ERR(...) log_message(LOG_ERR, __VA_ARGS__) + #define LLDPAD_WARN(...) log_message(LOG_WARNING, __VA_ARGS__) +diff --git a/lldp/rx.c b/lldp/rx.c +index bbb2e2f..3954808 100644 +--- a/lldp/rx.c ++++ b/lldp/rx.c +@@ -375,8 +375,8 @@ void rxProcessFrame(struct port * port) + } + + if (!tlv_stored) { +- LLDPAD_INFO("\nrxProcessFrame: allocated TLV (%lu) " +- " was not stored! (%p)\n", tlv->type, tlv); ++ LLDPAD_INFO("%s: allocated TLV %u was not stored! %p\n", ++ __func__, tlv->type, tlv); + tlv = free_unpkd_tlv(tlv); + port->stats.statsTLVsUnrecognizedTotal++; + } +diff --git a/lldp_evb.c b/lldp_evb.c +index fe43af5..3895d71 100644 +--- a/lldp_evb.c ++++ b/lldp_evb.c +@@ -648,17 +648,13 @@ struct lldp_module *evb_register(void) + + mod = malloc(sizeof(*mod)); + if (!mod) { +- LLDPAD_ERR("failed to malloc module data\n"); +- log_message(MSG_ERR_SERVICE_START_FAILURE, +- "%s", "failed to malloc module data"); ++ LLDPAD_ERR("lldpad failed to start - failed to malloc module data\n"); + goto out_err; + } + ud = malloc(sizeof(struct evb_user_data)); + if (!ud) { + free(mod); +- LLDPAD_ERR("failed to malloc module user data\n"); +- log_message(MSG_ERR_SERVICE_START_FAILURE, +- "%s", "failed to malloc module user data"); ++ LLDPAD_ERR("lldpad failed to start - failed to malloc module user data\n"); + goto out_err; + } + LIST_INIT(&ud->head); +diff --git a/lldp_mand.c b/lldp_mand.c +index b5e8092..1bc4358 100644 +--- a/lldp_mand.c ++++ b/lldp_mand.c +@@ -211,7 +211,7 @@ bld_config: + + /* if invalid subtype, fall back to build */ + if (!CHASSIS_ID_INVALID(chassis.sub)) { +- LLDPAD_DBG("%s:%s:from config %d bytes:str=%s\n", ++ LLDPAD_DBG("%s:%s:from config %zd bytes:str=%s\n", + __func__, md->ifname, length, chastr); + /* TODO: validate the loaded tlv */ + goto bld_tlv; +@@ -358,7 +358,7 @@ bld_config: + + /* if invalid subtype, fall back to build */ + if (!PORT_ID_INVALID(portid.sub)) { +- LLDPAD_DBG("%s:%s:from config %d bytes:str=%s\n", ++ LLDPAD_DBG("%s:%s:from config %zd bytes:str=%s\n", + __func__, md->ifname, length, porstr); + /* TODO: validate the loaded tlv */ + goto bld_tlv; +diff --git a/lldp_vdp.c b/lldp_vdp.c +index 2875bf5..5b8ce46 100644 +--- a/lldp_vdp.c ++++ b/lldp_vdp.c +@@ -596,8 +596,8 @@ static bool vdp_vsi_set_station_state(struct vsi_profile *profile) + case VSI_EXIT: + return false; + default: +- LLDPAD_ERR("ERROR: The VSI RX State Machine is broken!\n"); +- log_message(MSG_ERR_RX_SM_INVALID, ""); ++ LLDPAD_ERR("%s: VSI state machine in invalid state %d\n", ++ profile->port->ifname, profile->state); + return false; + } + } +@@ -668,8 +668,8 @@ void vdp_vsi_sm_station(struct vsi_profile *profile) + vdp_remove_profile(profile); + break; + default: +- LLDPAD_ERR("ERROR: The VSI RX station State Machine is broken!\n"); +- log_message(MSG_ERR_TX_SM_INVALID, ""); ++ LLDPAD_ERR("%s: VSI state machine in invalid state %d\n", ++ vd->ifname, profile->state); + } + } while (vdp_vsi_set_station_state(profile) == true); + +@@ -792,8 +792,8 @@ static bool vdp_vsi_set_bridge_state(struct vsi_profile *profile) + case VSI_EXIT: + return false; + default: +- LLDPAD_ERR("ERROR: The VSI RX State Machine (bridge) is broken!\n"); +- log_message(MSG_ERR_RX_SM_INVALID, ""); ++ LLDPAD_ERR("%s: VSI state machine (bridge) in invalid state %d\n", ++ profile->port->ifname, profile->state); + return false; + } + } +@@ -850,8 +850,8 @@ static void vdp_vsi_sm_bridge(struct vsi_profile *profile) + vdp_remove_profile(profile); + break; + default: +- LLDPAD_ERR("ERROR: The VSI RX bridge State Machine is broken!\n"); +- log_message(MSG_ERR_TX_SM_INVALID, ""); ++ LLDPAD_ERR("%s: VSI state machine in invalid state %d\n", ++ vd->ifname, profile->state); + } + } while (vdp_vsi_set_bridge_state(profile) == true); + +@@ -1454,17 +1454,13 @@ struct lldp_module *vdp_register(void) + + mod = malloc(sizeof(*mod)); + if (!mod) { +- LLDPAD_ERR("failed to malloc module data\n"); +- log_message(MSG_ERR_SERVICE_START_FAILURE, +- "%s", "failed to malloc module data"); ++ LLDPAD_ERR("lldpad failed to start - failed to malloc module data\n"); + goto out_err; + } + ud = malloc(sizeof(struct vdp_user_data)); + if (!ud) { + free(mod); +- LLDPAD_ERR("failed to malloc module user data\n"); +- log_message(MSG_ERR_SERVICE_START_FAILURE, +- "%s", "failed to malloc module user data"); ++ LLDPAD_ERR("lldpad failed to start - failed to malloc module user data\n"); + goto out_err; + } + LIST_INIT(&ud->head); +diff --git a/lldpad.c b/lldpad.c +index 6105985..a1a7ac1 100644 +--- a/lldpad.c ++++ b/lldpad.c +@@ -370,8 +370,7 @@ int main(int argc, char *argv[]) + * pid as netlink address. + */ + if (event_iface_init_user_space() < 0) { +- log_message(MSG_ERR_SERVICE_START_FAILURE, +- "%s", "failed to register user space event interface"); ++ LLDPAD_ERR("lldpad failed to start - failed to register user space event interface\n"); + exit(1); + } + +@@ -398,8 +397,7 @@ int main(int argc, char *argv[]) + if (ctrl_iface_register(clifd) < 0) { + if (!daemonize) + fprintf(stderr, "failed to register control interface\n"); +- log_message(MSG_ERR_SERVICE_START_FAILURE, +- "%s", "failed to register control interface"); ++ LLDPAD_ERR("lldpad failed to start - failed to register control interface\n"); + exit(1); + } + +diff --git a/log.c b/log.c +index e0aa3e5..57ac256 100644 +--- a/log.c ++++ b/log.c +@@ -27,160 +27,18 @@ + #include + #include + #include +-#include "dcb_protocol.h" + #include "messages.h" +-#include "lldpad.h" + +- +-void log_message(u32 msgid, const char *format, ...) ++void log_message(int level, const char *format, ...) + { +- int a, b; +- char fmt[256]; +- + va_list va, vb; + va_start(va, format); + va_copy(vb, va); + +- if (!daemonize && loglvl >= msgid) { ++ if (daemonize) ++ vsyslog(level, format, vb); ++ else if (loglvl >= level) + vprintf(format, vb); +- va_end(va); +- return; +- } else if (!daemonize) { +- va_end(va); +- return; +- } +- +- switch(msgid) { +- case MSG_INFO_DEBUG_STRING: +- vsyslog(LOG_DEBUG, format, vb); +- break; +- case MSG_ERR_SERVICE_START_FAILURE: +- snprintf(fmt, sizeof(fmt), "lldpad failed to start - %s", format); +- syslog(LOG_ERR, fmt, va_arg(va, char *)); +- break; +- case MSG_ERR_RESOURCE_MEMORY: +- break; +- case MSG_ERR_ADD_CARD_FAILURE: +- syslog(LOG_ERR, +- "failed to add interface %s", +- va_arg(va, char *)); +- break; +- case MSG_ERR_DCB_INVALID_TX_TOTAL_BWG: +- syslog(LOG_ERR, +- "invalid total priority group bandwidth for tx [%d%%]", +- va_arg(va, int)); +- break; +- case MSG_ERR_DCB_INVALID_RX_TOTAL_BWG: +- syslog(LOG_ERR, +- "invalid total priority group bandwidth for rx [%d%%]", +- va_arg(va, int)); +- break; +- case MSG_ERR_DCB_INVALID_TX_BWG_IDX: +- syslog(LOG_ERR, +- "invalid transmit priority group index [%d]", +- va_arg(va, int)); +- break; +- case MSG_ERR_DCB_INVALID_RX_BWG_IDX: +- syslog(LOG_ERR, +- "invalid receive priority group index [%d]", +- va_arg(va, int)); +- break; +- case MSG_ERR_DCB_INVALID_TX_LSP_NZERO_BW_TC: +- a = va_arg(va, int); +- b = va_arg(va, int); +- syslog(LOG_ERR, +- "transmit link strict user priority[%d] has non-zero " +- "bandwidth [%d%%]", a, b); +- break; +- case MSG_ERR_DCB_INVALID_RX_LSP_NZERO_BW_TC: +- a = va_arg(va, int); +- b = va_arg(va, int); +- syslog(LOG_ERR, +- "receive link strict user priority[%d] has non-zero " +- "bandwidth [%d%%]", a, b); +- break; +- case MSG_ERR_DCB_TOO_MANY_LSP_PGIDS: +- syslog(LOG_ERR, +- "only one link strict priority group is allowed [%d%%]", +- va_arg(va, int)); +- break; +- case MSG_ERR_DCB_INVALID_TX_ZERO_BW_TC: +- syslog(LOG_ERR, +- "transmit user priority[%d] has zero bandwidth", +- va_arg(va, int)); +- break; +- case MSG_ERR_DCB_INVALID_RX_ZERO_BW_TC: +- syslog(LOG_ERR, +- "receive user priority[%d] has zero bandwidth", +- va_arg(va, int)); +- break; +- case MSG_ERR_DCB_INVALID_TX_LSP_NZERO_BWG: +- a = va_arg(va, int); +- b = va_arg(va, int); +- syslog(LOG_ERR, +- "transmit link strict priority group [%d] has a " +- "non-zero bandwidth [%d%%]", a, b); +- break; +- case MSG_ERR_DCB_INVALID_RX_LSP_NZERO_BWG: +- a = va_arg(va, int); +- b = va_arg(va, int); +- syslog(LOG_ERR, +- "receive link strict priority group [%d] has a " +- "non-zero bandwidth [%d%%]", a, b); +- break; +- case MSG_ERR_DCB_INVALID_TX_BWG: +- a = va_arg(va, int); +- b = va_arg(va, int); +- syslog(LOG_ERR, +- "transmit priority group [%d] has invalid total " +- "bandwidth [%d%%], should be 0 or 100", a, b); +- break; +- case MSG_ERR_DCB_INVALID_RX_BWG: +- a = va_arg(va, int); +- b = va_arg(va, int); +- syslog(LOG_ERR, +- "receive priority group [%d] has invalid total " +- "bandwidth [%d%%], should be 0 or 100", a, b); +- break; +- case MSG_ERR_TX_SM_INVALID: +- syslog(LOG_ERR, +- "LLDP transmit state machine encountered an invalid " +- "state."); +- break; +- case MSG_ERR_RX_SM_INVALID: +- syslog(LOG_ERR, +- "LLDP receive state machine encountered an invalid " +- "state."); +- break; +- case MSG_ERR_DCB_INVALID_CONFIG_FILE: +- syslog(LOG_ERR, +- "lldpad failed to read config file - %s", +- va_arg(va, char *)); +- break; +- case MSG_INFO_LLINK_DISABLED: +- syslog(LOG_INFO, +- "FCoE logical link on %s is disabled", +- va_arg(va, char *)); +- break; +- case MSG_INFO_LLINK_ENABLED: +- syslog(LOG_INFO, +- "FCoE logical link on %s is enabled", +- va_arg(va, char *)); +- break; +- case MSG_INFO_LLINK_OPER: +- syslog(LOG_INFO, +- "FCoE logical link on %s is operational", +- va_arg(va, char *)); +- break; +- case MSG_ERR_LLINK_NONOPER: +- syslog(LOG_ERR, +- "FCoE logical link on %s is not operational", +- va_arg(va, char *)); +- break; +- default: +- vsyslog(msgid, format, vb); +- break; +- } + + va_end(va); + } +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-dcbx-mode-needs-to-be-set-before-set_state-cm.patch b/lldpad-0.9.43-lldpad-dcbx-mode-needs-to-be-set-before-set_state-cm.patch new file mode 100644 index 0000000..6365664 --- /dev/null +++ b/lldpad-0.9.43-lldpad-dcbx-mode-needs-to-be-set-before-set_state-cm.patch @@ -0,0 +1,41 @@ +From 8d52cc5868799831315f12df20be3ea304e367ba Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:07:53 -0700 +Subject: [PATCH 15/29] lldpad: dcbx mode needs to be set before set_state() + cmd + +lldp_dcbx issues a set_state() command before setting the dcbx +mode. In almost all cases this is OK because we don't use dcbx +mode unless the driver is already setup this way or we received +a CEE DCBX frame which already set the mode. + +The corner case being when the user manually forces CEE mode +in this case the driver may be in IEEE mode and we need to +set the mode before issueing CEE commands otherwise the driver +may be expecting IEEE cmds or the driver and lldpad can become +out of sync. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + lldp_dcbx.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/lldp_dcbx.c b/lldp_dcbx.c +index efde957..4cf2cb5 100644 +--- a/lldp_dcbx.c ++++ b/lldp_dcbx.c +@@ -567,9 +567,9 @@ initialized: + */ + get_dcb_capabilities(ifname, &dcb_support); + if (!dcb_support.dcbx || (gdcbx_subtype & ~MASK_DCBX_FORCE)) { +- set_hw_state(ifname, 1); + set_dcbx_mode(tlvs->ifname, + DCB_CAP_DCBX_HOST | DCB_CAP_DCBX_VER_CEE); ++ set_hw_state(ifname, 1); + tlvs->active = true; + } else { + tlvs->active = false; +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-fix-compile-warnings-in-802.1Qaz-debug-code.patch b/lldpad-0.9.43-lldpad-fix-compile-warnings-in-802.1Qaz-debug-code.patch new file mode 100644 index 0000000..25619f5 --- /dev/null +++ b/lldpad-0.9.43-lldpad-fix-compile-warnings-in-802.1Qaz-debug-code.patch @@ -0,0 +1,35 @@ +From 9def6743917089885f5135c9d244361fff2b8326 Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:07:58 -0700 +Subject: [PATCH 16/29] lldpad: fix compile warnings in 802.1Qaz debug code + +802.1Qaz debug print code contains some compile warnings. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + lldp_8021qaz.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lldp_8021qaz.c b/lldp_8021qaz.c +index adeb0eb..2a6685b 100644 +--- a/lldp_8021qaz.c ++++ b/lldp_8021qaz.c +@@ -645,12 +645,12 @@ void print_pfc(struct ieee_pfc *pfc) + + printf("\t requests: "); + for (i = 0; i < 8; i++) +- printf("%i ", pfc->requests[i]); ++ printf("%llu ", pfc->requests[i]); + printf("\n"); + + printf("\t indications: "); + for (i = 0; i < 8; i++) +- printf("%i ", pfc->indications[i]); ++ printf("%llu ", pfc->indications[i]); + printf("\n"); + } + #endif +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-remove-app-data-on-CEE-unregister.patch b/lldpad-0.9.43-lldpad-remove-app-data-on-CEE-unregister.patch new file mode 100644 index 0000000..479b4f2 --- /dev/null +++ b/lldpad-0.9.43-lldpad-remove-app-data-on-CEE-unregister.patch @@ -0,0 +1,66 @@ +From 4825abfcadd579b3603994f2e98487ee3b14ef26 Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:03:39 -0700 +Subject: [PATCH 07/29] lldpad: remove app data on CEE unregister + +When CEE is unregistered the CEE app data should be removed. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + dcb_protocol.c | 32 ++++++++++++++++++++++++++++++++ + 1 files changed, 32 insertions(+), 0 deletions(-) + +diff --git a/dcb_protocol.c b/dcb_protocol.c +index 0bb13b9..310b071 100644 +--- a/dcb_protocol.c ++++ b/dcb_protocol.c +@@ -1243,6 +1243,35 @@ dcb_result save_dcbx_state(const char *device_name) + return dcb_failed; + } + ++static int dcbx_free_app_config(char *device_name) ++{ ++ app_it Oper, Local; ++ appgroup_attribs app_data; ++ ++ /* Free FCoE APP data */ ++ Oper = apptlv_find(&oper_apptlv, device_name, APP_FCOE_STYPE); ++ Local = apptlv_find(&apptlv, device_name, APP_FCOE_STYPE); ++ if (Oper || Local) { ++ app_data.dcb_app_idtype = DCB_APP_IDTYPE_ETHTYPE; ++ app_data.dcb_app_id = APP_FCOE_ETHTYPE; ++ app_data.dcb_app_priority = 0; ++ set_hw_app(device_name, &app_data); ++ } ++ ++ /* Free iSCSI APP data */ ++ Oper = apptlv_find(&oper_apptlv, device_name, APP_ISCSI_STYPE); ++ Local = apptlv_find(&apptlv, device_name, APP_ISCSI_STYPE); ++ if (Oper || Local) { ++ app_data.dcb_app_idtype = DCB_APP_IDTYPE_PORTNUM; ++ app_data.dcb_app_id = APP_ISCSI_PORT; ++ app_data.dcb_app_priority = 0; ++ ++ set_hw_app(device_name, &app_data); ++ } ++ ++ return 0; ++} ++ + int dcbx_remove_all(void) + { + pg_it it; +@@ -1258,6 +1287,9 @@ int dcbx_remove_all(void) + + save_dcbx_state(it->ifname); + ++ /* Remove kernel APP entries */ ++ dcbx_free_app_config(it->ifname); ++ + /* prepare sTmp in case of error */ + snprintf(sTmp, MAX_DEVICE_NAME_LEN*2, /* Localization OK */ + "Remove_all_adapters error: Bad device name: %.*s\n", +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-remove-unused-exported-DCBX-routines.patch b/lldpad-0.9.43-lldpad-remove-unused-exported-DCBX-routines.patch new file mode 100644 index 0000000..bf23abf --- /dev/null +++ b/lldpad-0.9.43-lldpad-remove-unused-exported-DCBX-routines.patch @@ -0,0 +1,150 @@ +From 5620244e0e10af4d3ab65d039ee2ae3f2f08181b Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:03:46 -0700 +Subject: [PATCH 08/29] lldpad: remove unused exported DCBX routines + +Remove various DCBX routines that are not actually used. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + dcb_protocol.c | 71 ------------------------------------------------ + include/dcb_protocol.h | 6 ---- + 2 files changed, 0 insertions(+), 77 deletions(-) + +diff --git a/dcb_protocol.c b/dcb_protocol.c +index 310b071..fec437d 100644 +--- a/dcb_protocol.c ++++ b/dcb_protocol.c +@@ -1380,21 +1380,6 @@ bool add_pg_defaults() + return result; + } + +-bool remove_pg_defaults() +-{ +- char sTmp[MAX_DESCRIPTION_LEN]; +- +- snprintf(sTmp, MAX_DESCRIPTION_LEN, DEF_CFG_STORE); +- pg_it itpg = pg_find(&pg, sTmp); +- if (itpg == NULL) +- return false; +- +- /* erase and free memory */ +- pg_erase(&itpg); +- +- return true; +-} +- + bool add_pfc_defaults() + { + pfc_attribs pfc_data; +@@ -1427,21 +1412,6 @@ bool add_pfc_defaults() + return result; + } + +-bool remove_pfc_defaults() +-{ +- char sTmp[MAX_DESCRIPTION_LEN]; +- +- snprintf(sTmp, MAX_DESCRIPTION_LEN, DEF_CFG_STORE); +- pfc_it itpfc = pfc_find(&pfc, sTmp); +- if (itpfc == NULL) +- return false; +- +- /* erase and free memory */ +- pfc_erase(&itpfc); +- +- return true; +-} +- + bool add_app_defaults(u32 subtype) + { + app_attribs app_data; +@@ -1484,22 +1454,6 @@ bool add_app_defaults(u32 subtype) + return result; + } + +-bool remove_app_defaults(u32 subtype) +-{ +- char sTmp[MAX_DESCRIPTION_LEN]; +- +- snprintf(sTmp, MAX_DESCRIPTION_LEN, "%s", DEF_CFG_STORE); +- app_it it = apptlv_find(&apptlv, sTmp, subtype); +- +- if (it == NULL) +- return false; +- +- /* erase and free memory */ +- apptlv_erase(&it); +- +- return true; +-} +- + bool add_llink_defaults(u32 subtype) + { + llink_attribs llink_data; +@@ -1529,21 +1483,6 @@ bool add_llink_defaults(u32 subtype) + return result; + } + +-bool remove_llink_defaults(u32 subtype) +-{ +- char sTmp[MAX_DESCRIPTION_LEN]; +- +- snprintf(sTmp, MAX_DESCRIPTION_LEN, "%s", DEF_CFG_STORE); +- llink_it itllink = llink_find(&llink, sTmp, subtype); +- if (itllink == NULL) +- return false; +- +- /* erase and free memory */ +- llink_erase(&itllink); +- +- return true; +-} +- + dcb_result get_pg(char *device_name, pg_attribs *pg_data) + { + dcb_result result = dcb_success; +@@ -1566,16 +1505,6 @@ dcb_result get_pg(char *device_name, pg_attribs *pg_data) + return result; + } + +-dcb_result test_device_dstore(char *device_name) +-{ +- pg_it it = pg_find(&pg, device_name); +- if (it != NULL) { +- return dcb_success; +- } else { +- return dcb_device_not_found; +- } +-} +- + dcb_result get_oper_pg(char *device_name, pg_attribs *pg_data) + { + dcb_result result = dcb_success; +diff --git a/include/dcb_protocol.h b/include/dcb_protocol.h +index c7b4d6d..19b1bad 100644 +--- a/include/dcb_protocol.h ++++ b/include/dcb_protocol.h +@@ -78,18 +78,12 @@ void remove_dcb_support(void); + bool add_pg_defaults(void); + bool add_pfc_defaults(void); + bool add_app_defaults(u32 subtype); +-bool remove_pg_defaults(void); +-bool remove_pfc_defaults(void); +-bool remove_app_defaults(u32 subtype); + void mark_pg_sent(char *device_name); + void mark_pfc_sent(char *device_name); + void mark_app_sent(char *device_name, u32 subtype); + bool add_llink_defaults(u32 subtype); +-bool remove_llink_defaults(u32 subtype); + void mark_llink_sent(char *device_name, u32 subtype); + +-dcb_result test_device_dstore(char *device_name); +- + dcb_result get_control(char *device_name, + control_protocol_attribs *control_data); + dcb_result get_peer_control(char *device_name, +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-resolve-segfault-with-ECP-and-bonding.patch b/lldpad-0.9.43-lldpad-resolve-segfault-with-ECP-and-bonding.patch new file mode 100644 index 0000000..eda3756 --- /dev/null +++ b/lldpad-0.9.43-lldpad-resolve-segfault-with-ECP-and-bonding.patch @@ -0,0 +1,91 @@ +From 4c0e75a22638da49dbbe78e46e61a334ada721b1 Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:07:48 -0700 +Subject: [PATCH 14/29] lldpad: resolve segfault with ECP and bonding + +A segfault occurs with ECP and bonded devices because +the port lookup fails on bonds. ECP does not verify +the port lookup is successful. + +I do not believe VDP should run over the bonded interface +so this patch aborts VDP initialization on bond devices +and avoids port lookup completely. + +Also add checks for null pointers in ECP. + +CC: Jens Osterkamp +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + ecp/ecp_rx.c | 7 ++++++- + ecp/ecp_tx.c | 6 +++++- + lldp_vdp.c | 4 ++++ + 3 files changed, 15 insertions(+), 2 deletions(-) + +diff --git a/ecp/ecp_rx.c b/ecp/ecp_rx.c +index bd5a1e1..74e9f32 100644 +--- a/ecp/ecp_rx.c ++++ b/ecp/ecp_rx.c +@@ -211,7 +211,9 @@ void ecp_rx_ReceiveFrame(void *ctx, unsigned int ifindex, const u8 *buf, size_t + LLDPAD_DBG("%s(%i)-%s: received packet with size %i\n", __func__, __LINE__, + vd->ifname, (int) len); + +- if (port->adminStatus == disabled || port->adminStatus == enabledTxOnly) ++ if (!port || ++ port->adminStatus == disabled || ++ port->adminStatus == enabledTxOnly) + return; + + if (vd->ecp.rx.framein && +@@ -534,6 +536,9 @@ bool ecp_set_rx_state(struct vdp_data *vd) + { + struct port *port = port_find_by_name(vd->ifname); + ++ if (!port) ++ return false; ++ + if (port->portEnabled == false) { + ecp_rx_change_state(vd, ECP_RX_IDLE); + } +diff --git a/ecp/ecp_tx.c b/ecp/ecp_tx.c +index cbf2e11..f9ee3d7 100644 +--- a/ecp/ecp_tx.c ++++ b/ecp/ecp_tx.c +@@ -236,6 +236,11 @@ error: + */ + void ecp_tx_Initialize(struct vdp_data *vd) + { ++ struct port *port = port_find_by_name(vd->ifname); ++ ++ if (!port) ++ return; ++ + if (vd->ecp.tx.frameout) { + free(vd->ecp.tx.frameout); + vd->ecp.tx.frameout = NULL; +@@ -246,7 +251,6 @@ void ecp_tx_Initialize(struct vdp_data *vd) + vd->ecp.ackTimer = ECP_ACK_TIMER_STOPPED; + vd->ecp.retries = 0; + +- struct port *port = port_find_by_name(vd->ifname); + l2_packet_get_port_state(vd->ecp.l2, (u8 *)&(port->portEnabled)); + + return; +diff --git a/lldp_vdp.c b/lldp_vdp.c +index 5a8ab55..2875bf5 100644 +--- a/lldp_vdp.c ++++ b/lldp_vdp.c +@@ -1349,6 +1349,10 @@ void vdp_ifup(char *ifname) + struct port *port; + struct vsi_profile *p; + ++ /* VDP does not support bonded devices */ ++ if (is_bond(ifname)) ++ return; ++ + LLDPAD_DBG("%s(%i): starting VDP for if %s !\n", __func__, __LINE__, ifname); + + vd = vdp_data(ifname); +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldpad-use-is_valid_lldp_device-in-scan-path.patch b/lldpad-0.9.43-lldpad-use-is_valid_lldp_device-in-scan-path.patch new file mode 100644 index 0000000..f2dd0b9 --- /dev/null +++ b/lldpad-0.9.43-lldpad-use-is_valid_lldp_device-in-scan-path.patch @@ -0,0 +1,74 @@ +From e126f697e635eb83410003e99c905ebd1788f149 Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:07:43 -0700 +Subject: [PATCH 13/29] lldpad: use is_valid_lldp_device() in scan path + +lldpad can miss netlink events when this occurs we do +an explicit scan of the ports and set them to the +correct state. + +This replaces a series of if/else statements with +the is_valid_lldp_device() call. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + config.c | 40 ++++++++++++++++++++-------------------- + 1 files changed, 20 insertions(+), 20 deletions(-) + +diff --git a/config.c b/config.c +index a8ebe17..4c82bb6 100644 +--- a/config.c ++++ b/config.c +@@ -346,28 +346,28 @@ void init_ports(void) + + p = nameidx; + while (p->if_index != 0) { +- if (is_loopback(p->if_name)) { +- ; +- } else if (is_bond(p->if_name)) { +- if (add_bond_port(p->if_name) < 0) +- syslog(LOG_ERR, "failed to register port %s", +- p->if_name); +- } else if (is_vlan(p->if_name)) { +- ; +- } else if (is_macvtap(p->if_name)) { +- ; +- } else if (is_bridge(p->if_name)) { +- ; /* ignore bridge device */ +- } else { +- add_port(p->if_name); ++ int valid = is_valid_lldp_device(p->if_name); ++ int err; + +- if (check_link_status(p->if_name)) { +- LIST_FOREACH(np, &lldp_head, lldp) { +- if (np->ops->lldp_mod_ifup) +- np->ops->lldp_mod_ifup(p->if_name); +- } +- set_lldp_port_enable_state(p->if_name, 1); ++ if (!valid) { ++ p++; ++ continue; ++ } ++ ++ if (is_bond(p->if_name)) ++ err = add_bond_port(p->if_name); ++ else ++ err = add_port(p->if_name); ++ ++ if (err) { ++ LLDPAD_ERR("%s: Error adding device %s\n", ++ __func__, p->if_name); ++ } else if (check_link_status(p->if_name)) { ++ LIST_FOREACH(np, &lldp_head, lldp) { ++ if (np->ops->lldp_mod_ifup) ++ np->ops->lldp_mod_ifup(p->if_name); + } ++ set_lldp_port_enable_state(p->if_name, 1); + } + p++; + } +-- +1.7.6 + diff --git a/lldpad-0.9.43-lldptool-better-TLV_ID-validation.patch b/lldpad-0.9.43-lldptool-better-TLV_ID-validation.patch new file mode 100644 index 0000000..a6e283f --- /dev/null +++ b/lldpad-0.9.43-lldptool-better-TLV_ID-validation.patch @@ -0,0 +1,51 @@ +From 97cee02130b395a7c98616b916c9c0e5eae126d4 Mon Sep 17 00:00:00 2001 +From: John Fastabend +Date: Wed, 27 Jul 2011 15:20:06 -0700 +Subject: [PATCH 20/29] lldptool: better TLV_ID validation + +Wire up 'strtoul' so that input TLV_ID must be an exact match. + +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + lldptool.c | 10 +++++++--- + 1 files changed, 7 insertions(+), 3 deletions(-) + +diff --git a/lldptool.c b/lldptool.c +index 26e6d1a..db77a6e 100644 +--- a/lldptool.c ++++ b/lldptool.c +@@ -35,6 +35,7 @@ + #include + #include + #include ++#include + + #include "clif.h" + #include "lldp_mand_clif.h" +@@ -437,7 +438,7 @@ static int request(struct clif *clif, int argc, char *argv[]) + int newraw = 0; + int numargs = 0; + char **argptr = &argv[0]; +- ++ char *end; + int c; + + memset((void *)&command, 0, sizeof(command)); +@@ -470,8 +471,11 @@ static int request(struct clif *clif, int argc, char *argv[]) + } + + /* Currently tlvid unset lookup and verify parameter */ +- command.tlvid = strtoul(optarg, (char **) NULL, 0); +- if (!command.tlvid) { ++ errno = 0; ++ command.tlvid = strtoul(optarg, &end, 0); ++ ++ if (!command.tlvid || errno || *end != '\0' || ++ end == optarg) { + command.tlvid = lookup_tlvid(optarg); + } + +-- +1.7.6 + diff --git a/lldpad-0.9.43-prevent-crash-on-invalid-response-code.patch b/lldpad-0.9.43-prevent-crash-on-invalid-response-code.patch new file mode 100644 index 0000000..cf4575b --- /dev/null +++ b/lldpad-0.9.43-prevent-crash-on-invalid-response-code.patch @@ -0,0 +1,102 @@ +From de767ee03e6c0c4b0d7bb7df4c8c97c656cd955f Mon Sep 17 00:00:00 2001 +From: Jens Osterkamp +Date: Mon, 15 Aug 2011 18:17:05 -0700 +Subject: [PATCH 27/29] prevent crash on invalid response code + +If an unknown response code was received for a profile, the lookup of the +error string could cause a crash. + +Signed-off-by: Jens Osterkamp +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + include/lldp_vdp.h | 2 ++ + lldp_vdp.c | 24 +++++++++++++++++++++++- + lldp_vdp_cmds.c | 2 +- + 3 files changed, 26 insertions(+), 2 deletions(-) + +diff --git a/include/lldp_vdp.h b/include/lldp_vdp.h +index 2f6adf8..b9fd37f 100644 +--- a/include/lldp_vdp.h ++++ b/include/lldp_vdp.h +@@ -43,6 +43,7 @@ + #define VDP_RESPONSE_VTID_VIOLATION 0x4 + #define VDP_RESPONSE_VTID_VER_VIOLATION 0x5 + #define VDP_RESPONSE_OUT_OF_SYNC 0x6 ++#define VDP_RESPONSE_UNKNOWN 0xfe + #define VDP_RESPONSE_NO_RESPONSE 0xff + + extern const char * const vsi_responses[]; +@@ -137,6 +138,7 @@ void vdp_ack_profiles(struct vdp_data *vd, int seqnr); + int vdp_indicate(struct vdp_data *vd, struct unpacked_tlv *tlv, int ecp_mode); + int vdp_vsis_pending(struct vdp_data *vd); + int vdp_vsis(char *ifname); ++const char *vdp_response2str(int); + void vdp_print_profile(struct vsi_profile *); + void ecp_somethingChangedLocal(struct vdp_data *vd, bool flag); + void ecp_rx_send_ack_frame(struct vdp_data *vd); +diff --git a/lldp_vdp.c b/lldp_vdp.c +index 5b8ce46..15fed51 100644 +--- a/lldp_vdp.c ++++ b/lldp_vdp.c +@@ -51,6 +51,8 @@ const char * const vsi_responses[] = { + [VDP_RESPONSE_VTID_VIOLATION] = "VTID violation", + [VDP_RESPONSE_VTID_VER_VIOLATION] = "VTID version violation", + [VDP_RESPONSE_OUT_OF_SYNC] = "out of sync", ++ [VDP_RESPONSE_UNKNOWN] = "unknown response", ++ [VDP_RESPONSE_NO_RESPONSE] = "no response", + }; + + const char * const vsi_states[] = { +@@ -124,6 +126,26 @@ static void vdp_free_data(struct vdp_user_data *ud) + } + } + ++/* vdp_response2str - map response to string ++ * @response: response received ++ * ++ * no return value ++ * ++ * maps VDP response received for a profile to human readable string for ++ * printing. ++ */ ++const char *vdp_response2str(int response) ++{ ++ if ((response >= VDP_RESPONSE_SUCCESS) && ++ (response <= VDP_RESPONSE_OUT_OF_SYNC)) ++ return vsi_responses[response]; ++ ++ if (response == VDP_RESPONSE_NO_RESPONSE) ++ return vsi_responses[VDP_RESPONSE_NO_RESPONSE]; ++ ++ return vsi_responses[VDP_RESPONSE_UNKNOWN]; ++} ++ + /* vdp_print_profile - print a vsi profile + * @profile: profile to print + * +@@ -990,7 +1012,7 @@ int vdp_indicate(struct vdp_data *vd, struct unpacked_tlv *tlv, int ecp_mode) + LLDPAD_DBG("%s(%i): profile response: %s (%i) " + "for profile 0x%02x at state %s.\n", + __func__, __LINE__, +- vsi_responses[p->response], ++ vdp_response2str(p->response), + p->response, p->instance[15], + vsi_states[p->state]); + free(profile); +diff --git a/lldp_vdp_cmds.c b/lldp_vdp_cmds.c +index 8cc871f..04f6fc1 100644 +--- a/lldp_vdp_cmds.c ++++ b/lldp_vdp_cmds.c +@@ -97,7 +97,7 @@ static char * print_profile(char *s, size_t length, struct vsi_profile *p) + return r; + + c = snprintf(s, length, "response: %i (%s)\n", p->response, +- vsi_responses[p->response]); ++ vdp_response2str(p->response)); + s = check_and_update(&total, &length, s, c); + if (!s) + return r; +-- +1.7.6 + diff --git a/lldpad-0.9.43-some-minor-bugfixes.patch b/lldpad-0.9.43-some-minor-bugfixes.patch new file mode 100644 index 0000000..2b240dc --- /dev/null +++ b/lldpad-0.9.43-some-minor-bugfixes.patch @@ -0,0 +1,186 @@ +From 384ba242de2b71c42f90e8451e01bbded47dcc8c Mon Sep 17 00:00:00 2001 +From: Jens Osterkamp +Date: Mon, 15 Aug 2011 18:18:06 -0700 +Subject: [PATCH 29/29] some minor bugfixes + +This patch summarizes a number of minor bugfixes: + + - In case lldpad.conf cannot be created, add a line break to error message. + + - add IFLA_AF_SPEC and IFLA_GROUP from newer kernels to lldpad + + - consolidate while (port != NULL) loops to port_find_by_name(). + + - whitespace fixes in lldp_dcbx.c + +Signed-off-by: Jens Osterkamp +Signed-off-by: John Fastabend +Signed-off-by: Petr Sabata +--- + config.c | 2 +- + event_iface.c | 6 +++++ + include/linux/if_link.h | 2 + + lldp/ports.c | 51 ++++++---------------------------------------- + lldp_dcbx.c | 4 +- + 5 files changed, 18 insertions(+), 47 deletions(-) + +diff --git a/config.c b/config.c +index 4c82bb6..648f6f9 100644 +--- a/config.c ++++ b/config.c +@@ -201,7 +201,7 @@ int check_cfg_file(void) + O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); + if (fd < 0) { + retval = errno; +- LLDPAD_ERR("error creating %s", cfg_file_name); ++ LLDPAD_ERR("error creating %s !\n", cfg_file_name); + } else { + close(fd); + create_default_cfg_file(); +diff --git a/event_iface.c b/event_iface.c +index e581bce..1288fae 100644 +--- a/event_iface.c ++++ b/event_iface.c +@@ -174,6 +174,12 @@ static void event_if_decode_rta(int type, struct rtattr *rta, int *ls, char *d) + case IFLA_PORT_SELF: + LLDPAD_DBG(" IFLA_PORT_SELF\n"); + break; ++ case IFLA_AF_SPEC: ++ LLDPAD_DBG(" IFLA_AF_SPEC\n"); ++ break; ++ case IFLA_GROUP: ++ LLDPAD_DBG(" IFLA_GROUP\n"); ++ break; + default: + LLDPAD_DBG(" unknown type : 0x%02x\n", type); + break; +diff --git a/include/linux/if_link.h b/include/linux/if_link.h +index 2fc66dd..4fdfd38 100644 +--- a/include/linux/if_link.h ++++ b/include/linux/if_link.h +@@ -116,6 +116,8 @@ enum { + IFLA_STATS64, + IFLA_VF_PORTS, + IFLA_PORT_SELF, ++ IFLA_AF_SPEC, ++ IFLA_GROUP, /* Group the device belongs to */ + __IFLA_MAX + }; + +diff --git a/lldp/ports.c b/lldp/ports.c +index 925a2ad..596e68b 100644 +--- a/lldp/ports.c ++++ b/lldp/ports.c +@@ -156,16 +156,10 @@ void set_lldp_port_enable_state(const char *ifname, int enable) + { + struct port *port = NULL; + +- port = porthead; +- while (port != NULL) { +- if (!strncmp(ifname, port->ifname, IFNAMSIZ)) +- break; +- port = port->next; +- } ++ port = port_find_by_name(ifname); + +- if (port == NULL) { ++ if (port == NULL) + return; +- } + + port->portEnabled = (u8)enable; + +@@ -178,14 +172,7 @@ void set_lldp_port_enable_state(const char *ifname, int enable) + + void set_port_oper_delay(const char *ifname) + { +- struct port *port = NULL; +- +- port = porthead; +- while (port != NULL) { +- if (!strncmp(ifname, port->ifname, IFNAMSIZ)) +- break; +- port = port->next; +- } ++ struct port *port = port_find_by_name(ifname); + + if (port == NULL) + return; +@@ -198,13 +185,7 @@ int set_port_hw_resetting(const char *ifname, int resetting) + { + struct port *port = NULL; + +- port = porthead; +- while (port != NULL) { +- if (!strncmp(ifname, port->ifname, IFNAMSIZ)) { +- break; +- } +- port = port->next; +- } ++ port = port_find_by_name(ifname); + + if (port == NULL) + return -1; +@@ -218,12 +199,7 @@ int get_port_hw_resetting(const char *ifname) + { + struct port *port = NULL; + +- port = porthead; +- while (port != NULL) { +- if (!strncmp(ifname, port->ifname, IFNAMSIZ)) +- break; +- port = port->next; +- } ++ port = port_find_by_name(ifname); + + if (port) + return port->hw_resetting; +@@ -235,12 +211,7 @@ int reinit_port(const char *ifname) + { + struct port *port; + +- port = porthead; +- while (port != NULL) { +- if (!strncmp(ifname, port->ifname, IFNAMSIZ)) +- break; +- port = port->next; +- } ++ port = port_find_by_name(ifname); + + if (!port) + return -1; +@@ -347,15 +318,7 @@ int remove_port(const char *ifname) + struct port *port = NULL; /* Pointer to port to remove */ + struct port *parent = NULL; /* Pointer to previous on port stack */ + +- port = porthead; +- while (port != NULL) { +- if (!strncmp(ifname, port->ifname, IFNAMSIZ)) { +- LLDPAD_DBG("In remove_port: Found port %s\n",port->ifname); +- break; +- } +- parent = port; +- port = port->next; +- } ++ port = port_find_by_name(ifname); + + if (port == NULL) { + LLDPAD_DBG("remove_port: port not present\n"); +diff --git a/lldp_dcbx.c b/lldp_dcbx.c +index 7949147..6ca290c 100644 +--- a/lldp_dcbx.c ++++ b/lldp_dcbx.c +@@ -58,8 +58,8 @@ void dcbx_free_tlv(struct dcbx_tlvs *tlvs); + static int dcbx_check_operstate(struct port *port); + + const struct lldp_mod_ops dcbx_ops = { +- .lldp_mod_register = dcbx_register, +- .lldp_mod_unregister = dcbx_unregister, ++ .lldp_mod_register = dcbx_register, ++ .lldp_mod_unregister = dcbx_unregister, + .lldp_mod_gettlv = dcbx_gettlv, + .lldp_mod_rchange = dcbx_rchange, + .lldp_mod_ifup = dcbx_ifup, +-- +1.7.6 + diff --git a/lldpad-0.9.43-vdp-must-be-enabled-on-interface.patch b/lldpad-0.9.43-vdp-must-be-enabled-on-interface.patch new file mode 100644 index 0000000..44f1483 --- /dev/null +++ b/lldpad-0.9.43-vdp-must-be-enabled-on-interface.patch @@ -0,0 +1,169 @@ +For vdp to be usable, enabletx must be set to true. The check for enabletx +needs to be made before checking if vdp_data for this ifname already exists. +Otherwise VDP is running even though enabletx is false. + +Signed-off-by: Jens Osterkamp +--- + ecp/ecp_rx.c | 10 +++------- + ecp/ecp_tx.c | 7 +++---- + include/lldp_vdp.h | 1 + + lldp_vdp.c | 38 ++++++++++++++++++++++---------------- + 4 files changed, 29 insertions(+), 27 deletions(-) + +diff --git a/ecp/ecp_rx.c b/ecp/ecp_rx.c +index a56cd3b..182b911 100644 +--- a/ecp/ecp_rx.c ++++ b/ecp/ecp_rx.c +@@ -211,9 +211,7 @@ void ecp_rx_ReceiveFrame(void *ctx, unsigned int ifindex, const u8 *buf, size_t + LLDPAD_DBG("%s(%i)-%s: received packet with size %i\n", __func__, __LINE__, + vd->ifname, (int) len); + +- if (!port || +- port->adminStatus == disabled || +- port->adminStatus == enabledTxOnly) ++ if (vd->enabletx == false) + return; + + if (vd->ecp.rx.framein && +@@ -551,15 +549,13 @@ bool ecp_set_rx_state(struct vdp_data *vd) + } + return false; + case ECP_RX_INIT_RECEIVE: +- if ((port->adminStatus == enabledRxTx) || +- (port->adminStatus == enabledRxOnly)) { ++ if (vd->enabletx == true) { + ecp_rx_change_state(vd, ECP_RX_RECEIVE_WAIT); + return true; + } + return false; + case ECP_RX_RECEIVE_WAIT: +- if ((port->adminStatus == disabled) || +- (port->adminStatus == enabledTxOnly)) { ++ if (vd->enabletx == false) { + ecp_rx_change_state(vd, ECP_RX_IDLE); + return true; + } +diff --git a/ecp/ecp_tx.c b/ecp/ecp_tx.c +index c81e101..8a9d2b0 100644 +--- a/ecp/ecp_tx.c ++++ b/ecp/ecp_tx.c +@@ -414,15 +414,14 @@ static bool ecp_set_tx_state(struct vdp_data *vd) + + switch (vd->ecp.tx.state) { + case ECP_TX_INIT_TRANSMIT: +- if (port->portEnabled && ((port->adminStatus == enabledRxTx) || +- (port->adminStatus == enabledTxOnly)) && vd->ecp.tx.localChange) { ++ if (port->portEnabled && (vd->enabletx == true) ++ && vd->ecp.tx.localChange) { + ecp_tx_change_state(vd, ECP_TX_TRANSMIT_ECPDU); + return true; + } + return false; + case ECP_TX_TRANSMIT_ECPDU: +- if ((port->adminStatus == disabled) || +- (port->adminStatus == enabledRxOnly)) { ++ if (vd->enabletx == false) { + ecp_tx_change_state(vd, ECP_TX_INIT_TRANSMIT); + return true; + } +diff --git a/include/lldp_vdp.h b/include/lldp_vdp.h +index b9fd37f..1192364 100644 +--- a/include/lldp_vdp.h ++++ b/include/lldp_vdp.h +@@ -112,6 +112,7 @@ struct vsi_profile { + + struct vdp_data { + char ifname[IFNAMSIZ]; ++ u8 enabletx; + struct ecp ecp; + struct unpacked_tlv *vdp; + int role; +diff --git a/lldp_vdp.c b/lldp_vdp.c +index 646105a..424bcbe 100644 +--- a/lldp_vdp.c ++++ b/lldp_vdp.c +@@ -42,6 +42,8 @@ + #include "config.h" + #include "lldp_tlv.h" + #include "lldp_vdp_cmds.h" ++#include "lldp_vdp_clif.h" ++#include "lldp_mand_clif.h" + + const char * const vsi_responses[] = { + [VDP_RESPONSE_SUCCESS] = "success", +@@ -1365,10 +1367,11 @@ out_err: + void vdp_ifup(char *ifname) + { + char *string; ++ char config_path[16]; + struct vdp_data *vd; + struct vdp_user_data *ud; +- struct port *port; + struct vsi_profile *p; ++ int enabletx = false; + + /* VDP does not support bonded devices */ + if (is_bond(ifname)) +@@ -1376,9 +1379,25 @@ void vdp_ifup(char *ifname) + + LLDPAD_DBG("%s(%i): starting VDP for if %s !\n", __func__, __LINE__, ifname); + ++ snprintf(config_path, sizeof(config_path), "%s.%s", ++ VDP_PREFIX, ARG_TLVTXENABLE); ++ ++ if (get_config_setting(ifname, config_path, (void *)&enabletx, ++ CONFIG_TYPE_BOOL)) ++ enabletx = false; ++ ++ if (enabletx == false) { ++ LLDPAD_WARN("%s(%i): port %s not enabled for VDP (%i) !\n", ++ __func__, __LINE__, ifname, enabletx); ++ return; ++ } ++ + vd = vdp_data(ifname); + if (vd) { +- LLDPAD_WARN("%s:%s vdp data already exists !\n", __func__, ifname); ++ vd->enabletx = enabletx; ++ ++ LLDPAD_WARN("%s:%s vdp data already exists !\n", ++ __func__, ifname); + goto out_start_again; + } + +@@ -1392,6 +1411,7 @@ void vdp_ifup(char *ifname) + strncpy(vd->ifname, ifname, IFNAMSIZ); + + vd->role = VDP_ROLE_STATION; ++ vd->enabletx = enabletx; + + if (!get_cfg(ifname, "vdp.role", (void *)&string, + CONFIG_TYPE_STRING)) { +@@ -1408,20 +1428,6 @@ void vdp_ifup(char *ifname) + ud = find_module_user_data_by_id(&lldp_head, LLDP_MOD_VDP); + LIST_INSERT_HEAD(&ud->head, vd, entry); + +- port = port_find_by_name(ifname); +- +- if (!port) { +- LLDPAD_ERR("%s(%i): could not find port for %s!\n", +- __func__, __LINE__, ifname); +- goto out_err; +- } +- +- if (port->adminStatus != enabledRxTx) { +- LLDPAD_WARN("%s(%i): port %s not enabled for RxTx (%i) !\n", +- __func__, __LINE__, ifname, port->adminStatus); +- return; +- } +- + out_start_again: + if (ecp_init(ifname)) { + LLDPAD_ERR("%s:%s unable to init ecp !\n", __func__, ifname); +-- +1.7.4.4 + +_______________________________________________ +lldp-devel mailing list +lldp-devel@open-lldp.org +https://lists.open-fcoe.org/mailman/listinfo/lldp-devel diff --git a/lldpad-0.9.43-vdpmustbeenabledoninterface.patch b/lldpad-0.9.43-vdpmustbeenabledoninterface.patch new file mode 100644 index 0000000..44f1483 --- /dev/null +++ b/lldpad-0.9.43-vdpmustbeenabledoninterface.patch @@ -0,0 +1,169 @@ +For vdp to be usable, enabletx must be set to true. The check for enabletx +needs to be made before checking if vdp_data for this ifname already exists. +Otherwise VDP is running even though enabletx is false. + +Signed-off-by: Jens Osterkamp +--- + ecp/ecp_rx.c | 10 +++------- + ecp/ecp_tx.c | 7 +++---- + include/lldp_vdp.h | 1 + + lldp_vdp.c | 38 ++++++++++++++++++++++---------------- + 4 files changed, 29 insertions(+), 27 deletions(-) + +diff --git a/ecp/ecp_rx.c b/ecp/ecp_rx.c +index a56cd3b..182b911 100644 +--- a/ecp/ecp_rx.c ++++ b/ecp/ecp_rx.c +@@ -211,9 +211,7 @@ void ecp_rx_ReceiveFrame(void *ctx, unsigned int ifindex, const u8 *buf, size_t + LLDPAD_DBG("%s(%i)-%s: received packet with size %i\n", __func__, __LINE__, + vd->ifname, (int) len); + +- if (!port || +- port->adminStatus == disabled || +- port->adminStatus == enabledTxOnly) ++ if (vd->enabletx == false) + return; + + if (vd->ecp.rx.framein && +@@ -551,15 +549,13 @@ bool ecp_set_rx_state(struct vdp_data *vd) + } + return false; + case ECP_RX_INIT_RECEIVE: +- if ((port->adminStatus == enabledRxTx) || +- (port->adminStatus == enabledRxOnly)) { ++ if (vd->enabletx == true) { + ecp_rx_change_state(vd, ECP_RX_RECEIVE_WAIT); + return true; + } + return false; + case ECP_RX_RECEIVE_WAIT: +- if ((port->adminStatus == disabled) || +- (port->adminStatus == enabledTxOnly)) { ++ if (vd->enabletx == false) { + ecp_rx_change_state(vd, ECP_RX_IDLE); + return true; + } +diff --git a/ecp/ecp_tx.c b/ecp/ecp_tx.c +index c81e101..8a9d2b0 100644 +--- a/ecp/ecp_tx.c ++++ b/ecp/ecp_tx.c +@@ -414,15 +414,14 @@ static bool ecp_set_tx_state(struct vdp_data *vd) + + switch (vd->ecp.tx.state) { + case ECP_TX_INIT_TRANSMIT: +- if (port->portEnabled && ((port->adminStatus == enabledRxTx) || +- (port->adminStatus == enabledTxOnly)) && vd->ecp.tx.localChange) { ++ if (port->portEnabled && (vd->enabletx == true) ++ && vd->ecp.tx.localChange) { + ecp_tx_change_state(vd, ECP_TX_TRANSMIT_ECPDU); + return true; + } + return false; + case ECP_TX_TRANSMIT_ECPDU: +- if ((port->adminStatus == disabled) || +- (port->adminStatus == enabledRxOnly)) { ++ if (vd->enabletx == false) { + ecp_tx_change_state(vd, ECP_TX_INIT_TRANSMIT); + return true; + } +diff --git a/include/lldp_vdp.h b/include/lldp_vdp.h +index b9fd37f..1192364 100644 +--- a/include/lldp_vdp.h ++++ b/include/lldp_vdp.h +@@ -112,6 +112,7 @@ struct vsi_profile { + + struct vdp_data { + char ifname[IFNAMSIZ]; ++ u8 enabletx; + struct ecp ecp; + struct unpacked_tlv *vdp; + int role; +diff --git a/lldp_vdp.c b/lldp_vdp.c +index 646105a..424bcbe 100644 +--- a/lldp_vdp.c ++++ b/lldp_vdp.c +@@ -42,6 +42,8 @@ + #include "config.h" + #include "lldp_tlv.h" + #include "lldp_vdp_cmds.h" ++#include "lldp_vdp_clif.h" ++#include "lldp_mand_clif.h" + + const char * const vsi_responses[] = { + [VDP_RESPONSE_SUCCESS] = "success", +@@ -1365,10 +1367,11 @@ out_err: + void vdp_ifup(char *ifname) + { + char *string; ++ char config_path[16]; + struct vdp_data *vd; + struct vdp_user_data *ud; +- struct port *port; + struct vsi_profile *p; ++ int enabletx = false; + + /* VDP does not support bonded devices */ + if (is_bond(ifname)) +@@ -1376,9 +1379,25 @@ void vdp_ifup(char *ifname) + + LLDPAD_DBG("%s(%i): starting VDP for if %s !\n", __func__, __LINE__, ifname); + ++ snprintf(config_path, sizeof(config_path), "%s.%s", ++ VDP_PREFIX, ARG_TLVTXENABLE); ++ ++ if (get_config_setting(ifname, config_path, (void *)&enabletx, ++ CONFIG_TYPE_BOOL)) ++ enabletx = false; ++ ++ if (enabletx == false) { ++ LLDPAD_WARN("%s(%i): port %s not enabled for VDP (%i) !\n", ++ __func__, __LINE__, ifname, enabletx); ++ return; ++ } ++ + vd = vdp_data(ifname); + if (vd) { +- LLDPAD_WARN("%s:%s vdp data already exists !\n", __func__, ifname); ++ vd->enabletx = enabletx; ++ ++ LLDPAD_WARN("%s:%s vdp data already exists !\n", ++ __func__, ifname); + goto out_start_again; + } + +@@ -1392,6 +1411,7 @@ void vdp_ifup(char *ifname) + strncpy(vd->ifname, ifname, IFNAMSIZ); + + vd->role = VDP_ROLE_STATION; ++ vd->enabletx = enabletx; + + if (!get_cfg(ifname, "vdp.role", (void *)&string, + CONFIG_TYPE_STRING)) { +@@ -1408,20 +1428,6 @@ void vdp_ifup(char *ifname) + ud = find_module_user_data_by_id(&lldp_head, LLDP_MOD_VDP); + LIST_INSERT_HEAD(&ud->head, vd, entry); + +- port = port_find_by_name(ifname); +- +- if (!port) { +- LLDPAD_ERR("%s(%i): could not find port for %s!\n", +- __func__, __LINE__, ifname); +- goto out_err; +- } +- +- if (port->adminStatus != enabledRxTx) { +- LLDPAD_WARN("%s(%i): port %s not enabled for RxTx (%i) !\n", +- __func__, __LINE__, ifname, port->adminStatus); +- return; +- } +- + out_start_again: + if (ecp_init(ifname)) { + LLDPAD_ERR("%s:%s unable to init ecp !\n", __func__, ifname); +-- +1.7.4.4 + +_______________________________________________ +lldp-devel mailing list +lldp-devel@open-lldp.org +https://lists.open-fcoe.org/mailman/listinfo/lldp-devel diff --git a/lldpad.spec b/lldpad.spec index c5543dc..fe33478 100644 --- a/lldpad.spec +++ b/lldpad.spec @@ -1,6 +1,6 @@ Name: lldpad Version: 0.9.43 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Intel LLDP Agent Group: System Environment/Daemons License: GPLv2 @@ -8,7 +8,38 @@ URL: http://open-lldp.org/ Source0: %{name}-%{version}.tar.gz Patch0: lldpad-0.9.41-make.patch Patch1: lldpad-0.9.41-lldptool-invalid-pointer.patch - +# Patchwork +Patch50: lldpad-0.9.43-vdp-must-be-enabled-on-interface.patch +# Upstream, 0.9.43+ +Patch100: lldpad-0.9.43-add-man-page-for-EVB-TLV.patch +Patch101: lldpad-0.9.43-add-man-page-for-VDP.patch +Patch102: lldpad-0.9.43-add-some-files-in-include-linux-to-inst_SOURCES.patch +Patch103: lldpad-0.9.43-lldpad-Add-EVB-and-VDP-man-pages-to-install-path.patch +Patch104: lldpad-0.9.43-lldpad-802.1Qaz-PFC-TLV-incorrectly-sets-willing-cap.patch +Patch105: lldpad-0.9.43-lldpad-Add-ports-even-w-out-link-at-init-time.patch +Patch106: lldpad-0.9.43-lldpad-remove-app-data-on-CEE-unregister.patch +Patch107: lldpad-0.9.43-lldpad-remove-unused-exported-DCBX-routines.patch +Patch108: lldpad-0.9.43-Create-man-page-for-MED-usage.patch +Patch109: lldpad-0.9.43-lldpad-802.1Qaz-resolve-incorrect-tcbw-memcpy.patch +Patch110: lldpad-0.9.43-dcbtool-return-different-error-codes-for-invalid-dev.patch +Patch111: lldpad-0.9.43-lldpad-802.1Qaz-make-ETS-CFG-willing-yes-no-values-v.patch +Patch112: lldpad-0.9.43-lldpad-use-is_valid_lldp_device-in-scan-path.patch +Patch113: lldpad-0.9.43-lldpad-resolve-segfault-with-ECP-and-bonding.patch +Patch114: lldpad-0.9.43-lldpad-dcbx-mode-needs-to-be-set-before-set_state-cm.patch +Patch115: lldpad-0.9.43-lldpad-fix-compile-warnings-in-802.1Qaz-debug-code.patch +Patch116: lldpad-0.9.43-lldpad-Do-not-enable-CEE-mode-if-explicitly-disabled.patch +Patch117: lldpad-0.9.43-lldapd-802.1Qaz-add-output-buffer-response-to-set-pf.patch +Patch118: lldpad-0.9.43-lldpad-ETS-add-another-example-to-man-page.patch +Patch119: lldpad-0.9.43-lldptool-better-TLV_ID-validation.patch +Patch120: lldpad-0.9.43-This-patch-fixes-a-warning-issued-when-building-the-.patch +Patch121: lldpad-0.9.43-lldpad-Avoid-possible-resource-leak-in-get_bcn.patch +Patch122: lldpad-0.9.43-Avoid-possible-resource-leaks.patch +Patch123: lldpad-0.9.43-lldpad-Fix-logging-to-no-longer-use-message-IDs.patch +Patch124: lldpad-0.9.43-lldpad-Fix-error-path-in-save_dcbx_version.patch +Patch125: lldpad-0.9.43-bugfix-to-print-all-profiles.patch +Patch126: lldpad-0.9.43-prevent-crash-on-invalid-response-code.patch +Patch127: lldpad-0.9.43-bugfix-go-to-VSI_EXIT-immediately-on-neg-response.patch +Patch128: lldpad-0.9.43-some-minor-bugfixes.patch Requires: kernel >= 2.6.32 BuildRequires: systemd-units BuildRequires: libconfig-devel >= 1.3.2 kernel-headers >= 2.6.32 @@ -32,12 +63,45 @@ Requires: %{name} = %{version}-%{release} Provides: dcbd-devel = %{version}-%{release} Obsoletes: dcbd-devel < 0.9.26 -%description devel +%description devel The %{name}-devel package contains header files for developing applications that use %{name}. %prep %setup -q -n open-lldp +# Upstream patches +%patch100 -p1 +%patch101 -p1 +%patch102 -p1 +%patch103 -p1 +%patch104 -p1 +%patch105 -p1 +%patch106 -p1 +%patch107 -p1 +%patch108 -p1 +%patch109 -p1 +%patch110 -p1 +%patch111 -p1 +%patch112 -p1 +%patch113 -p1 +%patch114 -p1 +%patch115 -p1 +%patch116 -p1 +%patch117 -p1 +%patch118 -p1 +%patch119 -p1 +%patch120 -p1 +%patch121 -p1 +%patch122 -p1 +%patch123 -p1 +%patch124 -p1 +%patch125 -p1 +%patch126 -p1 +%patch127 -p1 +%patch128 -p1 +# Submitted (not yet accepted upstream) patches +%patch50 -p1 +# Fedora patches %patch0 -p1 -b .make %patch1 -p1 -b .invalid-pointer @@ -60,13 +124,13 @@ fi %preun if [ $1 -eq 0 ]; then - systemctl stop %{name}.service - systemctl disable %{name}.service + systemctl stop %{name}.service + systemctl disable %{name}.service fi %postun if [ $1 -eq 1 ]; then - systemctl try-restart %{name}.service + systemctl try-restart %{name}.service fi %post devel @@ -98,6 +162,11 @@ fi %{_libdir}/pkgconfig/*.pc %changelog +* Tue Aug 30 2011 Petr Sabata - 0.9.43-2 +- Apply various upstream 0.9.43 bugfixes +- Include not yet accepted Jens Osterkamp's patch to fix bug #720080 +- Whitespace cleanup, phew + * Thu Jul 07 2011 Petr Sabata - 0.9.43-1 - 0.9.43 bump - Drop the the clean exit patch and our unit file, both are now included upstream