From 09844c63fb531026db31de252b80d548f256d12c Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Mon, 23 Dec 2024 16:03:30 +0100
Subject: [PATCH] added local address/as/identifier for bgp_topology

---
 README.md                                |   2 +-
 mkp/cisco_bgp_peer-1.0.2-20241220.mkp    | Bin 0 -> 5316 bytes
 source/agent_based/cisco_bgp_peer.py     | 181 ++++++++++++++++-------
 source/agent_based/inv_cisco_bgp_peer.py |  28 ++--
 source/packages/cisco_bgp_peer           |   6 +-
 5 files changed, 153 insertions(+), 64 deletions(-)
 create mode 100644 mkp/cisco_bgp_peer-1.0.2-20241220.mkp

diff --git a/README.md b/README.md
index f2d0b58..48a8679 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[PACKAGE]: ../../raw/master/mkp/cisco_bgp_peer-1.0.0-20230613.mkp "cisco_bgp_peer-1.0.0-20230613.mkp"
+[PACKAGE]: ../../raw/master/mkp/cisco_bgp_peer-1.0.2-20241220.mkp "cisco_bgp_peer-1.0.2-20241220.mkp"
 # Cisco BGP Peer
 
 Monitors status of Cisco BGP peers (IPv4 and IPv6, with basic support for VRFs on NXOS)
