lib/packetgen/header/dot11/data.rb in packetgen-2.6.0 vs lib/packetgen/header/dot11/data.rb in packetgen-2.7.0
- old
+ new
@@ -7,11 +7,10 @@
# frozen_string_literal: true
module PacketGen
module Header
class Dot11
-
# IEEE 802.11 data frame header
#
# This class make a {Dot11} header with {#type} set to +2+
# (data frame).
#
@@ -25,33 +24,62 @@
# * sometimes a {#qos_ctrl} ({Types::Int16}),
# * a {#body} (a {Types::String} or another {Base} class),
# * and a Frame check sequence ({#fcs}, of type {Types::Int32le}).
# @author Sylvain Daubert
class Data < Dot11
-
# @param [Hash] options
# @see Base#initialize
def initialize(options={})
- super({type: 2}.merge!(options))
- @applicable_fields -= %i(mac4 qos_ctrl ht_ctrl)
+ super({ type: 2 }.merge!(options))
+ @applicable_fields -= %i[mac4 qos_ctrl ht_ctrl]
define_applicable_fields
end
+ # Invert source and destination addresses (see Table 8-19 from
+ # IEEE 802.11-2012 document to known which MAC is SA, and which
+ # one is DA).
+ # Also invert Receiver and Transmitter address in case ToDS and
+ # FromDS are true.
+ def reply!
+ ds = frame_ctrl & 3
+ case ds
+ when 0
+ # MAC1: RA/DA, MAC2: TA/SA
+ self[:mac1], self[:mac2] = self[:mac2], self[:mac1]
+ when 1
+ # MAC1: RA/BSSID, MAC2: TA/SA, MAC3: DA
+ self[:mac2], self[:mac1] = self[:mac1], self[:mac2]
+ self.to_ds = false
+ self.from_ds = true
+ when 2
+ # MAC1: RA/DA, MAC2: BSSID, MAC3: SA or BSSID
+ self[:mac1], self[:mac2] = self[:mac2], self[:mac1]
+ self.to_ds = true
+ self.from_ds = false
+ when 3
+ # MAC1: RA, MAC2: TA
+ self[:mac1], self[:mac2] = self[:mac2], self[:mac1]
+ # MAC3: DA, MAC4: SA
+ self[:mac4], self[:mac3] = self[:mac3], self[:mac4]
+ end
+ self
+ end
+
private
def define_applicable_fields
super
- if subtype >= 8 and !@applicable_fields.include? :qos_ctrl
+ if (subtype >= 8) && !@applicable_fields.include?(:qos_ctrl)
# Insert after mac4, if present
# else insert after sequence_ctrl
if @applicable_fields.include? :mac4
idx = @applicable_fields.index(:mac4)
@applicable_fields[idx, 0] = :qos_ctrl
else
@applicable_fields[6, 0] = :qos_ctrl
end
elsif subtype < 8
- @applicable_fields -= %i(qos_ctrl)
+ @applicable_fields -= %i[qos_ctrl]
end
end
end
end
end