class PacketGen::Header::Dot11::Data

IEEE 802.11 data frame header

This class make a {Dot11} header with {#type} set to 2 (data frame).

A IEEE 802.11 data header consists of:

@author Sylvain Daubert

Public Class Methods

new(options={}) click to toggle source

@param [Hash] options @see Base#initialize

Calls superclass method PacketGen::Header::Dot11::new
# File lib/packetgen/header/dot11/data.rb, line 31
def initialize(options={})
  super({ type: 2 }.merge!(options))
  @applicable_fields -= %i[mac4 qos_ctrl ht_ctrl]
  define_applicable_fields
end

Public Instance Methods

dst() click to toggle source

Get destination MAC address @return [String]

# File lib/packetgen/header/dot11/data.rb, line 69
def dst
  _src_mac, dst_mac = src_dst_from_mac
  self.send(dst_mac)
end
dst=(mac) click to toggle source

Set destination MAC address @param [String] mac MAC address to set @return [String]

# File lib/packetgen/header/dot11/data.rb, line 77
def dst=(mac)
  _src_mac, dst_mac = src_dst_from_mac
  self.send("#{dst_mac}=", mac)
end
reply!() click to toggle source

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.

# File lib/packetgen/header/dot11/data.rb, line 42
def reply!
  ds = frame_ctrl & 3
  case ds
  when 0
    # MAC1: RA/DA, MAC2: TA/SA
    invert_mac :mac1, :mac2
  when 1
    # MAC1: RA/BSSID, MAC2: TA/SA, MAC3: DA
    invert_mac :mac1, :mac2
    self.to_ds = false
    self.from_ds = true
  when 2
    # MAC1: RA/DA, MAC2: BSSID, MAC3: SA or BSSID
    invert_mac :mac1, :mac2
    self.to_ds = true
    self.from_ds = false
  when 3
    # MAC1: RA, MAC2: TA
    invert_mac :mac1, :mac2
    # MAC3: DA, MAC4: SA
    invert_mac :mac3, :mac4
  end
  self
end
src() click to toggle source

Get source MAC address @return [String]

# File lib/packetgen/header/dot11/data.rb, line 84
def src
  src_mac, = src_dst_from_mac
  self.send(src_mac)
end
src=(mac) click to toggle source

Set source MAC address @param [String] mac MAC address to set @return [String]

# File lib/packetgen/header/dot11/data.rb, line 92
def src=(mac)
  src_mac, = src_dst_from_mac
  self.send("#{src_mac}=", mac)
end

Private Instance Methods

define_applicable_fields() click to toggle source
# File lib/packetgen/header/dot11/data.rb, line 113
def define_applicable_fields
  super
  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]
  end
end
invert_mac(mac1, mac2) click to toggle source
# File lib/packetgen/header/dot11/data.rb, line 129
def invert_mac(mac1, mac2)
  self[mac1], self[mac2] = self[mac2], self[mac1]
end
src_dst_from_mac() click to toggle source
# File lib/packetgen/header/dot11/data.rb, line 99
def src_dst_from_mac
  ds = frame_ctrl & 3
  case ds
  when 0
    %i[mac2 mac1]
  when 1
    %i[mac2 mac3]
  when 2
    %i[mac3 mac1]
  when 3
    %i[mac4 mac3]
  end
end