キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 
cancel
5244
閲覧回数
0
いいね!
0
コメント
yushimaz
Cisco Employee
Cisco Employee

  

1. ELAM とは

 

ELAM (Embedded Logic Analyzer Module) は、Cisco ASIC 内の packet 転送を確認するための Tool で、ACI 固有の Tool ではなく、一部の Catalyst や Nexus Series Switch 上でも動作します。 Nexus 9000 シリーズ製品: ELAM の概要 に、Standalone mode での使用方法や説明が記載されているので、ELAM についてはそちらの document もご参照ください。 ELAM の設定や出力は ASIC によって異なるため注意が必要です。

 

2. ELAM Assistant とは

image1.png


ELAM 設定を APIC GUI 上で設定できる Tool で、Cisco ACI App Center から download して使用することができます。

APIC Postman の紹介 に記載されている方法で install することができます。 ACI Apps を使用したことがない人は APIC Postman の紹介 もご参照ください。

ACI Fabric は、複数台の Leaf/Spine Switch によって構成されているため、packet が drop している箇所を特定するために、複数台の switch で ELAM capture を行う必要があり、各 switch に login して設定を行う必要がありますが、この Tool を使うことで、APIC 上で、複数台の switch に対して一度に設定を行うことができます。 また、ELAM Assistant が support している switch は、第二世代の (EX, FX, GX Series) switch になりますが、これら switch の ELAM 出力は、ASIC の内部構造を理解していないと読むことができない、難解な出力になっていますが、ELAM Assistant は、解析に必要な部分を human readable な形式に変換してくれるため、比較的簡単に結果を確認することができます。

例えば、下記のような出力は、 

*** Parsed l2 vector
hom_pr_lu_vec_l2v: 0x00000000000005DE100000000F4CFE237646DF4CFE237646F
  hom_pr_lu_vec_l2v.da: 0xF4CFE237646F
    hom_pr_lu_vec_l2v.da.trill: 0xF4CFE237646F
      hom_pr_lu_vec_l2v.da.trill.ce_da: 0xF4CFE237646F
    hom_pr_lu_vec_l2v.da.ce_da: 0xF4CFE237646F
    hom_pr_lu_vec_l2v.da.dce_da: 0xF4CFE237646F
  hom_pr_lu_vec_l2v.sa: 0xF4CFE237646D
    hom_pr_lu_vec_l2v.sa.trill: 0xF4CFE237646D
      hom_pr_lu_vec_l2v.sa.trill.irbid: 0x646D
      hom_pr_lu_vec_l2v.sa.trill.erbid: 0xE237
      hom_pr_lu_vec_l2v.sa.trill.spare: 0xF4CF
    hom_pr_lu_vec_l2v.sa.ce_sa: 0xF4CFE237646D
    hom_pr_lu_vec_l2v.sa.dce_sa: 0xF4CFE237646D
  hom_pr_lu_vec_l2v.vntag_vld: 0x0
  hom_pr_lu_vec_l2v.ivntag_vld: 0x0
  hom_pr_lu_vec_l2v.vir: 0x0
    hom_pr_lu_vec_l2v.vir.vntag: 0x0
      hom_pr_lu_vec_l2v.vir.vntag.svif: 0x0
      hom_pr_lu_vec_l2v.vir.vntag.dvif: 0x0
      hom_pr_lu_vec_l2v.vir.vntag.e: 0x0
      hom_pr_lu_vec_l2v.vir.vntag.l: 0x0
      hom_pr_lu_vec_l2v.vir.vntag.p: 0x0
      hom_pr_lu_vec_l2v.vir.vntag.dir: 0x0
    hom_pr_lu_vec_l2v.vir.ivntag: 0x0
      hom_pr_lu_vec_l2v.vir.ivntag.svif: 0x0
      hom_pr_lu_vec_l2v.vir.ivntag.dvif: 0x0
      hom_pr_lu_vec_l2v.vir.ivntag.pcp: 0x0
      hom_pr_lu_vec_l2v.vir.ivntag.de: 0x0
  hom_pr_lu_vec_l2v.qtag0_vld: 0x1
  hom_pr_lu_vec_l2v.qtag0_cos: 0x0
  hom_pr_lu_vec_l2v.qtag0_de: 0x0
  hom_pr_lu_vec_l2v.qtag0_vlan: 0x2EF
  hom_pr_lu_vec_l2v.qtag1_vld: 0x0
  hom_pr_lu_vec_l2v.qtag1_cos: 0x0
  hom_pr_lu_vec_l2v.qtag1_de: 0x0
  hom_pr_lu_vec_l2v.qtag1_vlan: 0x0
  hom_pr_lu_vec_l2v.dce_vld: 0x0
  hom_pr_lu_vec_l2v.trill_vld: 0x0
  hom_pr_lu_vec_l2v.l2mp: 0x0
    hom_pr_lu_vec_l2v.l2mp.dce: 0x0
      hom_pr_lu_vec_l2v.l2mp.dce.ftag: 0x0
      hom_pr_lu_vec_l2v.l2mp.dce.ttl: 0x0
    hom_pr_lu_vec_l2v.l2mp.trill: 0x0
      hom_pr_lu_vec_l2v.l2mp.trill.V: 0x0
      hom_pr_lu_vec_l2v.l2mp.trill.R: 0x0
      hom_pr_lu_vec_l2v.l2mp.trill.M: 0x0
      hom_pr_lu_vec_l2v.l2mp.trill.oplen: 0x0
      hom_pr_lu_vec_l2v.l2mp.trill.hopct: 0x0
  hom_pr_lu_vec_l2v.cmd_vld: 0x0
  hom_pr_lu_vec_l2v.cmd_sgt_vld: 0x0
  hom_pr_lu_vec_l2v.cmd_sgt: 0x0
  hom_pr_lu_vec_l2v.cmd_dgt_vld: 0x0
  hom_pr_lu_vec_l2v.cmd_dgt: 0x0
  hom_pr_lu_vec_l2v.cntag_vld: 0x0
  hom_pr_lu_vec_l2v.snap_vld: 0x0
