| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118 |
- // Copyright 2014 Google, Inc. All rights reserved.
- //
- // Use of this source code is governed by a BSD-style license
- // that can be found in the LICENSE file in the root of the source
- // tree.
- // See http://standards.ieee.org/findstds/standard/802.11-2012.html for info on
- // all of the layers in this file.
- package layers
- import (
- "bytes"
- "encoding/binary"
- "fmt"
- "hash/crc32"
- "net"
- "github.com/google/gopacket"
- )
- // Dot11Flags contains the set of 8 flags in the IEEE 802.11 frame control
- // header, all in one place.
- type Dot11Flags uint8
- const (
- Dot11FlagsToDS Dot11Flags = 1 << iota
- Dot11FlagsFromDS
- Dot11FlagsMF
- Dot11FlagsRetry
- Dot11FlagsPowerManagement
- Dot11FlagsMD
- Dot11FlagsWEP
- Dot11FlagsOrder
- )
- func (d Dot11Flags) ToDS() bool {
- return d&Dot11FlagsToDS != 0
- }
- func (d Dot11Flags) FromDS() bool {
- return d&Dot11FlagsFromDS != 0
- }
- func (d Dot11Flags) MF() bool {
- return d&Dot11FlagsMF != 0
- }
- func (d Dot11Flags) Retry() bool {
- return d&Dot11FlagsRetry != 0
- }
- func (d Dot11Flags) PowerManagement() bool {
- return d&Dot11FlagsPowerManagement != 0
- }
- func (d Dot11Flags) MD() bool {
- return d&Dot11FlagsMD != 0
- }
- func (d Dot11Flags) WEP() bool {
- return d&Dot11FlagsWEP != 0
- }
- func (d Dot11Flags) Order() bool {
- return d&Dot11FlagsOrder != 0
- }
- // String provides a human readable string for Dot11Flags.
- // This string is possibly subject to change over time; if you're storing this
- // persistently, you should probably store the Dot11Flags value, not its string.
- func (a Dot11Flags) String() string {
- var out bytes.Buffer
- if a.ToDS() {
- out.WriteString("TO-DS,")
- }
- if a.FromDS() {
- out.WriteString("FROM-DS,")
- }
- if a.MF() {
- out.WriteString("MF,")
- }
- if a.Retry() {
- out.WriteString("Retry,")
- }
- if a.PowerManagement() {
- out.WriteString("PowerManagement,")
- }
- if a.MD() {
- out.WriteString("MD,")
- }
- if a.WEP() {
- out.WriteString("WEP,")
- }
- if a.Order() {
- out.WriteString("Order,")
- }
- if length := out.Len(); length > 0 {
- return string(out.Bytes()[:length-1]) // strip final comma
- }
- return ""
- }
- type Dot11Reason uint16
- // TODO: Verify these reasons, and append more reasons if necessary.
- const (
- Dot11ReasonReserved Dot11Reason = 1
- Dot11ReasonUnspecified Dot11Reason = 2
- Dot11ReasonAuthExpired Dot11Reason = 3
- Dot11ReasonDeauthStLeaving Dot11Reason = 4
- Dot11ReasonInactivity Dot11Reason = 5
- Dot11ReasonApFull Dot11Reason = 6
- Dot11ReasonClass2FromNonAuth Dot11Reason = 7
- Dot11ReasonClass3FromNonAss Dot11Reason = 8
- Dot11ReasonDisasStLeaving Dot11Reason = 9
- Dot11ReasonStNotAuth Dot11Reason = 10
- )
- // String provides a human readable string for Dot11Reason.
- // This string is possibly subject to change over time; if you're storing this
- // persistently, you should probably store the Dot11Reason value, not its string.
- func (a Dot11Reason) String() string {
- switch a {
- case Dot11ReasonReserved:
- return "Reserved"
- case Dot11ReasonUnspecified:
- return "Unspecified"
- case Dot11ReasonAuthExpired:
- return "Auth. expired"
- case Dot11ReasonDeauthStLeaving:
- return "Deauth. st. leaving"
- case Dot11ReasonInactivity:
- return "Inactivity"
- case Dot11ReasonApFull:
- return "Ap. full"
- case Dot11ReasonClass2FromNonAuth:
- return "Class2 from non auth."
- case Dot11ReasonClass3FromNonAss:
- return "Class3 from non ass."
- case Dot11ReasonDisasStLeaving:
- return "Disass st. leaving"
- case Dot11ReasonStNotAuth:
- return "St. not auth."
- default:
- return "Unknown reason"
- }
- }
- type Dot11Status uint16
- const (
- Dot11StatusSuccess Dot11Status = 0
- Dot11StatusFailure Dot11Status = 1 // Unspecified failure
- Dot11StatusCannotSupportAllCapabilities Dot11Status = 10 // Cannot support all requested capabilities in the Capability Information field
- Dot11StatusInabilityExistsAssociation Dot11Status = 11 // Reassociation denied due to inability to confirm that association exists
- Dot11StatusAssociationDenied Dot11Status = 12 // Association denied due to reason outside the scope of this standard
- Dot11StatusAlgorithmUnsupported Dot11Status = 13 // Responding station does not support the specified authentication algorithm
- Dot11StatusOufOfExpectedSequence Dot11Status = 14 // Received an Authentication frame with authentication transaction sequence number out of expected sequence
- Dot11StatusChallengeFailure Dot11Status = 15 // Authentication rejected because of challenge failure
- Dot11StatusTimeout Dot11Status = 16 // Authentication rejected due to timeout waiting for next frame in sequence
- Dot11StatusAPUnableToHandle Dot11Status = 17 // Association denied because AP is unable to handle additional associated stations
- Dot11StatusRateUnsupported Dot11Status = 18 // Association denied due to requesting station not supporting all of the data rates in the BSSBasicRateSet parameter
- )
- // String provides a human readable string for Dot11Status.
- // This string is possibly subject to change over time; if you're storing this
- // persistently, you should probably store the Dot11Status value, not its string.
- func (a Dot11Status) String() string {
- switch a {
- case Dot11StatusSuccess:
- return "success"
- case Dot11StatusFailure:
- return "failure"
- case Dot11StatusCannotSupportAllCapabilities:
- return "cannot-support-all-capabilities"
- case Dot11StatusInabilityExistsAssociation:
- return "inability-exists-association"
- case Dot11StatusAssociationDenied:
- return "association-denied"
- case Dot11StatusAlgorithmUnsupported:
- return "algorithm-unsupported"
- case Dot11StatusOufOfExpectedSequence:
- return "out-of-expected-sequence"
- case Dot11StatusChallengeFailure:
- return "challenge-failure"
- case Dot11StatusTimeout:
- return "timeout"
- case Dot11StatusAPUnableToHandle:
- return "ap-unable-to-handle"
- case Dot11StatusRateUnsupported:
- return "rate-unsupported"
- default:
- return "unknown status"
- }
- }
- type Dot11AckPolicy uint8
- const (
- Dot11AckPolicyNormal Dot11AckPolicy = 0
- Dot11AckPolicyNone Dot11AckPolicy = 1
- Dot11AckPolicyNoExplicit Dot11AckPolicy = 2
- Dot11AckPolicyBlock Dot11AckPolicy = 3
- )
- // String provides a human readable string for Dot11AckPolicy.
- // This string is possibly subject to change over time; if you're storing this
- // persistently, you should probably store the Dot11AckPolicy value, not its string.
- func (a Dot11AckPolicy) String() string {
- switch a {
- case Dot11AckPolicyNormal:
- return "normal-ack"
- case Dot11AckPolicyNone:
- return "no-ack"
- case Dot11AckPolicyNoExplicit:
- return "no-explicit-ack"
- case Dot11AckPolicyBlock:
- return "block-ack"
- default:
- return "unknown-ack-policy"
- }
- }
- type Dot11Algorithm uint16
- const (
- Dot11AlgorithmOpen Dot11Algorithm = 0
- Dot11AlgorithmSharedKey Dot11Algorithm = 1
- )
- // String provides a human readable string for Dot11Algorithm.
- // This string is possibly subject to change over time; if you're storing this
- // persistently, you should probably store the Dot11Algorithm value, not its string.
- func (a Dot11Algorithm) String() string {
- switch a {
- case Dot11AlgorithmOpen:
- return "open"
- case Dot11AlgorithmSharedKey:
- return "shared-key"
- default:
- return "unknown-algorithm"
- }
- }
- type Dot11InformationElementID uint8
- const (
- Dot11InformationElementIDSSID Dot11InformationElementID = 0
- Dot11InformationElementIDRates Dot11InformationElementID = 1
- Dot11InformationElementIDFHSet Dot11InformationElementID = 2
- Dot11InformationElementIDDSSet Dot11InformationElementID = 3
- Dot11InformationElementIDCFSet Dot11InformationElementID = 4
- Dot11InformationElementIDTIM Dot11InformationElementID = 5
- Dot11InformationElementIDIBSSSet Dot11InformationElementID = 6
- Dot11InformationElementIDCountryInfo Dot11InformationElementID = 7
- Dot11InformationElementIDHoppingPatternParam Dot11InformationElementID = 8
- Dot11InformationElementIDHoppingPatternTable Dot11InformationElementID = 9
- Dot11InformationElementIDRequest Dot11InformationElementID = 10
- Dot11InformationElementIDQBSSLoadElem Dot11InformationElementID = 11
- Dot11InformationElementIDEDCAParamSet Dot11InformationElementID = 12
- Dot11InformationElementIDTrafficSpec Dot11InformationElementID = 13
- Dot11InformationElementIDTrafficClass Dot11InformationElementID = 14
- Dot11InformationElementIDSchedule Dot11InformationElementID = 15
- Dot11InformationElementIDChallenge Dot11InformationElementID = 16
- Dot11InformationElementIDPowerConst Dot11InformationElementID = 32
- Dot11InformationElementIDPowerCapability Dot11InformationElementID = 33
- Dot11InformationElementIDTPCRequest Dot11InformationElementID = 34
- Dot11InformationElementIDTPCReport Dot11InformationElementID = 35
- Dot11InformationElementIDSupportedChannels Dot11InformationElementID = 36
- Dot11InformationElementIDSwitchChannelAnnounce Dot11InformationElementID = 37
- Dot11InformationElementIDMeasureRequest Dot11InformationElementID = 38
- Dot11InformationElementIDMeasureReport Dot11InformationElementID = 39
- Dot11InformationElementIDQuiet Dot11InformationElementID = 40
- Dot11InformationElementIDIBSSDFS Dot11InformationElementID = 41
- Dot11InformationElementIDERPInfo Dot11InformationElementID = 42
- Dot11InformationElementIDTSDelay Dot11InformationElementID = 43
- Dot11InformationElementIDTCLASProcessing Dot11InformationElementID = 44
- Dot11InformationElementIDHTCapabilities Dot11InformationElementID = 45
- Dot11InformationElementIDQOSCapability Dot11InformationElementID = 46
- Dot11InformationElementIDERPInfo2 Dot11InformationElementID = 47
- Dot11InformationElementIDRSNInfo Dot11InformationElementID = 48
- Dot11InformationElementIDESRates Dot11InformationElementID = 50
- Dot11InformationElementIDAPChannelReport Dot11InformationElementID = 51
- Dot11InformationElementIDNeighborReport Dot11InformationElementID = 52
- Dot11InformationElementIDRCPI Dot11InformationElementID = 53
- Dot11InformationElementIDMobilityDomain Dot11InformationElementID = 54
- Dot11InformationElementIDFastBSSTrans Dot11InformationElementID = 55
- Dot11InformationElementIDTimeoutInt Dot11InformationElementID = 56
- Dot11InformationElementIDRICData Dot11InformationElementID = 57
- Dot11InformationElementIDDSERegisteredLoc Dot11InformationElementID = 58
- Dot11InformationElementIDSuppOperatingClass Dot11InformationElementID = 59
- Dot11InformationElementIDExtChanSwitchAnnounce Dot11InformationElementID = 60
- Dot11InformationElementIDHTInfo Dot11InformationElementID = 61
- Dot11InformationElementIDSecChanOffset Dot11InformationElementID = 62
- Dot11InformationElementIDBSSAverageAccessDelay Dot11InformationElementID = 63
- Dot11InformationElementIDAntenna Dot11InformationElementID = 64
- Dot11InformationElementIDRSNI Dot11InformationElementID = 65
- Dot11InformationElementIDMeasurePilotTrans Dot11InformationElementID = 66
- Dot11InformationElementIDBSSAvailAdmCapacity Dot11InformationElementID = 67
- Dot11InformationElementIDBSSACAccDelayWAPIParam Dot11InformationElementID = 68
- Dot11InformationElementIDTimeAdvertisement Dot11InformationElementID = 69
- Dot11InformationElementIDRMEnabledCapabilities Dot11InformationElementID = 70
- Dot11InformationElementIDMultipleBSSID Dot11InformationElementID = 71
- Dot11InformationElementID2040BSSCoExist Dot11InformationElementID = 72
- Dot11InformationElementID2040BSSIntChanReport Dot11InformationElementID = 73
- Dot11InformationElementIDOverlapBSSScanParam Dot11InformationElementID = 74
- Dot11InformationElementIDRICDescriptor Dot11InformationElementID = 75
- Dot11InformationElementIDManagementMIC Dot11InformationElementID = 76
- Dot11InformationElementIDEventRequest Dot11InformationElementID = 78
- Dot11InformationElementIDEventReport Dot11InformationElementID = 79
- Dot11InformationElementIDDiagnosticRequest Dot11InformationElementID = 80
- Dot11InformationElementIDDiagnosticReport Dot11InformationElementID = 81
- Dot11InformationElementIDLocationParam Dot11InformationElementID = 82
- Dot11InformationElementIDNonTransBSSIDCapability Dot11InformationElementID = 83
- Dot11InformationElementIDSSIDList Dot11InformationElementID = 84
- Dot11InformationElementIDMultipleBSSIDIndex Dot11InformationElementID = 85
- Dot11InformationElementIDFMSDescriptor Dot11InformationElementID = 86
- Dot11InformationElementIDFMSRequest Dot11InformationElementID = 87
- Dot11InformationElementIDFMSResponse Dot11InformationElementID = 88
- Dot11InformationElementIDQOSTrafficCapability Dot11InformationElementID = 89
- Dot11InformationElementIDBSSMaxIdlePeriod Dot11InformationElementID = 90
- Dot11InformationElementIDTFSRequest Dot11InformationElementID = 91
- Dot11InformationElementIDTFSResponse Dot11InformationElementID = 92
- Dot11InformationElementIDWNMSleepMode Dot11InformationElementID = 93
- Dot11InformationElementIDTIMBroadcastRequest Dot11InformationElementID = 94
- Dot11InformationElementIDTIMBroadcastResponse Dot11InformationElementID = 95
- Dot11InformationElementIDCollInterferenceReport Dot11InformationElementID = 96
- Dot11InformationElementIDChannelUsage Dot11InformationElementID = 97
- Dot11InformationElementIDTimeZone Dot11InformationElementID = 98
- Dot11InformationElementIDDMSRequest Dot11InformationElementID = 99
- Dot11InformationElementIDDMSResponse Dot11InformationElementID = 100
- Dot11InformationElementIDLinkIdentifier Dot11InformationElementID = 101
- Dot11InformationElementIDWakeupSchedule Dot11InformationElementID = 102
- Dot11InformationElementIDChannelSwitchTiming Dot11InformationElementID = 104
- Dot11InformationElementIDPTIControl Dot11InformationElementID = 105
- Dot11InformationElementIDPUBufferStatus Dot11InformationElementID = 106
- Dot11InformationElementIDInterworking Dot11InformationElementID = 107
- Dot11InformationElementIDAdvertisementProtocol Dot11InformationElementID = 108
- Dot11InformationElementIDExpBWRequest Dot11InformationElementID = 109
- Dot11InformationElementIDQOSMapSet Dot11InformationElementID = 110
- Dot11InformationElementIDRoamingConsortium Dot11InformationElementID = 111
- Dot11InformationElementIDEmergencyAlertIdentifier Dot11InformationElementID = 112
- Dot11InformationElementIDMeshConfiguration Dot11InformationElementID = 113
- Dot11InformationElementIDMeshID Dot11InformationElementID = 114
- Dot11InformationElementIDMeshLinkMetricReport Dot11InformationElementID = 115
- Dot11InformationElementIDCongestionNotification Dot11InformationElementID = 116
- Dot11InformationElementIDMeshPeeringManagement Dot11InformationElementID = 117
- Dot11InformationElementIDMeshChannelSwitchParam Dot11InformationElementID = 118
- Dot11InformationElementIDMeshAwakeWindows Dot11InformationElementID = 119
- Dot11InformationElementIDBeaconTiming Dot11InformationElementID = 120
- Dot11InformationElementIDMCCAOPSetupRequest Dot11InformationElementID = 121
- Dot11InformationElementIDMCCAOPSetupReply Dot11InformationElementID = 122
- Dot11InformationElementIDMCCAOPAdvertisement Dot11InformationElementID = 123
- Dot11InformationElementIDMCCAOPTeardown Dot11InformationElementID = 124
- Dot11InformationElementIDGateAnnouncement Dot11InformationElementID = 125
- Dot11InformationElementIDRootAnnouncement Dot11InformationElementID = 126
- Dot11InformationElementIDExtCapability Dot11InformationElementID = 127
- Dot11InformationElementIDAgereProprietary Dot11InformationElementID = 128
- Dot11InformationElementIDPathRequest Dot11InformationElementID = 130
- Dot11InformationElementIDPathReply Dot11InformationElementID = 131
- Dot11InformationElementIDPathError Dot11InformationElementID = 132
- Dot11InformationElementIDCiscoCCX1CKIPDeviceName Dot11InformationElementID = 133
- Dot11InformationElementIDCiscoCCX2 Dot11InformationElementID = 136
- Dot11InformationElementIDProxyUpdate Dot11InformationElementID = 137
- Dot11InformationElementIDProxyUpdateConfirmation Dot11InformationElementID = 138
- Dot11InformationElementIDAuthMeshPerringExch Dot11InformationElementID = 139
- Dot11InformationElementIDMIC Dot11InformationElementID = 140
- Dot11InformationElementIDDestinationURI Dot11InformationElementID = 141
- Dot11InformationElementIDUAPSDCoexistence Dot11InformationElementID = 142
- Dot11InformationElementIDWakeupSchedule80211ad Dot11InformationElementID = 143
- Dot11InformationElementIDExtendedSchedule Dot11InformationElementID = 144
- Dot11InformationElementIDSTAAvailability Dot11InformationElementID = 145
- Dot11InformationElementIDDMGTSPEC Dot11InformationElementID = 146
- Dot11InformationElementIDNextDMGATI Dot11InformationElementID = 147
- Dot11InformationElementIDDMSCapabilities Dot11InformationElementID = 148
- Dot11InformationElementIDCiscoUnknown95 Dot11InformationElementID = 149
- Dot11InformationElementIDVendor2 Dot11InformationElementID = 150
- Dot11InformationElementIDDMGOperating Dot11InformationElementID = 151
- Dot11InformationElementIDDMGBSSParamChange Dot11InformationElementID = 152
- Dot11InformationElementIDDMGBeamRefinement Dot11InformationElementID = 153
- Dot11InformationElementIDChannelMeasFeedback Dot11InformationElementID = 154
- Dot11InformationElementIDAwakeWindow Dot11InformationElementID = 157
- Dot11InformationElementIDMultiBand Dot11InformationElementID = 158
- Dot11InformationElementIDADDBAExtension Dot11InformationElementID = 159
- Dot11InformationElementIDNEXTPCPList Dot11InformationElementID = 160
- Dot11InformationElementIDPCPHandover Dot11InformationElementID = 161
- Dot11InformationElementIDDMGLinkMargin Dot11InformationElementID = 162
- Dot11InformationElementIDSwitchingStream Dot11InformationElementID = 163
- Dot11InformationElementIDSessionTransmission Dot11InformationElementID = 164
- Dot11InformationElementIDDynamicTonePairReport Dot11InformationElementID = 165
- Dot11InformationElementIDClusterReport Dot11InformationElementID = 166
- Dot11InformationElementIDRelayCapabilities Dot11InformationElementID = 167
- Dot11InformationElementIDRelayTransferParameter Dot11InformationElementID = 168
- Dot11InformationElementIDBeamlinkMaintenance Dot11InformationElementID = 169
- Dot11InformationElementIDMultipleMacSublayers Dot11InformationElementID = 170
- Dot11InformationElementIDUPID Dot11InformationElementID = 171
- Dot11InformationElementIDDMGLinkAdaptionAck Dot11InformationElementID = 172
- Dot11InformationElementIDSymbolProprietary Dot11InformationElementID = 173
- Dot11InformationElementIDMCCAOPAdvertOverview Dot11InformationElementID = 174
- Dot11InformationElementIDQuietPeriodRequest Dot11InformationElementID = 175
- Dot11InformationElementIDQuietPeriodResponse Dot11InformationElementID = 177
- Dot11InformationElementIDECPACPolicy Dot11InformationElementID = 182
- Dot11InformationElementIDClusterTimeOffset Dot11InformationElementID = 183
- Dot11InformationElementIDAntennaSectorID Dot11InformationElementID = 190
- Dot11InformationElementIDVHTCapabilities Dot11InformationElementID = 191
- Dot11InformationElementIDVHTOperation Dot11InformationElementID = 192
- Dot11InformationElementIDExtendedBSSLoad Dot11InformationElementID = 193
- Dot11InformationElementIDWideBWChannelSwitch Dot11InformationElementID = 194
- Dot11InformationElementIDVHTTxPowerEnvelope Dot11InformationElementID = 195
- Dot11InformationElementIDChannelSwitchWrapper Dot11InformationElementID = 196
- Dot11InformationElementIDOperatingModeNotification Dot11InformationElementID = 199
- Dot11InformationElementIDUPSIM Dot11InformationElementID = 200
- Dot11InformationElementIDReducedNeighborReport Dot11InformationElementID = 201
- Dot11InformationElementIDTVHTOperation Dot11InformationElementID = 202
- Dot11InformationElementIDDeviceLocation Dot11InformationElementID = 204
- Dot11InformationElementIDWhiteSpaceMap Dot11InformationElementID = 205
- Dot11InformationElementIDFineTuningMeasureParams Dot11InformationElementID = 206
- Dot11InformationElementIDVendor Dot11InformationElementID = 221
- )
- // String provides a human readable string for Dot11InformationElementID.
- // This string is possibly subject to change over time; if you're storing this
- // persistently, you should probably store the Dot11InformationElementID value,
- // not its string.
- func (a Dot11InformationElementID) String() string {
- switch a {
- case Dot11InformationElementIDSSID:
- return "SSID parameter set"
- case Dot11InformationElementIDRates:
- return "Supported Rates"
- case Dot11InformationElementIDFHSet:
- return "FH Parameter set"
- case Dot11InformationElementIDDSSet:
- return "DS Parameter set"
- case Dot11InformationElementIDCFSet:
- return "CF Parameter set"
- case Dot11InformationElementIDTIM:
- return "Traffic Indication Map (TIM)"
- case Dot11InformationElementIDIBSSSet:
- return "IBSS Parameter set"
- case Dot11InformationElementIDCountryInfo:
- return "Country Information"
- case Dot11InformationElementIDHoppingPatternParam:
- return "Hopping Pattern Parameters"
- case Dot11InformationElementIDHoppingPatternTable:
- return "Hopping Pattern Table"
- case Dot11InformationElementIDRequest:
- return "Request"
- case Dot11InformationElementIDQBSSLoadElem:
- return "QBSS Load Element"
- case Dot11InformationElementIDEDCAParamSet:
- return "EDCA Parameter Set"
- case Dot11InformationElementIDTrafficSpec:
- return "Traffic Specification"
- case Dot11InformationElementIDTrafficClass:
- return "Traffic Classification"
- case Dot11InformationElementIDSchedule:
- return "Schedule"
- case Dot11InformationElementIDChallenge:
- return "Challenge text"
- case Dot11InformationElementIDPowerConst:
- return "Power Constraint"
- case Dot11InformationElementIDPowerCapability:
- return "Power Capability"
- case Dot11InformationElementIDTPCRequest:
- return "TPC Request"
- case Dot11InformationElementIDTPCReport:
- return "TPC Report"
- case Dot11InformationElementIDSupportedChannels:
- return "Supported Channels"
- case Dot11InformationElementIDSwitchChannelAnnounce:
- return "Channel Switch Announcement"
- case Dot11InformationElementIDMeasureRequest:
- return "Measurement Request"
- case Dot11InformationElementIDMeasureReport:
- return "Measurement Report"
- case Dot11InformationElementIDQuiet:
- return "Quiet"
- case Dot11InformationElementIDIBSSDFS:
- return "IBSS DFS"
- case Dot11InformationElementIDERPInfo:
- return "ERP Information"
- case Dot11InformationElementIDTSDelay:
- return "TS Delay"
- case Dot11InformationElementIDTCLASProcessing:
- return "TCLAS Processing"
- case Dot11InformationElementIDHTCapabilities:
- return "HT Capabilities (802.11n D1.10)"
- case Dot11InformationElementIDQOSCapability:
- return "QOS Capability"
- case Dot11InformationElementIDERPInfo2:
- return "ERP Information-2"
- case Dot11InformationElementIDRSNInfo:
- return "RSN Information"
- case Dot11InformationElementIDESRates:
- return "Extended Supported Rates"
- case Dot11InformationElementIDAPChannelReport:
- return "AP Channel Report"
- case Dot11InformationElementIDNeighborReport:
- return "Neighbor Report"
- case Dot11InformationElementIDRCPI:
- return "RCPI"
- case Dot11InformationElementIDMobilityDomain:
- return "Mobility Domain"
- case Dot11InformationElementIDFastBSSTrans:
- return "Fast BSS Transition"
- case Dot11InformationElementIDTimeoutInt:
- return "Timeout Interval"
- case Dot11InformationElementIDRICData:
- return "RIC Data"
- case Dot11InformationElementIDDSERegisteredLoc:
- return "DSE Registered Location"
- case Dot11InformationElementIDSuppOperatingClass:
- return "Supported Operating Classes"
- case Dot11InformationElementIDExtChanSwitchAnnounce:
- return "Extended Channel Switch Announcement"
- case Dot11InformationElementIDHTInfo:
- return "HT Information (802.11n D1.10)"
- case Dot11InformationElementIDSecChanOffset:
- return "Secondary Channel Offset (802.11n D1.10)"
- case Dot11InformationElementIDBSSAverageAccessDelay:
- return "BSS Average Access Delay"
- case Dot11InformationElementIDAntenna:
- return "Antenna"
- case Dot11InformationElementIDRSNI:
- return "RSNI"
- case Dot11InformationElementIDMeasurePilotTrans:
- return "Measurement Pilot Transmission"
- case Dot11InformationElementIDBSSAvailAdmCapacity:
- return "BSS Available Admission Capacity"
- case Dot11InformationElementIDBSSACAccDelayWAPIParam:
- return "BSS AC Access Delay/WAPI Parameter Set"
- case Dot11InformationElementIDTimeAdvertisement:
- return "Time Advertisement"
- case Dot11InformationElementIDRMEnabledCapabilities:
- return "RM Enabled Capabilities"
- case Dot11InformationElementIDMultipleBSSID:
- return "Multiple BSSID"
- case Dot11InformationElementID2040BSSCoExist:
- return "20/40 BSS Coexistence"
- case Dot11InformationElementID2040BSSIntChanReport:
- return "20/40 BSS Intolerant Channel Report"
- case Dot11InformationElementIDOverlapBSSScanParam:
- return "Overlapping BSS Scan Parameters"
- case Dot11InformationElementIDRICDescriptor:
- return "RIC Descriptor"
- case Dot11InformationElementIDManagementMIC:
- return "Management MIC"
- case Dot11InformationElementIDEventRequest:
- return "Event Request"
- case Dot11InformationElementIDEventReport:
- return "Event Report"
- case Dot11InformationElementIDDiagnosticRequest:
- return "Diagnostic Request"
- case Dot11InformationElementIDDiagnosticReport:
- return "Diagnostic Report"
- case Dot11InformationElementIDLocationParam:
- return "Location Parameters"
- case Dot11InformationElementIDNonTransBSSIDCapability:
- return "Non Transmitted BSSID Capability"
- case Dot11InformationElementIDSSIDList:
- return "SSID List"
- case Dot11InformationElementIDMultipleBSSIDIndex:
- return "Multiple BSSID Index"
- case Dot11InformationElementIDFMSDescriptor:
- return "FMS Descriptor"
- case Dot11InformationElementIDFMSRequest:
- return "FMS Request"
- case Dot11InformationElementIDFMSResponse:
- return "FMS Response"
- case Dot11InformationElementIDQOSTrafficCapability:
- return "QoS Traffic Capability"
- case Dot11InformationElementIDBSSMaxIdlePeriod:
- return "BSS Max Idle Period"
- case Dot11InformationElementIDTFSRequest:
- return "TFS Request"
- case Dot11InformationElementIDTFSResponse:
- return "TFS Response"
- case Dot11InformationElementIDWNMSleepMode:
- return "WNM-Sleep Mode"
- case Dot11InformationElementIDTIMBroadcastRequest:
- return "TIM Broadcast Request"
- case Dot11InformationElementIDTIMBroadcastResponse:
- return "TIM Broadcast Response"
- case Dot11InformationElementIDCollInterferenceReport:
- return "Collocated Interference Report"
- case Dot11InformationElementIDChannelUsage:
- return "Channel Usage"
- case Dot11InformationElementIDTimeZone:
- return "Time Zone"
- case Dot11InformationElementIDDMSRequest:
- return "DMS Request"
- case Dot11InformationElementIDDMSResponse:
- return "DMS Response"
- case Dot11InformationElementIDLinkIdentifier:
- return "Link Identifier"
- case Dot11InformationElementIDWakeupSchedule:
- return "Wakeup Schedule"
- case Dot11InformationElementIDChannelSwitchTiming:
- return "Channel Switch Timing"
- case Dot11InformationElementIDPTIControl:
- return "PTI Control"
- case Dot11InformationElementIDPUBufferStatus:
- return "PU Buffer Status"
- case Dot11InformationElementIDInterworking:
- return "Interworking"
- case Dot11InformationElementIDAdvertisementProtocol:
- return "Advertisement Protocol"
- case Dot11InformationElementIDExpBWRequest:
- return "Expedited Bandwidth Request"
- case Dot11InformationElementIDQOSMapSet:
- return "QoS Map Set"
- case Dot11InformationElementIDRoamingConsortium:
- return "Roaming Consortium"
- case Dot11InformationElementIDEmergencyAlertIdentifier:
- return "Emergency Alert Identifier"
- case Dot11InformationElementIDMeshConfiguration:
- return "Mesh Configuration"
- case Dot11InformationElementIDMeshID:
- return "Mesh ID"
- case Dot11InformationElementIDMeshLinkMetricReport:
- return "Mesh Link Metric Report"
- case Dot11InformationElementIDCongestionNotification:
- return "Congestion Notification"
- case Dot11InformationElementIDMeshPeeringManagement:
- return "Mesh Peering Management"
- case Dot11InformationElementIDMeshChannelSwitchParam:
- return "Mesh Channel Switch Parameters"
- case Dot11InformationElementIDMeshAwakeWindows:
- return "Mesh Awake Windows"
- case Dot11InformationElementIDBeaconTiming:
- return "Beacon Timing"
- case Dot11InformationElementIDMCCAOPSetupRequest:
- return "MCCAOP Setup Request"
- case Dot11InformationElementIDMCCAOPSetupReply:
- return "MCCAOP SETUP Reply"
- case Dot11InformationElementIDMCCAOPAdvertisement:
- return "MCCAOP Advertisement"
- case Dot11InformationElementIDMCCAOPTeardown:
- return "MCCAOP Teardown"
- case Dot11InformationElementIDGateAnnouncement:
- return "Gate Announcement"
- case Dot11InformationElementIDRootAnnouncement:
- return "Root Announcement"
- case Dot11InformationElementIDExtCapability:
- return "Extended Capabilities"
- case Dot11InformationElementIDAgereProprietary:
- return "Agere Proprietary"
- case Dot11InformationElementIDPathRequest:
- return "Path Request"
- case Dot11InformationElementIDPathReply:
- return "Path Reply"
- case Dot11InformationElementIDPathError:
- return "Path Error"
- case Dot11InformationElementIDCiscoCCX1CKIPDeviceName:
- return "Cisco CCX1 CKIP + Device Name"
- case Dot11InformationElementIDCiscoCCX2:
- return "Cisco CCX2"
- case Dot11InformationElementIDProxyUpdate:
- return "Proxy Update"
- case Dot11InformationElementIDProxyUpdateConfirmation:
- return "Proxy Update Confirmation"
- case Dot11InformationElementIDAuthMeshPerringExch:
- return "Auhenticated Mesh Perring Exchange"
- case Dot11InformationElementIDMIC:
- return "MIC (Message Integrity Code)"
- case Dot11InformationElementIDDestinationURI:
- return "Destination URI"
- case Dot11InformationElementIDUAPSDCoexistence:
- return "U-APSD Coexistence"
- case Dot11InformationElementIDWakeupSchedule80211ad:
- return "Wakeup Schedule 802.11ad"
- case Dot11InformationElementIDExtendedSchedule:
- return "Extended Schedule"
- case Dot11InformationElementIDSTAAvailability:
- return "STA Availability"
- case Dot11InformationElementIDDMGTSPEC:
- return "DMG TSPEC"
- case Dot11InformationElementIDNextDMGATI:
- return "Next DMG ATI"
- case Dot11InformationElementIDDMSCapabilities:
- return "DMG Capabilities"
- case Dot11InformationElementIDCiscoUnknown95:
- return "Cisco Unknown 95"
- case Dot11InformationElementIDVendor2:
- return "Vendor Specific"
- case Dot11InformationElementIDDMGOperating:
- return "DMG Operating"
- case Dot11InformationElementIDDMGBSSParamChange:
- return "DMG BSS Parameter Change"
- case Dot11InformationElementIDDMGBeamRefinement:
- return "DMG Beam Refinement"
- case Dot11InformationElementIDChannelMeasFeedback:
- return "Channel Measurement Feedback"
- case Dot11InformationElementIDAwakeWindow:
- return "Awake Window"
- case Dot11InformationElementIDMultiBand:
- return "Multi Band"
- case Dot11InformationElementIDADDBAExtension:
- return "ADDBA Extension"
- case Dot11InformationElementIDNEXTPCPList:
- return "NEXTPCP List"
- case Dot11InformationElementIDPCPHandover:
- return "PCP Handover"
- case Dot11InformationElementIDDMGLinkMargin:
- return "DMG Link Margin"
- case Dot11InformationElementIDSwitchingStream:
- return "Switching Stream"
- case Dot11InformationElementIDSessionTransmission:
- return "Session Transmission"
- case Dot11InformationElementIDDynamicTonePairReport:
- return "Dynamic Tone Pairing Report"
- case Dot11InformationElementIDClusterReport:
- return "Cluster Report"
- case Dot11InformationElementIDRelayCapabilities:
- return "Relay Capabilities"
- case Dot11InformationElementIDRelayTransferParameter:
- return "Relay Transfer Parameter"
- case Dot11InformationElementIDBeamlinkMaintenance:
- return "Beamlink Maintenance"
- case Dot11InformationElementIDMultipleMacSublayers:
- return "Multiple MAC Sublayers"
- case Dot11InformationElementIDUPID:
- return "U-PID"
- case Dot11InformationElementIDDMGLinkAdaptionAck:
- return "DMG Link Adaption Acknowledgment"
- case Dot11InformationElementIDSymbolProprietary:
- return "Symbol Proprietary"
- case Dot11InformationElementIDMCCAOPAdvertOverview:
- return "MCCAOP Advertisement Overview"
- case Dot11InformationElementIDQuietPeriodRequest:
- return "Quiet Period Request"
- case Dot11InformationElementIDQuietPeriodResponse:
- return "Quiet Period Response"
- case Dot11InformationElementIDECPACPolicy:
- return "ECPAC Policy"
- case Dot11InformationElementIDClusterTimeOffset:
- return "Cluster Time Offset"
- case Dot11InformationElementIDAntennaSectorID:
- return "Antenna Sector ID"
- case Dot11InformationElementIDVHTCapabilities:
- return "VHT Capabilities (IEEE Std 802.11ac/D3.1)"
- case Dot11InformationElementIDVHTOperation:
- return "VHT Operation (IEEE Std 802.11ac/D3.1)"
- case Dot11InformationElementIDExtendedBSSLoad:
- return "Extended BSS Load"
- case Dot11InformationElementIDWideBWChannelSwitch:
- return "Wide Bandwidth Channel Switch"
- case Dot11InformationElementIDVHTTxPowerEnvelope:
- return "VHT Tx Power Envelope (IEEE Std 802.11ac/D5.0)"
- case Dot11InformationElementIDChannelSwitchWrapper:
- return "Channel Switch Wrapper"
- case Dot11InformationElementIDOperatingModeNotification:
- return "Operating Mode Notification"
- case Dot11InformationElementIDUPSIM:
- return "UP SIM"
- case Dot11InformationElementIDReducedNeighborReport:
- return "Reduced Neighbor Report"
- case Dot11InformationElementIDTVHTOperation:
- return "TVHT Op"
- case Dot11InformationElementIDDeviceLocation:
- return "Device Location"
- case Dot11InformationElementIDWhiteSpaceMap:
- return "White Space Map"
- case Dot11InformationElementIDFineTuningMeasureParams:
- return "Fine Tuning Measure Parameters"
- case Dot11InformationElementIDVendor:
- return "Vendor"
- default:
- return "Unknown information element id"
- }
- }
- // Dot11 provides an IEEE 802.11 base packet header.
- // See http://standards.ieee.org/findstds/standard/802.11-2012.html
- // for excruciating detail.
- type Dot11 struct {
- BaseLayer
- Type Dot11Type
- Proto uint8
- Flags Dot11Flags
- DurationID uint16
- Address1 net.HardwareAddr
- Address2 net.HardwareAddr
- Address3 net.HardwareAddr
- Address4 net.HardwareAddr
- SequenceNumber uint16
- FragmentNumber uint16
- Checksum uint32
- QOS *Dot11QOS
- HTControl *Dot11HTControl
- DataLayer gopacket.Layer
- }
- type Dot11QOS struct {
- TID uint8 /* Traffic IDentifier */
- EOSP bool /* End of service period */
- AckPolicy Dot11AckPolicy
- TXOP uint8
- }
- type Dot11HTControl struct {
- ACConstraint bool
- RDGMorePPDU bool
- VHT *Dot11HTControlVHT
- HT *Dot11HTControlHT
- }
- type Dot11HTControlHT struct {
- LinkAdapationControl *Dot11LinkAdapationControl
- CalibrationPosition uint8
- CalibrationSequence uint8
- CSISteering uint8
- NDPAnnouncement bool
- DEI bool
- }
- type Dot11HTControlVHT struct {
- MRQ bool
- UnsolicitedMFB bool
- MSI *uint8
- MFB Dot11HTControlMFB
- CompressedMSI *uint8
- STBCIndication bool
- MFSI *uint8
- GID *uint8
- CodingType *Dot11CodingType
- FbTXBeamformed bool
- }
- type Dot11HTControlMFB struct {
- NumSTS uint8
- VHTMCS uint8
- BW uint8
- SNR int8
- }
- type Dot11LinkAdapationControl struct {
- TRQ bool
- MRQ bool
- MSI uint8
- MFSI uint8
- ASEL *Dot11ASEL
- MFB *uint8
- }
- type Dot11ASEL struct {
- Command uint8
- Data uint8
- }
- type Dot11CodingType uint8
- const (
- Dot11CodingTypeBCC = 0
- Dot11CodingTypeLDPC = 1
- )
- func (a Dot11CodingType) String() string {
- switch a {
- case Dot11CodingTypeBCC:
- return "BCC"
- case Dot11CodingTypeLDPC:
- return "LDPC"
- default:
- return "Unknown coding type"
- }
- }
- func (m *Dot11HTControlMFB) NoFeedBackPresent() bool {
- return m.VHTMCS == 15 && m.NumSTS == 7
- }
- func decodeDot11(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11{}
- err := d.DecodeFromBytes(data, p)
- if err != nil {
- return err
- }
- p.AddLayer(d)
- if d.DataLayer != nil {
- p.AddLayer(d.DataLayer)
- }
- return p.NextDecoder(d.NextLayerType())
- }
- func (m *Dot11) LayerType() gopacket.LayerType { return LayerTypeDot11 }
- func (m *Dot11) CanDecode() gopacket.LayerClass { return LayerTypeDot11 }
- func (m *Dot11) NextLayerType() gopacket.LayerType {
- if m.DataLayer != nil {
- if m.Flags.WEP() {
- return LayerTypeDot11WEP
- }
- return m.DataLayer.(gopacket.DecodingLayer).NextLayerType()
- }
- return m.Type.LayerType()
- }
- func createU8(x uint8) *uint8 {
- return &x
- }
- var dataDecodeMap = map[Dot11Type]func() gopacket.DecodingLayer{
- Dot11TypeData: func() gopacket.DecodingLayer { return &Dot11Data{} },
- Dot11TypeDataCFAck: func() gopacket.DecodingLayer { return &Dot11DataCFAck{} },
- Dot11TypeDataCFPoll: func() gopacket.DecodingLayer { return &Dot11DataCFPoll{} },
- Dot11TypeDataCFAckPoll: func() gopacket.DecodingLayer { return &Dot11DataCFAckPoll{} },
- Dot11TypeDataNull: func() gopacket.DecodingLayer { return &Dot11DataNull{} },
- Dot11TypeDataCFAckNoData: func() gopacket.DecodingLayer { return &Dot11DataCFAckNoData{} },
- Dot11TypeDataCFPollNoData: func() gopacket.DecodingLayer { return &Dot11DataCFPollNoData{} },
- Dot11TypeDataCFAckPollNoData: func() gopacket.DecodingLayer { return &Dot11DataCFAckPollNoData{} },
- Dot11TypeDataQOSData: func() gopacket.DecodingLayer { return &Dot11DataQOSData{} },
- Dot11TypeDataQOSDataCFAck: func() gopacket.DecodingLayer { return &Dot11DataQOSDataCFAck{} },
- Dot11TypeDataQOSDataCFPoll: func() gopacket.DecodingLayer { return &Dot11DataQOSDataCFPoll{} },
- Dot11TypeDataQOSDataCFAckPoll: func() gopacket.DecodingLayer { return &Dot11DataQOSDataCFAckPoll{} },
- Dot11TypeDataQOSNull: func() gopacket.DecodingLayer { return &Dot11DataQOSNull{} },
- Dot11TypeDataQOSCFPollNoData: func() gopacket.DecodingLayer { return &Dot11DataQOSCFPollNoData{} },
- Dot11TypeDataQOSCFAckPollNoData: func() gopacket.DecodingLayer { return &Dot11DataQOSCFAckPollNoData{} },
- }
- func (m *Dot11) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- if len(data) < 10 {
- df.SetTruncated()
- return fmt.Errorf("Dot11 length %v too short, %v required", len(data), 10)
- }
- m.Type = Dot11Type((data[0])&0xFC) >> 2
- m.DataLayer = nil
- m.Proto = uint8(data[0]) & 0x0003
- m.Flags = Dot11Flags(data[1])
- m.DurationID = binary.LittleEndian.Uint16(data[2:4])
- m.Address1 = net.HardwareAddr(data[4:10])
- offset := 10
- mainType := m.Type.MainType()
- switch mainType {
- case Dot11TypeCtrl:
- switch m.Type {
- case Dot11TypeCtrlRTS, Dot11TypeCtrlPowersavePoll, Dot11TypeCtrlCFEnd, Dot11TypeCtrlCFEndAck:
- if len(data) < offset+6 {
- df.SetTruncated()
- return fmt.Errorf("Dot11 length %v too short, %v required", len(data), offset+6)
- }
- m.Address2 = net.HardwareAddr(data[offset : offset+6])
- offset += 6
- }
- case Dot11TypeMgmt, Dot11TypeData:
- if len(data) < offset+14 {
- df.SetTruncated()
- return fmt.Errorf("Dot11 length %v too short, %v required", len(data), offset+14)
- }
- m.Address2 = net.HardwareAddr(data[offset : offset+6])
- offset += 6
- m.Address3 = net.HardwareAddr(data[offset : offset+6])
- offset += 6
- m.SequenceNumber = (binary.LittleEndian.Uint16(data[offset:offset+2]) & 0xFFF0) >> 4
- m.FragmentNumber = (binary.LittleEndian.Uint16(data[offset:offset+2]) & 0x000F)
- offset += 2
- }
- if mainType == Dot11TypeData && m.Flags.FromDS() && m.Flags.ToDS() {
- if len(data) < offset+6 {
- df.SetTruncated()
- return fmt.Errorf("Dot11 length %v too short, %v required", len(data), offset+6)
- }
- m.Address4 = net.HardwareAddr(data[offset : offset+6])
- offset += 6
- }
- if m.Type.QOS() {
- if len(data) < offset+2 {
- df.SetTruncated()
- return fmt.Errorf("Dot11 length %v too short, %v required", len(data), offset+6)
- }
- m.QOS = &Dot11QOS{
- TID: (uint8(data[offset]) & 0x0F),
- EOSP: (uint8(data[offset]) & 0x10) == 0x10,
- AckPolicy: Dot11AckPolicy((uint8(data[offset]) & 0x60) >> 5),
- TXOP: uint8(data[offset+1]),
- }
- offset += 2
- }
- if m.Flags.Order() && (m.Type.QOS() || mainType == Dot11TypeMgmt) {
- if len(data) < offset+4 {
- df.SetTruncated()
- return fmt.Errorf("Dot11 length %v too short, %v required", len(data), offset+6)
- }
- htc := &Dot11HTControl{
- ACConstraint: data[offset+3]&0x40 != 0,
- RDGMorePPDU: data[offset+3]&0x80 != 0,
- }
- m.HTControl = htc
- if data[offset]&0x1 != 0 { // VHT Variant
- vht := &Dot11HTControlVHT{}
- htc.VHT = vht
- vht.MRQ = data[offset]&0x4 != 0
- vht.UnsolicitedMFB = data[offset+3]&0x20 != 0
- vht.MFB = Dot11HTControlMFB{
- NumSTS: uint8(data[offset+1] >> 1 & 0x7),
- VHTMCS: uint8(data[offset+1] >> 4 & 0xF),
- BW: uint8(data[offset+2] & 0x3),
- SNR: int8((-(data[offset+2] >> 2 & 0x20))+data[offset+2]>>2&0x1F) + 22,
- }
- if vht.UnsolicitedMFB {
- if !vht.MFB.NoFeedBackPresent() {
- vht.CompressedMSI = createU8(data[offset] >> 3 & 0x3)
- vht.STBCIndication = data[offset]&0x20 != 0
- vht.CodingType = (*Dot11CodingType)(createU8(data[offset+3] >> 3 & 0x1))
- vht.FbTXBeamformed = data[offset+3]&0x10 != 0
- vht.GID = createU8(
- data[offset]>>6 +
- (data[offset+1] & 0x1 << 2) +
- data[offset+3]&0x7<<3)
- }
- } else {
- if vht.MRQ {
- vht.MSI = createU8((data[offset] >> 3) & 0x07)
- }
- vht.MFSI = createU8(data[offset]>>6 + (data[offset+1] & 0x1 << 2))
- }
- } else { // HT Variant
- ht := &Dot11HTControlHT{}
- htc.HT = ht
- lac := &Dot11LinkAdapationControl{}
- ht.LinkAdapationControl = lac
- lac.TRQ = data[offset]&0x2 != 0
- lac.MFSI = data[offset]>>6&0x3 + data[offset+1]&0x1<<3
- if data[offset]&0x3C == 0x38 { // ASEL
- lac.ASEL = &Dot11ASEL{
- Command: data[offset+1] >> 1 & 0x7,
- Data: data[offset+1] >> 4 & 0xF,
- }
- } else {
- lac.MRQ = data[offset]&0x4 != 0
- if lac.MRQ {
- lac.MSI = data[offset] >> 3 & 0x7
- }
- lac.MFB = createU8(data[offset+1] >> 1)
- }
- ht.CalibrationPosition = data[offset+2] & 0x3
- ht.CalibrationSequence = data[offset+2] >> 2 & 0x3
- ht.CSISteering = data[offset+2] >> 6 & 0x3
- ht.NDPAnnouncement = data[offset+3]&0x1 != 0
- if mainType != Dot11TypeMgmt {
- ht.DEI = data[offset+3]&0x20 != 0
- }
- }
- offset += 4
- }
- if len(data) < offset+4 {
- df.SetTruncated()
- return fmt.Errorf("Dot11 length %v too short, %v required", len(data), offset+4)
- }
- m.BaseLayer = BaseLayer{
- Contents: data[0:offset],
- Payload: data[offset : len(data)-4],
- }
- if mainType == Dot11TypeData {
- d := dataDecodeMap[m.Type]
- if d == nil {
- return fmt.Errorf("unsupported type: %v", m.Type)
- }
- l := d()
- err := l.DecodeFromBytes(m.BaseLayer.Payload, df)
- if err != nil {
- return err
- }
- m.DataLayer = l.(gopacket.Layer)
- }
- m.Checksum = binary.LittleEndian.Uint32(data[len(data)-4 : len(data)])
- return nil
- }
- func (m *Dot11) ChecksumValid() bool {
- // only for CTRL and MGMT frames
- h := crc32.NewIEEE()
- h.Write(m.Contents)
- h.Write(m.Payload)
- return m.Checksum == h.Sum32()
- }
- func (m Dot11) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- buf, err := b.PrependBytes(24)
- if err != nil {
- return err
- }
- buf[0] = (uint8(m.Type) << 2) | m.Proto
- buf[1] = uint8(m.Flags)
- binary.LittleEndian.PutUint16(buf[2:4], m.DurationID)
- copy(buf[4:10], m.Address1)
- offset := 10
- switch m.Type.MainType() {
- case Dot11TypeCtrl:
- switch m.Type {
- case Dot11TypeCtrlRTS, Dot11TypeCtrlPowersavePoll, Dot11TypeCtrlCFEnd, Dot11TypeCtrlCFEndAck:
- copy(buf[offset:offset+6], m.Address2)
- offset += 6
- }
- case Dot11TypeMgmt, Dot11TypeData:
- copy(buf[offset:offset+6], m.Address2)
- offset += 6
- copy(buf[offset:offset+6], m.Address3)
- offset += 6
- binary.LittleEndian.PutUint16(buf[offset:offset+2], (m.SequenceNumber<<4)|m.FragmentNumber)
- offset += 2
- }
- if m.Type.MainType() == Dot11TypeData && m.Flags.FromDS() && m.Flags.ToDS() {
- copy(buf[offset:offset+6], m.Address4)
- offset += 6
- }
- return nil
- }
- // Dot11Mgmt is a base for all IEEE 802.11 management layers.
- type Dot11Mgmt struct {
- BaseLayer
- }
- func (m *Dot11Mgmt) NextLayerType() gopacket.LayerType { return gopacket.LayerTypePayload }
- func (m *Dot11Mgmt) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- m.Contents = data
- return nil
- }
- // Dot11Ctrl is a base for all IEEE 802.11 control layers.
- type Dot11Ctrl struct {
- BaseLayer
- }
- func (m *Dot11Ctrl) NextLayerType() gopacket.LayerType { return gopacket.LayerTypePayload }
- func (m *Dot11Ctrl) LayerType() gopacket.LayerType { return LayerTypeDot11Ctrl }
- func (m *Dot11Ctrl) CanDecode() gopacket.LayerClass { return LayerTypeDot11Ctrl }
- func (m *Dot11Ctrl) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- m.Contents = data
- return nil
- }
- func decodeDot11Ctrl(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11Ctrl{}
- return decodingLayerDecoder(d, data, p)
- }
- // Dot11WEP contains WEP encrpted IEEE 802.11 data.
- type Dot11WEP struct {
- BaseLayer
- }
- func (m *Dot11WEP) NextLayerType() gopacket.LayerType { return gopacket.LayerTypePayload }
- func (m *Dot11WEP) LayerType() gopacket.LayerType { return LayerTypeDot11WEP }
- func (m *Dot11WEP) CanDecode() gopacket.LayerClass { return LayerTypeDot11WEP }
- func (m *Dot11WEP) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- m.Contents = data
- return nil
- }
- func decodeDot11WEP(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11WEP{}
- return decodingLayerDecoder(d, data, p)
- }
- // Dot11Data is a base for all IEEE 802.11 data layers.
- type Dot11Data struct {
- BaseLayer
- }
- func (m *Dot11Data) NextLayerType() gopacket.LayerType {
- return LayerTypeLLC
- }
- func (m *Dot11Data) LayerType() gopacket.LayerType { return LayerTypeDot11Data }
- func (m *Dot11Data) CanDecode() gopacket.LayerClass { return LayerTypeDot11Data }
- func (m *Dot11Data) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- m.Payload = data
- return nil
- }
- func decodeDot11Data(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11Data{}
- return decodingLayerDecoder(d, data, p)
- }
- type Dot11DataCFAck struct {
- Dot11Data
- }
- func decodeDot11DataCFAck(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataCFAck{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataCFAck) LayerType() gopacket.LayerType { return LayerTypeDot11DataCFAck }
- func (m *Dot11DataCFAck) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataCFAck }
- func (m *Dot11DataCFAck) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Data.DecodeFromBytes(data, df)
- }
- type Dot11DataCFPoll struct {
- Dot11Data
- }
- func decodeDot11DataCFPoll(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataCFPoll{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataCFPoll) LayerType() gopacket.LayerType { return LayerTypeDot11DataCFPoll }
- func (m *Dot11DataCFPoll) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataCFPoll }
- func (m *Dot11DataCFPoll) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Data.DecodeFromBytes(data, df)
- }
- type Dot11DataCFAckPoll struct {
- Dot11Data
- }
- func decodeDot11DataCFAckPoll(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataCFAckPoll{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataCFAckPoll) LayerType() gopacket.LayerType { return LayerTypeDot11DataCFAckPoll }
- func (m *Dot11DataCFAckPoll) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataCFAckPoll }
- func (m *Dot11DataCFAckPoll) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Data.DecodeFromBytes(data, df)
- }
- type Dot11DataNull struct {
- Dot11Data
- }
- func decodeDot11DataNull(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataNull{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataNull) LayerType() gopacket.LayerType { return LayerTypeDot11DataNull }
- func (m *Dot11DataNull) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataNull }
- func (m *Dot11DataNull) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Data.DecodeFromBytes(data, df)
- }
- type Dot11DataCFAckNoData struct {
- Dot11Data
- }
- func decodeDot11DataCFAckNoData(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataCFAckNoData{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataCFAckNoData) LayerType() gopacket.LayerType { return LayerTypeDot11DataCFAckNoData }
- func (m *Dot11DataCFAckNoData) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataCFAckNoData }
- func (m *Dot11DataCFAckNoData) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Data.DecodeFromBytes(data, df)
- }
- type Dot11DataCFPollNoData struct {
- Dot11Data
- }
- func decodeDot11DataCFPollNoData(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataCFPollNoData{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataCFPollNoData) LayerType() gopacket.LayerType { return LayerTypeDot11DataCFPollNoData }
- func (m *Dot11DataCFPollNoData) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11DataCFPollNoData
- }
- func (m *Dot11DataCFPollNoData) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Data.DecodeFromBytes(data, df)
- }
- type Dot11DataCFAckPollNoData struct {
- Dot11Data
- }
- func decodeDot11DataCFAckPollNoData(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataCFAckPollNoData{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataCFAckPollNoData) LayerType() gopacket.LayerType {
- return LayerTypeDot11DataCFAckPollNoData
- }
- func (m *Dot11DataCFAckPollNoData) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11DataCFAckPollNoData
- }
- func (m *Dot11DataCFAckPollNoData) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Data.DecodeFromBytes(data, df)
- }
- type Dot11DataQOS struct {
- Dot11Ctrl
- }
- func (m *Dot11DataQOS) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- m.BaseLayer = BaseLayer{Payload: data}
- return nil
- }
- type Dot11DataQOSData struct {
- Dot11DataQOS
- }
- func decodeDot11DataQOSData(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataQOSData{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataQOSData) LayerType() gopacket.LayerType { return LayerTypeDot11DataQOSData }
- func (m *Dot11DataQOSData) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataQOSData }
- func (m *Dot11DataQOSData) NextLayerType() gopacket.LayerType {
- return LayerTypeDot11Data
- }
- type Dot11DataQOSDataCFAck struct {
- Dot11DataQOS
- }
- func decodeDot11DataQOSDataCFAck(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataQOSDataCFAck{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataQOSDataCFAck) LayerType() gopacket.LayerType { return LayerTypeDot11DataQOSDataCFAck }
- func (m *Dot11DataQOSDataCFAck) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11DataQOSDataCFAck
- }
- func (m *Dot11DataQOSDataCFAck) NextLayerType() gopacket.LayerType { return LayerTypeDot11DataCFAck }
- type Dot11DataQOSDataCFPoll struct {
- Dot11DataQOS
- }
- func decodeDot11DataQOSDataCFPoll(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataQOSDataCFPoll{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataQOSDataCFPoll) LayerType() gopacket.LayerType {
- return LayerTypeDot11DataQOSDataCFPoll
- }
- func (m *Dot11DataQOSDataCFPoll) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11DataQOSDataCFPoll
- }
- func (m *Dot11DataQOSDataCFPoll) NextLayerType() gopacket.LayerType { return LayerTypeDot11DataCFPoll }
- type Dot11DataQOSDataCFAckPoll struct {
- Dot11DataQOS
- }
- func decodeDot11DataQOSDataCFAckPoll(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataQOSDataCFAckPoll{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataQOSDataCFAckPoll) LayerType() gopacket.LayerType {
- return LayerTypeDot11DataQOSDataCFAckPoll
- }
- func (m *Dot11DataQOSDataCFAckPoll) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11DataQOSDataCFAckPoll
- }
- func (m *Dot11DataQOSDataCFAckPoll) NextLayerType() gopacket.LayerType {
- return LayerTypeDot11DataCFAckPoll
- }
- type Dot11DataQOSNull struct {
- Dot11DataQOS
- }
- func decodeDot11DataQOSNull(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataQOSNull{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataQOSNull) LayerType() gopacket.LayerType { return LayerTypeDot11DataQOSNull }
- func (m *Dot11DataQOSNull) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataQOSNull }
- func (m *Dot11DataQOSNull) NextLayerType() gopacket.LayerType { return LayerTypeDot11DataNull }
- type Dot11DataQOSCFPollNoData struct {
- Dot11DataQOS
- }
- func decodeDot11DataQOSCFPollNoData(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataQOSCFPollNoData{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataQOSCFPollNoData) LayerType() gopacket.LayerType {
- return LayerTypeDot11DataQOSCFPollNoData
- }
- func (m *Dot11DataQOSCFPollNoData) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11DataQOSCFPollNoData
- }
- func (m *Dot11DataQOSCFPollNoData) NextLayerType() gopacket.LayerType {
- return LayerTypeDot11DataCFPollNoData
- }
- type Dot11DataQOSCFAckPollNoData struct {
- Dot11DataQOS
- }
- func decodeDot11DataQOSCFAckPollNoData(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11DataQOSCFAckPollNoData{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11DataQOSCFAckPollNoData) LayerType() gopacket.LayerType {
- return LayerTypeDot11DataQOSCFAckPollNoData
- }
- func (m *Dot11DataQOSCFAckPollNoData) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11DataQOSCFAckPollNoData
- }
- func (m *Dot11DataQOSCFAckPollNoData) NextLayerType() gopacket.LayerType {
- return LayerTypeDot11DataCFAckPollNoData
- }
- type Dot11InformationElement struct {
- BaseLayer
- ID Dot11InformationElementID
- Length uint8
- OUI []byte
- Info []byte
- }
- func (m *Dot11InformationElement) LayerType() gopacket.LayerType {
- return LayerTypeDot11InformationElement
- }
- func (m *Dot11InformationElement) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11InformationElement
- }
- func (m *Dot11InformationElement) NextLayerType() gopacket.LayerType {
- return LayerTypeDot11InformationElement
- }
- func (m *Dot11InformationElement) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- if len(data) < 2 {
- df.SetTruncated()
- return fmt.Errorf("Dot11InformationElement length %v too short, %v required", len(data), 2)
- }
- m.ID = Dot11InformationElementID(data[0])
- m.Length = data[1]
- offset := int(2)
- if len(data) < offset+int(m.Length) {
- df.SetTruncated()
- return fmt.Errorf("Dot11InformationElement length %v too short, %v required", len(data), offset+int(m.Length))
- }
- if len(data) < offset+4 {
- df.SetTruncated()
- return fmt.Errorf("vendor extension size < %d", offset+int(m.Length))
- }
- if m.ID == 221 {
- // Vendor extension
- m.OUI = data[offset : offset+4]
- m.Info = data[offset+4 : offset+int(m.Length)]
- } else {
- m.Info = data[offset : offset+int(m.Length)]
- }
- offset += int(m.Length)
- m.BaseLayer = BaseLayer{Contents: data[:offset], Payload: data[offset:]}
- return nil
- }
- func (d *Dot11InformationElement) String() string {
- if d.ID == 0 {
- return fmt.Sprintf("802.11 Information Element (ID: %v, Length: %v, SSID: %v)", d.ID, d.Length, string(d.Info))
- } else if d.ID == 1 {
- rates := ""
- for i := 0; i < len(d.Info); i++ {
- if d.Info[i]&0x80 == 0 {
- rates += fmt.Sprintf("%.1f ", float32(d.Info[i])*0.5)
- } else {
- rates += fmt.Sprintf("%.1f* ", float32(d.Info[i]&0x7F)*0.5)
- }
- }
- return fmt.Sprintf("802.11 Information Element (ID: %v, Length: %v, Rates: %s Mbit)", d.ID, d.Length, rates)
- } else if d.ID == 221 {
- return fmt.Sprintf("802.11 Information Element (ID: %v, Length: %v, OUI: %X, Info: %X)", d.ID, d.Length, d.OUI, d.Info)
- } else {
- return fmt.Sprintf("802.11 Information Element (ID: %v, Length: %v, Info: %X)", d.ID, d.Length, d.Info)
- }
- }
- func (m Dot11InformationElement) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- length := len(m.Info) + len(m.OUI)
- if buf, err := b.PrependBytes(2 + length); err != nil {
- return err
- } else {
- buf[0] = uint8(m.ID)
- buf[1] = uint8(length)
- copy(buf[2:], m.OUI)
- copy(buf[2+len(m.OUI):], m.Info)
- }
- return nil
- }
- func decodeDot11InformationElement(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11InformationElement{}
- return decodingLayerDecoder(d, data, p)
- }
- type Dot11CtrlCTS struct {
- Dot11Ctrl
- }
- func decodeDot11CtrlCTS(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11CtrlCTS{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11CtrlCTS) LayerType() gopacket.LayerType {
- return LayerTypeDot11CtrlCTS
- }
- func (m *Dot11CtrlCTS) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11CtrlCTS
- }
- func (m *Dot11CtrlCTS) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Ctrl.DecodeFromBytes(data, df)
- }
- type Dot11CtrlRTS struct {
- Dot11Ctrl
- }
- func decodeDot11CtrlRTS(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11CtrlRTS{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11CtrlRTS) LayerType() gopacket.LayerType {
- return LayerTypeDot11CtrlRTS
- }
- func (m *Dot11CtrlRTS) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11CtrlRTS
- }
- func (m *Dot11CtrlRTS) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Ctrl.DecodeFromBytes(data, df)
- }
- type Dot11CtrlBlockAckReq struct {
- Dot11Ctrl
- }
- func decodeDot11CtrlBlockAckReq(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11CtrlBlockAckReq{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11CtrlBlockAckReq) LayerType() gopacket.LayerType {
- return LayerTypeDot11CtrlBlockAckReq
- }
- func (m *Dot11CtrlBlockAckReq) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11CtrlBlockAckReq
- }
- func (m *Dot11CtrlBlockAckReq) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Ctrl.DecodeFromBytes(data, df)
- }
- type Dot11CtrlBlockAck struct {
- Dot11Ctrl
- }
- func decodeDot11CtrlBlockAck(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11CtrlBlockAck{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11CtrlBlockAck) LayerType() gopacket.LayerType { return LayerTypeDot11CtrlBlockAck }
- func (m *Dot11CtrlBlockAck) CanDecode() gopacket.LayerClass { return LayerTypeDot11CtrlBlockAck }
- func (m *Dot11CtrlBlockAck) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Ctrl.DecodeFromBytes(data, df)
- }
- type Dot11CtrlPowersavePoll struct {
- Dot11Ctrl
- }
- func decodeDot11CtrlPowersavePoll(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11CtrlPowersavePoll{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11CtrlPowersavePoll) LayerType() gopacket.LayerType {
- return LayerTypeDot11CtrlPowersavePoll
- }
- func (m *Dot11CtrlPowersavePoll) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11CtrlPowersavePoll
- }
- func (m *Dot11CtrlPowersavePoll) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Ctrl.DecodeFromBytes(data, df)
- }
- type Dot11CtrlAck struct {
- Dot11Ctrl
- }
- func decodeDot11CtrlAck(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11CtrlAck{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11CtrlAck) LayerType() gopacket.LayerType { return LayerTypeDot11CtrlAck }
- func (m *Dot11CtrlAck) CanDecode() gopacket.LayerClass { return LayerTypeDot11CtrlAck }
- func (m *Dot11CtrlAck) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Ctrl.DecodeFromBytes(data, df)
- }
- type Dot11CtrlCFEnd struct {
- Dot11Ctrl
- }
- func decodeDot11CtrlCFEnd(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11CtrlCFEnd{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11CtrlCFEnd) LayerType() gopacket.LayerType {
- return LayerTypeDot11CtrlCFEnd
- }
- func (m *Dot11CtrlCFEnd) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11CtrlCFEnd
- }
- func (m *Dot11CtrlCFEnd) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Ctrl.DecodeFromBytes(data, df)
- }
- type Dot11CtrlCFEndAck struct {
- Dot11Ctrl
- }
- func decodeDot11CtrlCFEndAck(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11CtrlCFEndAck{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11CtrlCFEndAck) LayerType() gopacket.LayerType {
- return LayerTypeDot11CtrlCFEndAck
- }
- func (m *Dot11CtrlCFEndAck) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11CtrlCFEndAck
- }
- func (m *Dot11CtrlCFEndAck) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- return m.Dot11Ctrl.DecodeFromBytes(data, df)
- }
- type Dot11MgmtAssociationReq struct {
- Dot11Mgmt
- CapabilityInfo uint16
- ListenInterval uint16
- }
- func decodeDot11MgmtAssociationReq(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtAssociationReq{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtAssociationReq) LayerType() gopacket.LayerType {
- return LayerTypeDot11MgmtAssociationReq
- }
- func (m *Dot11MgmtAssociationReq) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11MgmtAssociationReq
- }
- func (m *Dot11MgmtAssociationReq) NextLayerType() gopacket.LayerType {
- return LayerTypeDot11InformationElement
- }
- func (m *Dot11MgmtAssociationReq) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- if len(data) < 4 {
- df.SetTruncated()
- return fmt.Errorf("Dot11MgmtAssociationReq length %v too short, %v required", len(data), 4)
- }
- m.CapabilityInfo = binary.LittleEndian.Uint16(data[0:2])
- m.ListenInterval = binary.LittleEndian.Uint16(data[2:4])
- m.Payload = data[4:]
- return m.Dot11Mgmt.DecodeFromBytes(data, df)
- }
- func (m Dot11MgmtAssociationReq) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- buf, err := b.PrependBytes(4)
- if err != nil {
- return err
- }
- binary.LittleEndian.PutUint16(buf[0:2], m.CapabilityInfo)
- binary.LittleEndian.PutUint16(buf[2:4], m.ListenInterval)
- return nil
- }
- type Dot11MgmtAssociationResp struct {
- Dot11Mgmt
- CapabilityInfo uint16
- Status Dot11Status
- AID uint16
- }
- func decodeDot11MgmtAssociationResp(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtAssociationResp{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtAssociationResp) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11MgmtAssociationResp
- }
- func (m *Dot11MgmtAssociationResp) LayerType() gopacket.LayerType {
- return LayerTypeDot11MgmtAssociationResp
- }
- func (m *Dot11MgmtAssociationResp) NextLayerType() gopacket.LayerType {
- return LayerTypeDot11InformationElement
- }
- func (m *Dot11MgmtAssociationResp) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- if len(data) < 6 {
- df.SetTruncated()
- return fmt.Errorf("Dot11MgmtAssociationResp length %v too short, %v required", len(data), 6)
- }
- m.CapabilityInfo = binary.LittleEndian.Uint16(data[0:2])
- m.Status = Dot11Status(binary.LittleEndian.Uint16(data[2:4]))
- m.AID = binary.LittleEndian.Uint16(data[4:6])
- m.Payload = data[6:]
- return m.Dot11Mgmt.DecodeFromBytes(data, df)
- }
- func (m Dot11MgmtAssociationResp) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- buf, err := b.PrependBytes(6)
- if err != nil {
- return err
- }
- binary.LittleEndian.PutUint16(buf[0:2], m.CapabilityInfo)
- binary.LittleEndian.PutUint16(buf[2:4], uint16(m.Status))
- binary.LittleEndian.PutUint16(buf[4:6], m.AID)
- return nil
- }
- type Dot11MgmtReassociationReq struct {
- Dot11Mgmt
- CapabilityInfo uint16
- ListenInterval uint16
- CurrentApAddress net.HardwareAddr
- }
- func decodeDot11MgmtReassociationReq(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtReassociationReq{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtReassociationReq) LayerType() gopacket.LayerType {
- return LayerTypeDot11MgmtReassociationReq
- }
- func (m *Dot11MgmtReassociationReq) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11MgmtReassociationReq
- }
- func (m *Dot11MgmtReassociationReq) NextLayerType() gopacket.LayerType {
- return LayerTypeDot11InformationElement
- }
- func (m *Dot11MgmtReassociationReq) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- if len(data) < 10 {
- df.SetTruncated()
- return fmt.Errorf("Dot11MgmtReassociationReq length %v too short, %v required", len(data), 10)
- }
- m.CapabilityInfo = binary.LittleEndian.Uint16(data[0:2])
- m.ListenInterval = binary.LittleEndian.Uint16(data[2:4])
- m.CurrentApAddress = net.HardwareAddr(data[4:10])
- m.Payload = data[10:]
- return m.Dot11Mgmt.DecodeFromBytes(data, df)
- }
- func (m Dot11MgmtReassociationReq) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- buf, err := b.PrependBytes(10)
- if err != nil {
- return err
- }
- binary.LittleEndian.PutUint16(buf[0:2], m.CapabilityInfo)
- binary.LittleEndian.PutUint16(buf[2:4], m.ListenInterval)
- copy(buf[4:10], m.CurrentApAddress)
- return nil
- }
- type Dot11MgmtReassociationResp struct {
- Dot11Mgmt
- }
- func decodeDot11MgmtReassociationResp(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtReassociationResp{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtReassociationResp) LayerType() gopacket.LayerType {
- return LayerTypeDot11MgmtReassociationResp
- }
- func (m *Dot11MgmtReassociationResp) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11MgmtReassociationResp
- }
- func (m *Dot11MgmtReassociationResp) NextLayerType() gopacket.LayerType {
- return LayerTypeDot11InformationElement
- }
- type Dot11MgmtProbeReq struct {
- Dot11Mgmt
- }
- func decodeDot11MgmtProbeReq(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtProbeReq{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtProbeReq) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtProbeReq }
- func (m *Dot11MgmtProbeReq) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtProbeReq }
- func (m *Dot11MgmtProbeReq) NextLayerType() gopacket.LayerType {
- return LayerTypeDot11InformationElement
- }
- type Dot11MgmtProbeResp struct {
- Dot11Mgmt
- Timestamp uint64
- Interval uint16
- Flags uint16
- }
- func decodeDot11MgmtProbeResp(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtProbeResp{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtProbeResp) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtProbeResp }
- func (m *Dot11MgmtProbeResp) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtProbeResp }
- func (m *Dot11MgmtProbeResp) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- if len(data) < 12 {
- df.SetTruncated()
- return fmt.Errorf("Dot11MgmtProbeResp length %v too short, %v required", len(data), 12)
- }
- m.Timestamp = binary.LittleEndian.Uint64(data[0:8])
- m.Interval = binary.LittleEndian.Uint16(data[8:10])
- m.Flags = binary.LittleEndian.Uint16(data[10:12])
- m.Payload = data[12:]
- return m.Dot11Mgmt.DecodeFromBytes(data, df)
- }
- func (m *Dot11MgmtProbeResp) NextLayerType() gopacket.LayerType {
- return LayerTypeDot11InformationElement
- }
- func (m Dot11MgmtProbeResp) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- buf, err := b.PrependBytes(12)
- if err != nil {
- return err
- }
- binary.LittleEndian.PutUint64(buf[0:8], m.Timestamp)
- binary.LittleEndian.PutUint16(buf[8:10], m.Interval)
- binary.LittleEndian.PutUint16(buf[10:12], m.Flags)
- return nil
- }
- type Dot11MgmtMeasurementPilot struct {
- Dot11Mgmt
- }
- func decodeDot11MgmtMeasurementPilot(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtMeasurementPilot{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtMeasurementPilot) LayerType() gopacket.LayerType {
- return LayerTypeDot11MgmtMeasurementPilot
- }
- func (m *Dot11MgmtMeasurementPilot) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11MgmtMeasurementPilot
- }
- type Dot11MgmtBeacon struct {
- Dot11Mgmt
- Timestamp uint64
- Interval uint16
- Flags uint16
- }
- func decodeDot11MgmtBeacon(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtBeacon{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtBeacon) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtBeacon }
- func (m *Dot11MgmtBeacon) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtBeacon }
- func (m *Dot11MgmtBeacon) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- if len(data) < 12 {
- df.SetTruncated()
- return fmt.Errorf("Dot11MgmtBeacon length %v too short, %v required", len(data), 12)
- }
- m.Timestamp = binary.LittleEndian.Uint64(data[0:8])
- m.Interval = binary.LittleEndian.Uint16(data[8:10])
- m.Flags = binary.LittleEndian.Uint16(data[10:12])
- m.Payload = data[12:]
- return m.Dot11Mgmt.DecodeFromBytes(data, df)
- }
- func (m *Dot11MgmtBeacon) NextLayerType() gopacket.LayerType { return LayerTypeDot11InformationElement }
- func (m Dot11MgmtBeacon) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- buf, err := b.PrependBytes(12)
- if err != nil {
- return err
- }
- binary.LittleEndian.PutUint64(buf[0:8], m.Timestamp)
- binary.LittleEndian.PutUint16(buf[8:10], m.Interval)
- binary.LittleEndian.PutUint16(buf[10:12], m.Flags)
- return nil
- }
- type Dot11MgmtATIM struct {
- Dot11Mgmt
- }
- func decodeDot11MgmtATIM(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtATIM{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtATIM) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtATIM }
- func (m *Dot11MgmtATIM) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtATIM }
- type Dot11MgmtDisassociation struct {
- Dot11Mgmt
- Reason Dot11Reason
- }
- func decodeDot11MgmtDisassociation(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtDisassociation{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtDisassociation) LayerType() gopacket.LayerType {
- return LayerTypeDot11MgmtDisassociation
- }
- func (m *Dot11MgmtDisassociation) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11MgmtDisassociation
- }
- func (m *Dot11MgmtDisassociation) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- if len(data) < 2 {
- df.SetTruncated()
- return fmt.Errorf("Dot11MgmtDisassociation length %v too short, %v required", len(data), 2)
- }
- m.Reason = Dot11Reason(binary.LittleEndian.Uint16(data[0:2]))
- return m.Dot11Mgmt.DecodeFromBytes(data, df)
- }
- func (m Dot11MgmtDisassociation) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- buf, err := b.PrependBytes(2)
- if err != nil {
- return err
- }
- binary.LittleEndian.PutUint16(buf[0:2], uint16(m.Reason))
- return nil
- }
- type Dot11MgmtAuthentication struct {
- Dot11Mgmt
- Algorithm Dot11Algorithm
- Sequence uint16
- Status Dot11Status
- }
- func decodeDot11MgmtAuthentication(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtAuthentication{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtAuthentication) LayerType() gopacket.LayerType {
- return LayerTypeDot11MgmtAuthentication
- }
- func (m *Dot11MgmtAuthentication) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11MgmtAuthentication
- }
- func (m *Dot11MgmtAuthentication) NextLayerType() gopacket.LayerType {
- return LayerTypeDot11InformationElement
- }
- func (m *Dot11MgmtAuthentication) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- if len(data) < 6 {
- df.SetTruncated()
- return fmt.Errorf("Dot11MgmtAuthentication length %v too short, %v required", len(data), 6)
- }
- m.Algorithm = Dot11Algorithm(binary.LittleEndian.Uint16(data[0:2]))
- m.Sequence = binary.LittleEndian.Uint16(data[2:4])
- m.Status = Dot11Status(binary.LittleEndian.Uint16(data[4:6]))
- m.Payload = data[6:]
- return m.Dot11Mgmt.DecodeFromBytes(data, df)
- }
- func (m Dot11MgmtAuthentication) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- buf, err := b.PrependBytes(6)
- if err != nil {
- return err
- }
- binary.LittleEndian.PutUint16(buf[0:2], uint16(m.Algorithm))
- binary.LittleEndian.PutUint16(buf[2:4], m.Sequence)
- binary.LittleEndian.PutUint16(buf[4:6], uint16(m.Status))
- return nil
- }
- type Dot11MgmtDeauthentication struct {
- Dot11Mgmt
- Reason Dot11Reason
- }
- func decodeDot11MgmtDeauthentication(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtDeauthentication{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtDeauthentication) LayerType() gopacket.LayerType {
- return LayerTypeDot11MgmtDeauthentication
- }
- func (m *Dot11MgmtDeauthentication) CanDecode() gopacket.LayerClass {
- return LayerTypeDot11MgmtDeauthentication
- }
- func (m *Dot11MgmtDeauthentication) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- if len(data) < 2 {
- df.SetTruncated()
- return fmt.Errorf("Dot11MgmtDeauthentication length %v too short, %v required", len(data), 2)
- }
- m.Reason = Dot11Reason(binary.LittleEndian.Uint16(data[0:2]))
- return m.Dot11Mgmt.DecodeFromBytes(data, df)
- }
- func (m Dot11MgmtDeauthentication) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- buf, err := b.PrependBytes(2)
- if err != nil {
- return err
- }
- binary.LittleEndian.PutUint16(buf[0:2], uint16(m.Reason))
- return nil
- }
- type Dot11MgmtAction struct {
- Dot11Mgmt
- }
- func decodeDot11MgmtAction(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtAction{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtAction) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtAction }
- func (m *Dot11MgmtAction) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtAction }
- type Dot11MgmtActionNoAck struct {
- Dot11Mgmt
- }
- func decodeDot11MgmtActionNoAck(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtActionNoAck{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtActionNoAck) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtActionNoAck }
- func (m *Dot11MgmtActionNoAck) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtActionNoAck }
- type Dot11MgmtArubaWLAN struct {
- Dot11Mgmt
- }
- func decodeDot11MgmtArubaWLAN(data []byte, p gopacket.PacketBuilder) error {
- d := &Dot11MgmtArubaWLAN{}
- return decodingLayerDecoder(d, data, p)
- }
- func (m *Dot11MgmtArubaWLAN) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtArubaWLAN }
- func (m *Dot11MgmtArubaWLAN) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtArubaWLAN }
|