package com.netifera.platform.net.wifi.packets; import com.netifera.platform.net.packets.AbstractPacket; import com.netifera.platform.util.addresses.MACAddress; abstract public class WiFiFrame extends AbstractPacket { int version; int type; int mainType; int subType; boolean toDS; boolean fromDS; boolean moreFragments; boolean isRetry; boolean powerManagementStatus; boolean hasMoreData; boolean isProtected; boolean isStrictlyOrdered; int duration; MACAddress address1; MACAddress address2; MACAddress address3; int fragmentNumber; int sequenceNumber; // frame control flags static final int FLAG_TO_DS =0x01; static final int FLAG_FROM_DS =0x02; static final int FLAG_MORE_FRAGMENTS =0x04; static final int FLAG_RETRY =0x08; static final int FLAG_POWER_MGT =0x10; static final int FLAG_MORE_DATA =0x20; static final int FLAG_WEP =0x40; static final int FLAG_ORDER =0x80; // frame main types public static final int MGT_FRAME =0x00; public static final int CONTROL_FRAME =0x01; public static final int DATA_FRAME =0x02; // header sizes static final int DATA_SHORT_HDR_LEN =24; static final int DATA_LONG_HDR_LEN =30; static final int MGT_FRAME_HDR_LEN =24; // frame types public static final int MGT_ASSOC_REQ = 0x00; public static final int MGT_ASSOC_RESP = 0x01; public static final int MGT_REASSOC_REQ = 0x02; public static final int MGT_REASSOC_RESP = 0x03; public static final int MGT_PROBE_REQ = 0x04; public static final int MGT_PROBE_RESP = 0x05; public static final int MGT_BEACON = 0x08; public static final int MGT_ATIM = 0x09; public static final int MGT_DISASS = 0x0a; public static final int MGT_AUTHENTICATION = 0x0b; public static final int MGT_DEAUTHENTICATION = 0x0c; public static final int CTRL_PS_POLL = 0x1a; public static final int CTRL_RTS = 0x1b; public static final int CTRL_CTS = 0x1c; public static final int CTRL_ACKNOWLEDGEMENT = 0x1d; public static final int CTRL_CFP_END = 0x1e; public static final int CTRL_CFP_ENDACK = 0x1f; public static final int DATA = 0x20; public static final int DATA_CF_ACK = 0x21; public static final int DATA_CF_POLL = 0x22; public static final int DATA_CF_ACK_POLL = 0x23; public static final int DATA_NULL_FUNCTION = 0x24; public static final int DATA_CF_ACK_NOD = 0x25; public static final int DATA_CF_POLL_NOD = 0x26; public static final int DATA_CF_ACK_POLL_NOD = 0x27; @Override protected void packHeader() { // TODO Auto-generated method stub } @Override protected void unpackHeader() { unpackFrameControlField(); duration = unpack16(); unpackAddresses(); unpackSequenceControlField(); } private void unpackFrameControlField() { int x = unpack8(); version = x & 0x03; mainType = (x & 0x0c) >> 2; subType = (x & 0xf0) >> 4; type = (mainType << 4) | subType; x = unpack8(); toDS = (x & FLAG_TO_DS) == 1; fromDS = ((x & FLAG_FROM_DS) >> 1) == 1; moreFragments = ((x & FLAG_MORE_FRAGMENTS) >> 2) == 1; isRetry = ((x & FLAG_RETRY) >> 3) == 1; powerManagementStatus = ((x & FLAG_POWER_MGT) >> 4) == 1; hasMoreData = ((x & FLAG_MORE_DATA) >> 5) == 1; isProtected = ((x & FLAG_WEP) >> 6) == 1; isStrictlyOrdered = ((x & FLAG_ORDER) >> 7) == 1; } protected void unpackAddresses() { address1 = new MACAddress(unpackBytes(6)); address2 = new MACAddress(unpackBytes(6)); address3 = new MACAddress(unpackBytes(6)); } protected void unpackSequenceControlField() { int x = unpack16(); fragmentNumber = x & 0x0f; sequenceNumber = x >> 4; } @Override protected int minimumHeaderLength() { return 24; } public int protocol() { return 0; } public int type() { return type; } @Override public String toString() { WiFiFramePrinter printer = new WiFiFramePrinter(); printer.print(this); return printer.toString(); } public MACAddress receiver() { return address1; } public MACAddress transmitter() { return address2; } public boolean isProtected() { return isProtected; } public boolean isToDistribution() { return toDS; } public boolean isFromDistribution() { return fromDS; } }