*** Parsed l3 vector
hom_pr_lu_vec_l3v: 0x00000000000000000000000000C0A84B01000000000000000000000000C0A84B02AA3B01FF000000A8002A022
  hom_pr_lu_vec_l3v.ce: 0x00000000000000000000000000C0A84B01000000000000000000000000C0A84B02AA3B01FF000000A8002A022
    hom_pr_lu_vec_l3v.ce.l3_type: 0x2
    hom_pr_lu_vec_l3v.ce.pyld_len: 0x4
    hom_pr_lu_vec_l3v.ce.etype: 0xA8
    hom_pr_lu_vec_l3v.ce.pyld: 0x302A12C0AA8EC07FC000002A0
    hom_pr_lu_vec_l3v.ce.ce_spare: 0x000000000000000000000000302A12C040000000000000000
  hom_pr_lu_vec_l3v.fc: 0x00000000000000000000000000C0A84B01000000000000000000000000C0A84B02AA3B01FF000000A8002A022
    hom_pr_lu_vec_l3v.fc.l3_type: 0x2
    hom_pr_lu_vec_l3v.fc.pyld_len: 0x4
    hom_pr_lu_vec_l3v.fc.etype: 0xA8
    hom_pr_lu_vec_l3v.fc.esof: 0x0
    hom_pr_lu_vec_l3v.fc.r_ctl: 0x2A
    hom_pr_lu_vec_l3v.fc.d_id: 0xC00000
    hom_pr_lu_vec_l3v.fc.cs_ctl: 0x7F
    hom_pr_lu_vec_l3v.fc.s_id: 0xAA8EC0
    hom_pr_lu_vec_l3v.fc.fc_type: 0xC0
    hom_pr_lu_vec_l3v.fc.f_ctl: 0x302A12
    hom_pr_lu_vec_l3v.fc.df_ctl: 0x0
    hom_pr_lu_vec_l3v.fc.ox_id: 0x0
    hom_pr_lu_vec_l3v.fc.rx_id: 0x0
    hom_pr_lu_vec_l3v.fc.pyld: 0x000302A12C040000000000000
    hom_pr_lu_vec_l3v.fc.vft_vld: 0x0
    hom_pr_lu_vec_l3v.fc.vft_type: 0x0
    hom_pr_lu_vec_l3v.fc.vft_prio: 0x0
    hom_pr_lu_vec_l3v.fc.vft_vfid: 0x0
    hom_pr_lu_vec_l3v.fc.vft_hopct: 0x0
    hom_pr_lu_vec_l3v.fc.eisl_vld: 0x0
    hom_pr_lu_vec_l3v.fc.mpls_vld: 0x0
    hom_pr_lu_vec_l3v.fc.label_lbl: 0x0
    hom_pr_lu_vec_l3v.fc.label_ttl: 0x0
    hom_pr_lu_vec_l3v.fc.label_exp: 0x0
    hom_pr_lu_vec_l3v.fc.label_s: 0x0
    hom_pr_lu_vec_l3v.fc.fc_spare: 0x0
  hom_pr_lu_vec_l3v.ip: 0x00000000000000000000000000C0A84B01000000000000000000000000C0A84B02AA3B01FF000000A8002A022
    hom_pr_lu_vec_l3v.ip.l3_type: 0x2
    hom_pr_lu_vec_l3v.ip.pyld_len: 0x4
    hom_pr_lu_vec_l3v.ip.v6: 0x0
    hom_pr_lu_vec_l3v.ip.ver: 0x4
    hom_pr_lu_vec_l3v.ip.hl: 0x5
    hom_pr_lu_vec_l3v.ip.dscp: 0x0
    hom_pr_lu_vec_l3v.ip.ecn: 0x0
    hom_pr_lu_vec_l3v.ip.v6_hbh: 0x0
    hom_pr_lu_vec_l3v.ip.v6_frag: 0x0
    hom_pr_lu_vec_l3v.ip.pklen: 0x54
    hom_pr_lu_vec_l3v.ip.df: 0x0
    hom_pr_lu_vec_l3v.ip.mf: 0x0
    hom_pr_lu_vec_l3v.ip.fragoff: 0x0
    hom_pr_lu_vec_l3v.ip.ttl: 0xFF
    hom_pr_lu_vec_l3v.ip.prot: 0x1
    hom_pr_lu_vec_l3v.ip.csum: 0xAA3B
    hom_pr_lu_vec_l3v.ip.da: 0x00000000000000000C0A84B02
    hom_pr_lu_vec_l3v.ip.sa: 0x00000000000000000C0A84B01
    hom_pr_lu_vec_l3v.ip.mpls_null: 0x0
    hom_pr_lu_vec_l3v.ip.mpls_exp: 0x0
    hom_pr_lu_vec_l3v.ip.ip_spare: 0x0
  hom_pr_lu_vec_l3v.arp: 0x00000000000000000000000000C0A84B01000000000000000000000000C0A84B02AA3B01FF000000A8002A022
    hom_pr_lu_vec_l3v.arp.l3_type: 0x2
    hom_pr_lu_vec_l3v.arp.pyld_len: 0x4
    hom_pr_lu_vec_l3v.arp.etype: 0xA8
    hom_pr_lu_vec_l3v.arp.hrd: 0x2A0
    hom_pr_lu_vec_l3v.arp.pro: 0x0
    hom_pr_lu_vec_l3v.arp.hln: 0xFC
    hom_pr_lu_vec_l3v.arp.pln: 0x7
    hom_pr_lu_vec_l3v.arp.op: 0xA8EC
    hom_pr_lu_vec_l3v.arp.sha: 0x302A12C0A
    hom_pr_lu_vec_l3v.arp.spa: 0x0
    hom_pr_lu_vec_l3v.arp.tha: 0x000000000
    hom_pr_lu_vec_l3v.arp.tpa: 0x2A12C04
    hom_pr_lu_vec_l3v.arp.ar_spare: 0x0000000000000000000000003
  hom_pr_lu_vec_l3v.mpls: 0x00000000000000000000000000C0A84B01000000000000000000000000C0A84B02AA3B01FF000000A8002A022
    hom_pr_lu_vec_l3v.mpls.l3_type: 0x2
    hom_pr_lu_vec_l3v.mpls.etype: 0x5404
    hom_pr_lu_vec_l3v.mpls.pyld_len: 0x0
    hom_pr_lu_vec_l3v.mpls.label0_lbl: 0x2A0
    hom_pr_lu_vec_l3v.mpls.label0_ttl: 0x0
    hom_pr_lu_vec_l3v.mpls.label0_exp: 0x0
    hom_pr_lu_vec_l3v.mpls.label0_s: 0x0
    hom_pr_lu_vec_l3v.mpls.label1_lbl: 0xC07FC
    hom_pr_lu_vec_l3v.mpls.label1_ttl: 0x8E
    hom_pr_lu_vec_l3v.mpls.label1_exp: 0x2
    hom_pr_lu_vec_l3v.mpls.label1_s: 0x1
    hom_pr_lu_vec_l3v.mpls.label2_lbl: 0x12C0A
    hom_pr_lu_vec_l3v.mpls.label2_ttl: 0x2A
    hom_pr_lu_vec_l3v.mpls.label2_exp: 0x0
    hom_pr_lu_vec_l3v.mpls.label2_s: 0x0
    hom_pr_lu_vec_l3v.mpls.label3_lbl: 0x3
    hom_pr_lu_vec_l3v.mpls.label3_ttl: 0x0
    hom_pr_lu_vec_l3v.mpls.label3_exp: 0x0
    hom_pr_lu_vec_l3v.mpls.label3_s: 0x0
    hom_pr_lu_vec_l3v.mpls.label4_lbl: 0x0
    hom_pr_lu_vec_l3v.mpls.label4_ttl: 0x0
    hom_pr_lu_vec_l3v.mpls.label4_exp: 0x0
    hom_pr_lu_vec_l3v.mpls.label4_s: 0x0
    hom_pr_lu_vec_l3v.mpls.label5_lbl: 0x0
    hom_pr_lu_vec_l3v.mpls.label5_ttl: 0x0
    hom_pr_lu_vec_l3v.mpls.label5_exp: 0x0
    hom_pr_lu_vec_l3v.mpls.label5_s: 0x0
    hom_pr_lu_vec_l3v.mpls.label6_lbl: 0x12C04
    hom_pr_lu_vec_l3v.mpls.label6_ttl: 0x2A
    hom_pr_lu_vec_l3v.mpls.label6_exp: 0x0
    hom_pr_lu_vec_l3v.mpls.label6_s: 0x0
    hom_pr_lu_vec_l3v.mpls.label7_lbl: 0x3
    hom_pr_lu_vec_l3v.mpls.label7_ttl: 0x0
    hom_pr_lu_vec_l3v.mpls.label7_exp: 0x0
    hom_pr_lu_vec_l3v.mpls.label7_s: 0x0
    hom_pr_lu_vec_l3v.mpls.label8_lbl: 0x0
    hom_pr_lu_vec_l3v.mpls.label8_ttl: 0x0
    hom_pr_lu_vec_l3v.mpls.label8_exp: 0x0
    hom_pr_lu_vec_l3v.mpls.label8_s: 0x0
    hom_pr_lu_vec_l3v.mpls.last_label_lbl: 0x0
    hom_pr_lu_vec_l3v.mpls.last_label_ttl: 0x0
    hom_pr_lu_vec_l3v.mpls.last_label_exp: 0x0
    hom_pr_lu_vec_l3v.mpls.last_label_s: 0x0
    hom_pr_lu_vec_l3v.mpls.mpls_spare: 0x0