diff --git a/mkp/cisco_bgp_peer-1.0.2-20241220.mkp b/mkp/cisco_bgp_peer-1.0.2-20241220.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..2cc84073d786e387917b039e1f2b314f2cc45f04
GIT binary patch
literal 5316
zcmb`JRa+Ab13(Gs(K%2`N@8@EGz<ahkQ5xCG$RLsbVx`eFggWE>F!SH7>%PwcYN=U
z_-@Yid7g7~7@~2}s$urF7|%zh2ky&_q!YG}lqHYf^nNvLs|d|%`1_bjkM)q>PmkY7
z(VB#Cvr&{LBw34YJ-4+G#J`YxpO9$!yKT!H^dq8g^AGO>?jXVLMxsT!@7wTv(no@V
zXGxlvJFUC?{0&PNsEhYP_+Gfm`%z!5cFc;c-pHIG_JDVH4&nzkq{?$?#?;Z{zldrR
zLlJNuS#yaY{YK3Pz6Wn)*w8GusYr!EurVmk_D2J_m9NvJvZqtMn*%b@>P=O{5FlY~
zo7v-azlgl8ZE*DF``jV(SiNY~@xmb3-Ui4}zsS9**=<dQo!KYVd<n@M>xpo+t+(W|
z%Q<Lt>fK5k%PQPM2tu;qtFdY1jiZbt!$cXB8mt7o5H8!RsiqAFD(uKDEPnR~F&m=u
zpbzw&H^+;^76@;-(C=T^uOQs!l?GNx?^O^TFg$m@mUiO}D8S+c-XJdK)vm=+!=ApG
z@hR>;C<{&bKmt!h_Iw^BTC-)rYmqI8h$I*JAl5~QV*5efOaEKL)Oe5btkRG%yEbB?
z(Q9NC3^|nIV_&OjCbuQchIv&PjXU%k;(1v)I{74d^ZP-4*1KfIgd0syP7_nPR|an>
z^zd78$p>uJEyGzOYc)Ns>GiHJY-y)JEB)crOdkeJIWc*JTZrc!@QCF9VQ^qw;5U0r
zSZWuS1UDY86gcSw=JuMi3~|zXwM>snM7t!1Wbrj4*SsT9re3xLGWU%S3s`OLJtaq2
zAd4=Q$!@15P#JOh$D21N3IkccUo$wm+Aa##>7QN;QG&_#;1kv)SYJ1=O)@vp%x=Eg
zQ>IJ)g8k~_u8Os9THi-k!WvJoE(TPvOww_3-2pf;`yva!AiaFE<X~u|d9pMYf2YT%
z35rOcua}}rU~_0ju=z)fI3at^@I^ab+22cQG<Sdk&#2A0YWJgaq=c%JMFicC#_)dB
z$}^1QS(0Is@8)PT;MtCEa`Sm=L#`wC8NvF5`oVJ?a~)OGIKQNDAG)V>9=Zp92;Wo*
zeYOayBsdg^l9jLtQ1e@(_}-wrw$Jw=s?>t|ZG*}PVeV<_`baQ*`^jJfZ~?yiI9Zy9
zn1~jLi~Vfu_76Xs_En%EHcqJA<#jJ#0)Uw=Ol3LIN(hVfNj|F*zk@M02(@-|4kv?M
z_ou=NaS2-c2V1-@Pfo<{4NdlQUOzlNJ==w36FhYgqpw$8JtKm_oEKjzI*d?HQ~y*S
zU@k240p5Ru`=|~A#H6HXI`4>8+EC3;-=&+(VeKv7oIl(?zd3p?ZHdi4{zDD*aTzhV
zUVjR*vd;eV49Jy$wyi@(=Z0GSziZLnzdyrg_9QvyzekQu9J14&;O0#%-Ytcrag8h-
z1sZ7$X2cr*p~fo8MzjTy2t$(B$i3nJRfMD4X|@noZ^UnpYzKGIvVBo~v%AAxkS6(_
zhs15=_*ETFel=hX1fcwgZlEeZhwA5?@1k+TmwoqMY7}>yPR1+f65m^|d!d&+%vhJr
zgFaL}C7os%w3NYyLB>#$#P()#Mc_N1*m+<LD-UnbMaUVerAtuUUw325J)f?&&hY1D
zq+q5?>KC3Rd#$z*UL~*B?Evy)ZReSZ08)+31(TB#-4}-o9m(W!`13jfpiKKHH-~m2
zNE)H=Y?IWmtrT2buAk*6#Gn`f^d#Cqkv=?AJRLAFbQR0(MS!2)1-HhT$wZ&k#qH`j
z?ua?>BqoONh*t|4$D+htqlLl*oyUVnX1YAqH#v6smRdqqC7ym#L)VdMRzbT#^e;qn
zx_^0eJ7m66EmC~}g&ePzGa&~1mr)I{VE*#lgE49Gb%$0FLK<e7ZhaxNXpN;u>9E%;
z>e+9DF0U?b;qf<hF<I!5AB83veu(lK4z(Q$)Lvh4eA<eQKB%2v{t~3~)&N(WwWZzm
z=?}RXOiG^6H7`!HbJ?}VvyIOHKt@(cFQj<Iv~)*-;T%${r~zsd!yf3I-u7|9_<5^i
zS2%{s+!@|GoLzrhq`Sg+?v9Mh__@Dha?b>Knax04r7NmFaIWqToNk;E4h=A6SXLnn
zdHKrS-Nd?z>>qmJzNOG;B;RS+;U#@XH#ME%K4F@UdR9RiJ02Jl&gxk_Ke{CCa6PHQ
zp**p4#84CKU40-28DRXQS;cn9*!(~w=slU}GCNH3rhe@NJYFtmv}IoQdFT=U+*$Q7
zaWLcCqJrl_t|QLX#?I|Qia@wJjwb=S#!A!#6`$A*_IVTjhIJa9tkBHBt)lunLSX8}
z;z7XMlyZTWw$Ug>^zpdnGp?m7KEwxKHELiE*Lnt3E(#(LyVSM?<=#&Kek!12xJ?@P
z`B$^>s`a90(7ksu8`eJIx)6Y+0EIB3!Wp856(9GBH6FqGk&7gNuKt}h9_3HDC^f6>
z*@rvOkA@I4#$Hu-J8m4D_xR&f=J5qw@}LDuu=9YFdlP49<Lre%y~AXVsglK*LtP#e
z&xK=KaEgClAeD$FbYyRQNz2U{Y{lYUnr_%TM%8lp@@gV6x?xxzaEFvH0F(M2Q+S3i
z2-6zR3F|K^Fo;x7g?GrMpy^hPr&47)6}buI)pA_;yUb`i#elRd;c1!N6sk^XnK%$4
zsm>>6h9GiRl|}@56hoi~SZgw2=8i#cN!~E|7$D#k^SYRp=FoEWCACPY+olU$sR1pg
zwhl8(l0ih;k7BVp$AZ8g0SX8b_Vufjs@_Z{y-v<)La6FjF?T<9sysPxM(58{nzGjJ
zyhNJRKe#*J2hz8+d|ZaQ;>v;t<%>8u2bU)gEE}czT_Tx0y8PccPXi0}EqctQj}5*n
z>5b&OQ&Rz%@$^S)$(Qz+2ZLK|lc0|Az4;l?Hjy#-Htcb8a}`;8PWDBD4f&<ux;3#2
zjagX#ElwcAWSb3yItuEH{=20V9Q2-rZnoSr+=)sUYE771*@6zK2_TVB&gx<`lYSML
z82!GV%f>OHrhqr^(}hS0wEKZ^5d1-V3oApM%Z;;s{U_N-((uoyzgCqr?Jeo{fwe<7
zM2shp3U+3K8*KnNr-bVY87}a_c;K(XFt6!LBJUK~*qPeLj%+&qSeoxK%7kl#-<0jp
z$DAocllmn|7etR_lX_nWP-0N#QgC*4ZuK_mF{@`wR8OOHX~O=EMKHq!S_%RiFs<&)
zw9~UPy|l8uw5DHSbBi`7v6zN_^>)t&cV`*$CM#afXsFFcw$KOprX46#7~@B4FrP-N
zZJ$IdYKF7ra^gKJaD6UWwTqwWiC2vVr0nsiE!V09VSWTDscYZhr{wm*VS+dJJh$!x
z&ehSv+pUB{0t9k@l+0EJ^X8Gb>JgHh>qUNW39d@_Wi7gDWFOP^lkA!`cEVQ}`ZC3x
z-_!2pqEc_u4fdO3q0HzB<Zo5KEw9NBx8j?kCs-I(`L{~`2bRbDq4C*cGvX{oU4)*e
z7%{FmrQ1D{={gk3T*8J>5n-USaPmH%5>j`NI113Du`}_yH}!QPh^VRh`6$Bjg;~!Z
zYI>jechWneM{@b64W=4M=WqT6m1O;dNXFiksa=Qf>2eB+SSz~k-l)(ff-MrTEif>5
zTZU$nhpFXKY9e{Y){5-`bhbsVk*2*Y!+Kh6-v}N(gvO?y2{V(WVzB>};rf|uS6l0>
z*aw+#4HP2J^b_TnLk&RvoXO|lcU<^D)rv$5m!ch^29Ale1VM#LDXY&g!UQzofyE89
zthSTK8ZWGX0^yn1sjqPvkJQ=}@&lT3v#5XWwI+<mK6J(twfaE`6T}zZ7VRm)Y0BS5
zyKIo=%xnT2mcN7eaTUmkRx#1J3QYm<UQ&>pt7ce6_rvyM9l_pfn`6XhJ0?(tDC<M1
zQ5lzcwNb0YFAna5{A#HgUhC4LVqe5esyC(CAOfk+XXAWVb5`Dn_e;fnWsqJ?jB8av
zgKe~?AIrzS3@tIr*Wk#;@lAm}jnEs-uEm8ycaYM6;9_f3v&v6XbA5pvE`gL(Ju3|J
zPLQ<YCU-L2ljXlN2VOI2v&EPERW!CPi8-_WT<~zCU19gLus%szZ+R#;VW93TW}CW~
z+5_9aONB`D2O}7Yn_4)&VBo}wOfcd}d=&Z+Hrzd$9QAXRj%%mBSWk$ipxO<R3SO<L
z_^e;q&#D&6XIWDhn|JlfHq?3CF{6llKDwxG(IG`~Q1u5+RFnaq4@c6v?=L0{ZS@bQ
zv|}|n7|(^>uw+lMj5v8SJ@|ksX0dxZm8mdiPl~EMK@)YYQhn2~HPES!(M9Auha>Tu
z+u%fg0aN+Zd|6=8g*gHJ0;83zZ|7SJD~|Z;Ru+z!)1qQHRZNXz-f8tX;iKy5#K(AZ
z_FasUc=`Mt+T8@7*32^+_O)ngOSfUtpFH2;^zt>wnoX$kk3+SrMt4$G=jo0gJ730d
z?fQcUxfK7lhx&$BQqncCWrSW5H-PC1ritigJ*`USYtMch(*M<07*FhjVhZv*lpS(D
zX6o&i*;lhI8@dDwyz?}mP{LzR#<!nKj=XhE)_+$9V6iBVbmjg0<=3LlXQ8n<=^-7T
zzqJ?V*{Xz!01(Rq#FmdAhBYg}K3i0l_E<2Dwe94nv$H`#n5ox1FsiFje_I~e1rydM
z*Gh(&CJ#7$_vG>PndR;q=qCE0<q;LhJK~~FE{mrK{oK7fXIr?6bJfIAtov|h3H<b}
zWLA&gwl`M-w8!;eX<K|WTKbj>leb!(<`RDsKi8WbFH0wdP~g%E$=#v`DxUi^^$D&r
zG&hX`-_j!Tmli;eKiozv#Z=oP=KLD=!M}%|boLXP74E~%s-U8-H`j&wNgvICNo6M<
z^O=bz`?wuN3sE7Oi5?Ujelg0gLv<xx(ICtgY*8+ek}HuLYnY!_a8(LX1Z-?juoYCd
zNta279J_@w)^t6Q_gtV!6n<_~pSBIFpb!8lLjf-n_pL>7vSbb&7!^wWFjevDiMDzZ
z&*-%}=j*K`KM^X?rH`KX7Ld=WT1(0a%NFNb6wTpEG*l@3GA?H`R}P9z`XE;SuAE=~
z8+5eDbgQ(q-~MVY&omb?|GD*bhc6kO5sva)%=Bfc6yf%wGiIesw)4E2@VT5C-z&)g
zo?0x0n4X#&NBxW203ff$wmm`#ehJ){Sv56WCA3M#R-v4^l(z{iH1XNiy|_{5{<UzN
ze~81Gf`1K!$CHOA4u{tai-7Zs1wB|Zz+7#v072}dmxc|m*E^%;a?DlcAIX7F6J>d_
zv(sbi;<=I;2miLnR<`-gf$r#K!UA*6C4g={WTz1lxQq4SGkpr1Y+s8AvF7~JIpEKd
zsg`JEKv6_;^-}7=9a^f1rn={vHTA28ZJj+8<uYHzY?}h|Js-AB9=o;b3yqQr55UvG
z#;THh70)M!%}=Fm{Ir`)dg^s+4;lzgqJYANsQW`^Kl*8c+iqkWBLMfpt~$_N6vCf%
zR_@m)^6E41V%_zZ3tt|Xg(3E861AheJQlv8osA@b-E*bo8<h0WU0cNL8$P5p?BofD
zNy^_5S!jr$Ev7MR7F{@@8r?U_BF?2=sKT+3G1@Gk+D{?n;R5Xx?c<m0b}x9WGV`gx
zi|U5ylE@@6up6c_{pZw$Y&u&J{1GDvk^pq>MnRz)%9C}`U|g>-ybdzX6;hDj3+x6#
zqK4O04TAIy<ZKO;se)()`Z80vUk$4D<TF^e#{t*|X$8RFg56eR>65G^BDu1D6u6Cj
z&4fjFK&6<mRX=ZvlhYWNIHZf$wzb5A$zi_!T~j0m?U@qI;EW^9po=Y_ce-AnhXB`@
zt|~e=%nZP4Wch-(ZfxYlUr6+LgWIu3pgizH-Rh8wXyc9%>I}QF5K;TC_0;pPP2(%u
zDbK(jLa~v-!Dj7dneYr3Dt~6tO>Py|uDBN(Vau*5-(*m6oyORYV;*B-BQsIRC7|uC
z6RfqkNSeMViFHe&@0TVddX3lWXW7oN;qw01WRGL#dKHd2%00pkJaXdwW>jAsJ>yKZ
z{-?})R&HGico%j&Th6e-wO7^nqd?jlb{29A```C1H2=N=(Ozz%oF^BlP1xFQZLLTG
zmD{$~o3&2!CM&kc^VfcKgtt#>asQP(BOW(o_oj;k6LXfyjDW()maURWVzex#=FMH)
zo<z=^T07+qxS{urqYp$iIB+YldK&ki{whOZ3u>=A76pI(3Ffa{b*E|?9T|uK0n?G&
z-yP4B;j&1SEIr_^Cz!qM$&T-EzT^4*^HcD~HN#2DMTs=Y*?BZX^7$gT)lp>7nO52K
zJ_~yX9|1}oq}6W-c|sEnROG#cy&bD;#e>qWq<}D8zrWLEhvWAe@^)T!O=ESyda;;$
zl$d<@Q!d^H_KkIGB-He*AVt)OYzKIbT7w!vc?hyaWWr!WBi+X~Bz&+Z1Q~I1x|8f?
z6(X@eg-$PJ|AiWdabs*6X|&U;i_CNfz7<+~%E@X6HZ5UEmW6#6K{KVZ<O!Bi{TYIP
z90qkt;L|vcLb19J!Uo(|F)DAR;ja3`GMXi$Mr}|SXX^V&<J^(dTM^wg9aVkNE!qPb
zW<C$TPpTiKP}ydQK<9RJ%>N8e%5Kz2yb4?C2T8zvILu{+@lJ1Y;KFN2Dy<QY&Yo=L
ziuX>JUPdY@1}VHL4$ogSn;<=r=WG8A(&{6)AzSr2BjaM=*I+XVmlFE5@fW)l2WCR)
z0uf!3G)2tKqSl-XUquIor+n>l;(~hP6m#YnhPT==m(s+K!~fifrxzxUQgur7EpO}I
zelaSU9@g+v#UmpeuAx8#qw9enZ}OJJvt{^w)N<XZibeG(S3^7>E(LNBFTYNT)#ZQ9
ziR8Kcts(mR<$eGMoi4<8SJxl73|jXTe{c?J7+Il1JH8NoQ}*^){uXr^k6<`oF_+nY
z(zag!e!q+vZ%t-X@AH3RAZn4mS~u~Jw+|0~Crn|Wt06qA_kTc#_#-voSlSmY2Mz6i
D6H#0(

literal 0
HcmV?d00001

diff --git a/source/agent_based/cisco_bgp_peer.py b/source/agent_based/cisco_bgp_peer.py
index cbf1259..a39204b 100644
--- a/source/agent_based/cisco_bgp_peer.py
+++ b/source/agent_based/cisco_bgp_peer.py
@@ -54,30 +54,30 @@
 # 2022-05-09: added item to BgpPeer class, this is used in the discovery function
 # 2022-05-11: changed bgp_get_peer_entry to get proper parameters instead of Nontransparent list
 #             added remote_as to BgpPeerItem
-#
+# 2024-07-19: added in peerv2 local/remote AS/ID/Address for BGP topology
+# 2024-12-20: added local address/as/identifier in cisco_bgp_peer for bgp_topology
+# 2024-12-23: added local address/as/identifier in cisco_bgp_peer_3 for bgp_topology
+#             fixed item in cisco_bgp_peer_3
 
-import copy
-from typing import List, Dict, Optional, Tuple
 from dataclasses import dataclass
+from typing import List, Dict, Optional, Tuple
+import copy
 
 from cmk.base.plugins.agent_based.agent_based_api.v1 import (
-    register,
+    OIDBytes,
+    OIDEnd,
     SNMPTree,
-    exists,
-    contains,
     all_of,
-    OIDEnd,
-    OIDBytes,
-)
-from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
-    StringTable,
-    StringByteTable,
+    contains,
+    exists,
+    register,
 )
-
+from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import StringByteTable
 from cmk.base.plugins.agent_based.utils.bgp_peer import (
-    bgp_get_ip_address_from_oid,
     BgpPeer,
+    bgp_get_ip_address_from_oid,
     bgp_get_peer_entry,
+    bgp_render_ip_address,
 )
 
 ###########################################################################
@@ -98,31 +98,46 @@ class CiscoPrefixes:
     prefix_threshold: Optional[int]
 
 
-def parse_cisco_bgp_peer(string_table: List[StringTable]) -> Dict[str, BgpPeer]:
-    cbgpPeer2Entry, cbgpPeer2AddrFamily = string_table
+def parse_cisco_bgp_peer(string_table: List[StringByteTable]) -> Dict[str, BgpPeer]:
+    peer2_entry, peer2_addr_family, base_local_as = string_table
+
+    try:
+        base_local_as = base_local_as[0][0]
+    except (ValueError, IndexError):
+        base_local_as = None
 
     peer_prefixes = {}
     # create dictionary by peer address and list of entries per address family
-    for entry in cbgpPeer2AddrFamily:
-        oid_end, addrfamilyname, acceptedprefixes, deniedprefixes, prefixadminlimit, prefixthreshold, \
-        prefixclearthreshold, advertisedprefixes, suppressedprefixes, withdrawnprefixes = entry
+    for entry in peer2_addr_family:
+        (
+            oid_end,
+            addr_family_name,
+            accepted_prefixes,
+            denied_prefixes,
+            prefix_admin_limit,
+            prefix_threshold,
+            prefix_clear_threshold,
+            advertised_prefixes,
+            suppressed_prefixes,
+            withdrawn_prefixes
+        ) = entry
 
         if not oid_end == '':
             remote_addr = bgp_get_ip_address_from_oid(oid_end)
             prefixes = CiscoPrefixes(
-                address_family=addrfamilyname,
+                address_family=addr_family_name,
                 metric_count=[],
                 metric_rate=[],
-                accepted_prefixes=int(acceptedprefixes) if acceptedprefixes.isdigit() else None,
-                prefix_admin_limit=int(prefixadminlimit) if prefixadminlimit.isdigit() else None,
-                prefix_clear_threshold=int(prefixthreshold) if prefixthreshold.isdigit() else None,
-                prefix_threshold=int(prefixthreshold) if prefixthreshold.isdigit() else None
+                accepted_prefixes=int(accepted_prefixes) if accepted_prefixes.isdigit() else None,
+                prefix_admin_limit=int(prefix_admin_limit) if prefix_admin_limit.isdigit() else None,
+                prefix_clear_threshold=int(prefix_threshold) if prefix_threshold.isdigit() else None,
+                prefix_threshold=int(prefix_threshold) if prefix_threshold.isdigit() else None
             )
             for key, value in [
-                ('advertisedprefixes', advertisedprefixes),
-                ('deniedprefixes', deniedprefixes),
-                ('suppressedprefixes', suppressedprefixes),
-                ('withdrawnprefixes', withdrawnprefixes),
+                ('advertisedprefixes', advertised_prefixes),
+                ('deniedprefixes', denied_prefixes),
+                ('suppressedprefixes', suppressed_prefixes),
+                ('withdrawnprefixes', withdrawn_prefixes),
             ]:
                 try:
                     prefixes.metric_rate.append((key, int(value)))
@@ -136,23 +151,49 @@ def parse_cisco_bgp_peer(string_table: List[StringTable]) -> Dict[str, BgpPeer]:
 
     # create dictionary from cbgpPeer2Entry (peer ip address as index)
     peer_table: Dict[str, BgpPeer] = {}
-    for entry in cbgpPeer2Entry:
-        remote_addr, peer_state, admin_state, remote_as, in_updates, out_updates, in_messages, out_messages, \
-        fsm_established_transitions, fsm_established_time, in_update_elapsed_time = entry
+    for entry in peer2_entry:
+        (
+            remote_addr,
+            peer_state,
+            admin_state,
+            local_addr,
+            local_as,
+            local_id,
+            remote_as,
+            remote_id,
+            in_updates,
+            out_updates,
+            in_messages,
+            out_messages,
+            fsm_established_transitions,
+            fsm_established_time,
+            in_update_elapsed_time
+        ) = entry
+
+        if len(local_addr) == 4:
+            local_addr_type = '1'  # IPv4
+        elif len(local_addr) == 16:
+            local_addr_type = '2'  # IPv6
+        else:
+            local_addr_type = '0'
 
         remote_addr = bgp_get_ip_address_from_oid(remote_addr)
         bgp_peer = bgp_get_peer_entry(
-            remote_addr=remote_addr,
-            peer_state=peer_state,
             admin_state=admin_state,
-            remote_as=remote_as,
-            in_updates=in_updates,
-            out_updates=out_updates,
+            fsm_established_time=fsm_established_time,
+            fsm_established_transitions=fsm_established_transitions,
             in_messages=in_messages,
+            in_update_elapsed_time=in_update_elapsed_time,
+            in_updates=in_updates,
+            local_addr=bgp_render_ip_address(local_addr_type, local_addr),
+            local_as=local_as if local_as != '0' else base_local_as,
+            local_id=local_id,
             out_messages=out_messages,
-            fsm_established_transitions=fsm_established_transitions,
-            fsm_established_time=fsm_established_time,
-            in_update_elapsed_time=in_update_elapsed_time
+            out_updates=out_updates,
+            peer_state=peer_state,
+            remote_addr=remote_addr,
+            remote_as=remote_as,
+            remote_id=remote_id,
         )
         if bgp_peer:
             prefixes = peer_prefixes.get(remote_addr, [])
@@ -187,7 +228,11 @@ register.snmp_section(
                 OIDEnd(),
                 '3',  # cbgpPeer2State
                 '4',  # cbgpPeer2AdminStatus
+                OIDBytes('6'),  # cbgpPeer2LocalAddr
+                '8',  # cbgpPeer2LocalAs -> empty
+                '9',  # cbgpPeer2LocalIdentifier
                 '11',  # cbgpPeer2RemoteAs
+                '12',  # cbgpPeer2RemoteIdentifier
                 '13',  # cbgpPeer2InUpdates
                 '14',  # cbgpPeer2OutUpdates
                 '15',  # cbgpPeer2InTotalMessages
@@ -214,6 +259,12 @@ register.snmp_section(
                 '8.1.8',  # cbgpPeer2WithdrawnPrefixes
             ]
         ),
+        SNMPTree(
+            base='.1.3.6.1.2.1.15',  # BGP-4-MIB
+            oids=[
+                '2',  # bgpLocalAs
+            ]
+        )
     ],
     detect=all_of(
         contains('.1.3.6.1.2.1.1.1.0', 'Cisco'),
@@ -232,31 +283,55 @@ register.snmp_section(
 def parse_cisco_bgp_peer_3(string_table: StringByteTable) -> Optional[Dict[str, BgpPeer]]:
     peer_table = {}
     for entry in string_table:
-        remote_addr_type, remote_addr, routing_instance, peer_state, admin_state, remote_as, in_updates, out_updates, \
-        in_messages, out_messages,  fsm_established_transitions, fsm_established_time, in_update_elapsed_time = entry
+        (
+            remote_addr_type,
+            remote_addr,
+            routing_instance,
+            peer_state,
+            admin_state,
+            local_addr,
+            local_as,
+            local_id,
+            remote_as,
+            remote_id,
+            in_updates,
+            out_updates,
+            in_messages,
+            out_messages,
+            fsm_established_transitions,
+            fsm_established_time,
+            in_update_elapsed_time
+        ) = entry
 
         if remote_addr_type == '1':  # IPv4 address
             remote_addr = '.'.join(f'{m}' for m in remote_addr)
-            routing_instance = None
+            local_addr = '.'.join(f'{m}' for m in local_addr)
+
             if routing_instance != 'default':
                 routing_instance = f'vrf {routing_instance}'
+            else:
+                routing_instance = None
 
             bgp_peer = bgp_get_peer_entry(
-                remote_addr=remote_addr,
-                peer_state=peer_state,
                 admin_state=admin_state,
-                remote_as=remote_as,
-                in_updates=in_updates,
-                out_updates=out_updates,
+                fsm_established_time=fsm_established_time,
+                fsm_established_transitions=fsm_established_transitions,
                 in_messages=in_messages,
+                in_update_elapsed_time=in_update_elapsed_time,
+                in_updates=in_updates,
                 out_messages=out_messages,
-                fsm_established_transitions=fsm_established_transitions,
-                fsm_established_time=fsm_established_time,
-                in_update_elapsed_time=in_update_elapsed_time
+                out_updates=out_updates,
+                peer_state=peer_state,
+                remote_addr=remote_addr,
+                remote_as=remote_as,
+                remote_id=remote_id,
+                local_addr=local_addr,
+                local_as=local_as,
+                local_id=local_id,
             )
             if bgp_peer:
-                bgp_peer[remote_addr].item['routing_instance'] = routing_instance
                 if routing_instance:
+                    bgp_peer[remote_addr].item['routing_instance'] = routing_instance
                     item = f'{remote_addr} {routing_instance}'
                     bgp_peer = {item: bgp_peer[remote_addr]}
                 peer_table.update(bgp_peer)
@@ -276,7 +351,11 @@ register.snmp_section(
                 '4',  # cbgpPeer3VrfName
                 '5',  # cbgpPeer3State
                 '6',  # cbgpPeer3AdminStatus
+                OIDBytes('8'),  # cbgpPeer3LocalAddr
+                '10',  # cbgpPeer3LocalAs
+                '11',  # cbgpPeer3LocalIdentifier
                 '13',  # cbgpPeer3RemoteAs
+                '14',  # cbgpPeer3RemoteIdentifier
                 '15',  # cbgpPeer3InUpdates
                 '16',  # cbgpPeer3OutUpdates
                 '17',  # cbgpPeer3InTotalMessages
diff --git a/source/agent_based/inv_cisco_bgp_peer.py b/source/agent_based/inv_cisco_bgp_peer.py
index bf074b4..c2db485 100644
--- a/source/agent_based/inv_cisco_bgp_peer.py
+++ b/source/agent_based/inv_cisco_bgp_peer.py
@@ -15,13 +15,13 @@
 
 from typing import List
 from cmk.base.plugins.agent_based.agent_based_api.v1 import (
-    register,
+    OIDBytes,
+    OIDEnd,
     SNMPTree,
-    exists,
-    contains,
     all_of,
-    OIDEnd,
-    OIDBytes,
+    contains,
+    exists,
+    register,
 )
 from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     StringByteTable
@@ -29,9 +29,9 @@ from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
 from cmk.base.plugins.agent_based.utils.bgp_peer import (
     InvBgpPeer,
     bgp_error_as_string,
-    bgp_render_ip_address,
-    bgp_get_ip_address_from_oid,
     bgp_error_code_as_hex,
+    bgp_get_ip_address_from_oid,
+    bgp_render_ip_address,
     get_bgp_type,
 )
 
@@ -49,8 +49,18 @@ def parse_inv_cisco_bgp_peer(string_table: List[StringByteTable]):
 
     for entry in peers:
         try:
-            oid_end, state, local_addr, local_as, local_id, remote_as, remote_id, last_error, \
-            fsm_established_time, last_errortxt = entry
+            (
+                oid_end,
+                state,
+                local_addr,
+                local_as,
+                local_id,
+                remote_as,
+                remote_id,
+                last_error,
+                fsm_established_time,
+                last_error_txt
+            ) = entry
         except ValueError:
             return
 
diff --git a/source/packages/cisco_bgp_peer b/source/packages/cisco_bgp_peer
index d758634..16c0651 100644
--- a/source/packages/cisco_bgp_peer
+++ b/source/packages/cisco_bgp_peer
@@ -20,7 +20,7 @@
  'files': {'agent_based': ['cisco_bgp_peer.py', 'inv_cisco_bgp_peer.py']},
  'name': 'cisco_bgp_peer',
  'title': 'Cisco BGP Peer',
- 'version': '1.0.0-20230613',
+ 'version': '1.0.2-20241220',
  'version.min_required': '2.0.0b1',
- 'version.packaged': '2.2.0p24',
- 'version.usable_until': None}
+ 'version.packaged': 'cmk-mkp-tool 0.2.0',
+ 'version.usable_until': '2.4.0b1'}
-- 
GitLab