Class: Pcap::LACPPacket

Inherits:
SPPacket show all
Defined in:
lib/pcap/packet.rb,
ext/pcap/slow_protocol_packet.c

Overview

LACP frames

Constant Summary collapse

LACP_ACTIVITY =
0x01
LACP_TIMEOUT =
0x02
LACP_AGGR =
0x04
LACP_SYNC =
0x08
LACP_COLLECTING =
0x10
LACP_DISTR =
0x20
LACP_DEFAULTED =
0x40
LACP_EXPIRED =
0x80

Instance Method Summary collapse

Methods inherited from SPPacket

#sp_subtype

Methods inherited from Packet

#=~, #_dump, #_dump_to, _load, _load_from, #arp?, #caplen, #datalink, #dst_mac_address, #ethertype, #inspect, #ip?, #ipv6?, #lacp?, #length, #raw_data, #size, #src_mac_address, #tcp?, #time, #time_i, #time_i=, #to_s, #udata, #udata=, #udp?, #unpack_hex_string

Instance Method Details

#actor_flagsObject

return Actor LACP flags in human readable form



121
122
123
# File 'lib/pcap/packet.rb', line 121

def actor_flags
  parse_flags(actor_info['Actor State'])
end

#actor_infoObject

return LACP Actor TLV



131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/pcap/packet.rb', line 131

def actor_info
  # throw error if 1st TLV is not Actor
  raise 'error in actor TLV' if raw_data[16].unpack('C')[0] != 1
  {
    'Actor System Priority' => raw_data[18,19].unpack('n')[0],
    'Actor System Id' => unpack_hex_string(raw_data[20, 26]),
    'Actor Key' => raw_data[26,27].unpack('n')[0],
    'Actor Port Priority' => raw_data[28,29].unpack('n')[0],
    'Actor Port' => raw_data[30,31].unpack('n')[0],
    'Actor State' => raw_data[32].unpack('C')[0].to_i
  }
end

#parse_flags(flags) ⇒ Object

parse LACP flags based on 802.3ad-2000



161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/pcap/packet.rb', line 161

def parse_flags(flags)
  {
    'Activity' => (LACP_ACTIVITY & flags).zero? ? 'Passive' : 'Active',
    'Timeout' => (LACP_TIMEOUT & flags).zero? ? 'Long' : 'Short',
    'Aggregation' => (LACP_AGGR & flags).zero? ? 'Individual' : 'Aggregatable',
    'Synchronization' => (LACP_SYNC & flags).zero? ? 'OutSync' : 'InSync',
    'Collecting' => (LACP_COLLECTING & flags).zero? ? 'NotCollecting' : 'Collecting',
    'Distributing' => (LACP_DISTR & flags).zero? ? 'NotDistributing' : 'Distributing',
    'Defaulted' => (LACP_DEFAULTED & flags).zero? ? 'RecvPartner' : 'DefaultPartner',
    'Expired' => (LACP_EXPIRED & flags).zero? ? 'NotExpired' : 'Expired'
  }
end

#partner_flagsObject

return Actor LACP flags in human readable form



126
127
128
# File 'lib/pcap/packet.rb', line 126

def partner_flags
  parse_flags(partner_info['Partner State'])
end

#partner_infoObject

return LACP Partner TLV



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/pcap/packet.rb', line 144

def partner_info
  # throw error if 2nd TLV is not Partner
  actor_tlv_len = raw_data[17].unpack('C')[0]
  base = 16 + actor_tlv_len
  raise 'error in partner TLV' if raw_data[base].unpack('C')[0] != 2
  base += 2
  {
    'Partner System Priority' => raw_data[base, base + 1].unpack('n')[0],
    'Partner System Id' => unpack_hex_string(raw_data[base + 2, base + 7]),
    'Partner Key' => raw_data[base + 8,base + 9].unpack('n')[0],
    'Partner Port Priority' => raw_data[base + 10,base + 11].unpack('n')[0],
    'Partner Port' => raw_data[base + 12,base + 13].unpack('n')[0],
    'Partner State' => raw_data[base + 14].unpack('C')[0].to_i
  }
end

#versionObject

return LACP Version



116
117
118
# File 'lib/pcap/packet.rb', line 116

def version
  raw_data[15].unpack('C')[0]
end