*** Parsed l4 vector

 

こんな感じに表示されます。

example.png

  

 

3. ELAM Assistant の使い方

すでに install が完了していて、すぐに使える状態になっていることを前提で進めていきます。 まだ install していない人は、APIC Postman の紹介 を参考に install してください。 下記のように Apps -> Installed Apps で ELAM Assistant が表示されていれば install が完了しています。

image2.png

 

上記 Open を click した後、APIC version 5.2 未満の version では Leaf/Spine Switch に login が必要です。APIC version 5.2 未満の version をご使用の場合は、下記のような画面が表示されますので、まずは Username/Password を入力し、Validate & Save を click してください。

 

04.png

 

APIC version 5.2 以降の version をご使用の方は Open を click すると以下の画面が表示されます。

 

image3.png

上記画面を scroll させると、使い方が書いてあるので、そのとおりに進めていきます。

 

image4.png

指示のとおり、Capture (Perform ELAM) を click します。


Screenshot 2024-10-25 at 16.33.53.png

現在、2. まで進んだので、3 - 5 の ELAM capture を行いたい switch を選択し設定を行います。

今回は、1 つの EPG 上に leaf101 eth1/30 encap vlan 751 と leaf104 eth1/30 encap vlan 752 を static binding で設定し、bridge する構成で行なっています。 同一 EPG 内の通信のため、contract は設定していません。 Tenant 設定は下記になります。

 

static_ports.png

 

上記設定で、node-101 eth1/30 に、端末 192.168.75.1 が、node-104 eth1/30 に、端末 192.168.75.2 が接続されているので、192.168.75.1 -> 192.168.75.2 へ ping を実行した時に各 leaf が、packet を受信できているかどうかを確認するため、ELAM capture を行なってみます。

 

指示通り、まずは、capture 対象の node を選択 (今回は node-101, node-104 を追加) します。

choose_node.png

 

今回は、frontport からの通信を capture するため、Direction は default のままで、Source I/F は eth1/30、node-101 は icmp echo を capture するため、Parameters にて dst ip を 192.168.75.2 に、node-104 は icmp echo reply を capture するため、Parameters にて src ip を 192.168.75.2 にして Set ELAM(s) を click。

 

set_ELAM.png

 

これで、capture を行う準備ができたので、ping を実行し、6 - 9 の指示通りに進めていきます。

Check Trigger を click すると、capture が完了しているため、Status が Report Ready に変更されます。 capture できなかった場合、Set のままです。 また、ELAM は、条件に match した最初の packet を capture すると Triggered になり capture が終了します。 そのため、packet が流れ続けている環境で parameter 設定を適当に行うと、意図した packet とは異なる packet を capture してしまうため、注意が必要です。

 

report_ready.png

 

上記 Report Ready になった場合、ELAM report が生成されているため、Report Ready を click すると、その node の ELAM report の内容を確認することができます。

今回は、node-101 の capture 結果を見てみることにします。

node-101 の Report Ready を click することで ELAM Report Parse Result に結果が表示されます。

下記は、ELAM Report Parse Result の Express の結果です。 Raw を click すると、先ほどの難しい出力結果が表示されます。

 

report1.pngreport2.pngreport3.png


Packet が ACI Fabric 内で drop しているときの Troubleshooting では、最後の drop reason の出力を確認します。 問題なく通過している場合には no drop になりますが、EPG 間通信で contract を設定せずに packet drop が発生した場合は、SECURITY DENY と表示される等、drop した理由が表示されます。

ちなみに、raw data は、apic の /data2/gluster/gv0/Cisco_ElamAssistant/ directory の中にあります。

leaf/spine switch に login し、CLI で elam capture を行なった場合、elam report は下記のように switch の /var/log/dme/log/elam_report.txt に保存されますが、ELAM Assistant の場合、その情報を、/data2/gluster/vg0/Cisco_ElamAssistant へ copy しています。 copy する際に、node 名が追加され node-101_slot1_asic0_insel6_elam_report.txt のような形式の file になります。 elam parameter で option として存在する name your capture に何か入力すると、elam_report.txt の部分がその入力した値になります。

 

## node-101 leaf switch
fab4-leaf1# ls -l /var/log/dme/log/elam_report.txt
-rw-rw-rw- 1 root root 1249349 Jan 20 14:44 /var/log/dme/log/elam_report.txt fab4-leaf1# fab4-leaf1# head -30 /var/log/dme/log/elam_report.txt #########################HOMEWOOD ELAM REPORT START######################### Dumping report for asic type 8 inst 0 slice 0 a_to_d 1 insel 6 outsel 0 LUA captured data with : SRCID: 6a PKTID: 255 *** All outer vector: hom_elam_in_vec.all_outer_vec: 0x00000000000000000000000000000000000000000000000008AE100160000000000000000000000000018150960200000000000000000000000181509605547603FE0000015000540440000000000000000005DE100000000F4CFE237646DF4CFE237646F hom_elam_in_vec.all_outer_vec.l2vec0: 0x00000000000005DE100000000F4CFE237646DF4CFE237646F hom_elam_in_vec.all_outer_vec.l3vec0: 0x00000000000000000000000000C0A84B01000000000000000000000000C0A84B02AA3B01FF000000A8002A022 hom_elam_in_vec.all_outer_vec.l4vec0: 0x00000000000000000000000004570800B hom_elam_in_vec.all_outer_vec.spare_bit_padding: 0x00000000000000000 *** Parsed l2 vector hom_pr_lu_vec_l2v: 0x00000000000005DE100000000F4CFE237646DF4CFE237646F hom_pr_lu_vec_l2v.da: 0xF4CFE237646F hom_pr_lu_vec_l2v.da.trill: 0xF4CFE237646F hom_pr_lu_vec_l2v.da.trill.ce_da: 0xF4CFE237646F hom_pr_lu_vec_l2v.da.ce_da: 0xF4CFE237646F hom_pr_lu_vec_l2v.da.dce_da: 0xF4CFE237646F hom_pr_lu_vec_l2v.sa: 0xF4CFE237646D hom_pr_lu_vec_l2v.sa.trill: 0xF4CFE237646D hom_pr_lu_vec_l2v.sa.trill.irbid: 0x646D hom_pr_lu_vec_l2v.sa.trill.erbid: 0xE237 hom_pr_lu_vec_l2v.sa.trill.spare: 0xF4CF hom_pr_lu_vec_l2v.sa.ce_sa: 0xF4CFE237646D hom_pr_lu_vec_l2v.sa.dce_sa: 0xF4CFE237646D hom_pr_lu_vec_l2v.vntag_vld: 0x0 hom_pr_lu_vec_l2v.ivntag_vld: 0x0 hom_pr_lu_vec_l2v.vir: 0x0 hom_pr_lu_vec_l2v.vir.vntag: 0x0 fab4-leaf1#

 

## apic
fab4-apic2# ls -l /data2/gluster/gv0/Cisco_ElamAssistant/node-101* 
-rw-r--r-- 2 root root 1249376 Jan 20 14:44 /data2/gluster/gv0/Cisco_ElamAssistant/node-101_slot1_asic0_insel6_elam_report.txt fab4-apic2#

  

ACI Fabric 内の traffic flow の解析を行う上で、ELAM capture はとても有効ですが、設定した条件に match する最初の packet しか取得できないため、parameter 設定を慎重に行う必要があります。 条件が明確になっていない場合、意図せぬ packet を capture してしまい、Troubleshooting が行えないこともあります。

そのため、まずは SPAN を行い、drop している packet の特性を確認した上で、ELAM capture を行うことをお勧めします。

SPAN については、SPAN 機能の基本設定と動作概要 もあわせてご参照ください。

Getting Started

検索バーにキーワード、フレーズ、または質問を入力し、お探しのものを見つけましょう

シスコ コミュニティをいち早く使いこなしていただけるよう役立つリンクをまとめました。みなさんのジャーニーがより良いものとなるようお手伝いします