| package cmd |
| |
| import ( |
| "bytes" |
| "errors" |
| "fmt" |
| "io" |
| "log" |
| |
| "github.com/paypal/gatt/linux/evt" |
| "github.com/paypal/gatt/linux/util" |
| ) |
| |
| type CmdParam interface { |
| Marshal([]byte) |
| Opcode() int |
| Len() int |
| } |
| |
| func NewCmd(d io.Writer) *Cmd { |
| c := &Cmd{ |
| dev: d, |
| sent: []*cmdPkt{}, |
| compc: make(chan evt.CommandCompleteEP), |
| statusc: make(chan evt.CommandStatusEP), |
| } |
| go c.processCmdEvents() |
| return c |
| } |
| |
| type cmdPkt struct { |
| op int |
| cp CmdParam |
| done chan []byte |
| } |
| |
| func (c cmdPkt) Marshal() []byte { |
| b := make([]byte, 1+2+1+c.cp.Len()) |
| b[0] = byte(0x1) // typCommandPkt |
| b[1] = byte(c.op) |
| b[2] = byte(c.op >> 8) |
| b[3] = byte(c.cp.Len()) |
| c.cp.Marshal(b[4:]) |
| return b |
| } |
| |
| type Cmd struct { |
| dev io.Writer |
| sent []*cmdPkt |
| compc chan evt.CommandCompleteEP |
| statusc chan evt.CommandStatusEP |
| } |
| |
| func (c Cmd) trace(fmt string, v ...interface{}) {} |
| |
| func (c *Cmd) HandleComplete(b []byte) error { |
| var e evt.CommandCompleteEP |
| if err := e.Unmarshal(b); err != nil { |
| return err |
| } |
| c.compc <- e |
| return nil |
| } |
| |
| func (c *Cmd) HandleStatus(b []byte) error { |
| var e evt.CommandStatusEP |
| if err := e.Unmarshal(b); err != nil { |
| return err |
| } |
| c.statusc <- e |
| return nil |
| } |
| |
| func (c *Cmd) Send(cp CmdParam) ([]byte, error) { |
| op := cp.Opcode() |
| p := &cmdPkt{op: op, cp: cp, done: make(chan []byte)} |
| raw := p.Marshal() |
| |
| c.sent = append(c.sent, p) |
| if n, err := c.dev.Write(raw); err != nil { |
| return nil, err |
| } else if n != len(raw) { |
| return nil, errors.New("Failed to send whole Cmd pkt to HCI socket") |
| } |
| return <-p.done, nil |
| } |
| |
| func (c *Cmd) SendAndCheckResp(cp CmdParam, exp []byte) error { |
| rsp, err := c.Send(cp) |
| if err != nil { |
| return err |
| } |
| // Don't care about the response |
| if len(exp) == 0 { |
| return nil |
| } |
| // Check the if status is one of the expected value |
| if !bytes.Contains(exp, rsp[0:1]) { |
| return fmt.Errorf("HCI command: '0x%04x' return 0x%02X, expect: [%X] ", cp.Opcode(), rsp[0], exp) |
| } |
| return nil |
| } |
| |
| func (c *Cmd) processCmdEvents() { |
| for { |
| select { |
| case status := <-c.statusc: |
| found := false |
| for i, p := range c.sent { |
| if uint16(p.op) == status.CommandOpcode { |
| found = true |
| c.sent = append(c.sent[:i], c.sent[i+1:]...) |
| close(p.done) |
| break |
| } |
| } |
| if !found { |
| log.Printf("Can't find the cmdPkt for this CommandStatusEP: %v", status) |
| } |
| case comp := <-c.compc: |
| found := false |
| for i, p := range c.sent { |
| if uint16(p.op) == comp.CommandOPCode { |
| found = true |
| c.sent = append(c.sent[:i], c.sent[i+1:]...) |
| p.done <- comp.ReturnParameters |
| break |
| } |
| } |
| if !found { |
| log.Printf("Can't find the cmdPkt for this CommandCompleteEP: %v", comp) |
| } |
| } |
| } |
| } |
| |
| const ( |
| linkCtl = 0x01 |
| linkPolicy = 0x02 |
| hostCtl = 0x03 |
| infoParam = 0x04 |
| statusParam = 0x05 |
| testingCmd = 0X3E |
| leCtl = 0x08 |
| vendorCmd = 0X3F |
| ) |
| |
| const ( |
| opInquiry = linkCtl<<10 | 0x0001 // Inquiry |
| opInquiryCancel = linkCtl<<10 | 0x0002 // Inquiry Cancel |
| opPeriodicInquiry = linkCtl<<10 | 0x0003 // Periodic Inquiry Mode |
| opExitPeriodicInquiry = linkCtl<<10 | 0x0004 // Exit Periodic Inquiry Mode |
| opCreateConn = linkCtl<<10 | 0x0005 // Create Connection |
| opDisconnect = linkCtl<<10 | 0x0006 // Disconnect |
| opCreateConnCancel = linkCtl<<10 | 0x0008 // Create Connection Cancel |
| opAcceptConnReq = linkCtl<<10 | 0x0009 // Accept Connection Request |
| opRejectConnReq = linkCtl<<10 | 0x000A // Reject Connection Request |
| opLinkKeyReply = linkCtl<<10 | 0x000B // Link Key Request Reply |
| opLinkKeyNegReply = linkCtl<<10 | 0x000C // Link Key Request Negative Reply |
| opPinCodeReply = linkCtl<<10 | 0x000D // PIN Code Request Reply |
| opPinCodeNegReply = linkCtl<<10 | 0x000E // PIN Code Request Negative Reply |
| opSetConnPtype = linkCtl<<10 | 0x000F // Change Connection Packet Type |
| opAuthRequested = linkCtl<<10 | 0x0011 // Authentication Request |
| opSetConnEncrypt = linkCtl<<10 | 0x0013 // Set Connection Encryption |
| opChangeConnLinkKey = linkCtl<<10 | 0x0015 // Change Connection Link Key |
| opMasterLinkKey = linkCtl<<10 | 0x0017 // Master Link Key |
| opRemoteNameReq = linkCtl<<10 | 0x0019 // Remote Name Request |
| opRemoteNameReqCancel = linkCtl<<10 | 0x001A // Remote Name Request Cancel |
| opReadRemoteFeatures = linkCtl<<10 | 0x001B // Read Remote Supported Features |
| opReadRemoteExtFeatures = linkCtl<<10 | 0x001C // Read Remote Extended Features |
| opReadRemoteVersion = linkCtl<<10 | 0x001D // Read Remote Version Information |
| opReadClockOffset = linkCtl<<10 | 0x001F // Read Clock Offset |
| opReadLMPHandle = linkCtl<<10 | 0x0020 // Read LMP Handle |
| opSetupSyncConn = linkCtl<<10 | 0x0028 // Setup Synchronous Connection |
| opAcceptSyncConnReq = linkCtl<<10 | 0x0029 // Aceept Synchronous Connection |
| opRejectSyncConnReq = linkCtl<<10 | 0x002A // Recject Synchronous Connection |
| opIOCapabilityReply = linkCtl<<10 | 0x002B // IO Capability Request Reply |
| opUserConfirmReply = linkCtl<<10 | 0x002C // User Confirmation Request Reply |
| opUserConfirmNegReply = linkCtl<<10 | 0x002D // User Confirmation Negative Reply |
| opUserPasskeyReply = linkCtl<<10 | 0x002E // User Passkey Request Reply |
| opUserPasskeyNegReply = linkCtl<<10 | 0x002F // User Passkey Request Negative Reply |
| opRemoteOOBDataReply = linkCtl<<10 | 0x0030 // Remote OOB Data Request Reply |
| opRemoteOOBDataNegReply = linkCtl<<10 | 0x0033 // Remote OOB Data Request Negative Reply |
| opIOCapabilityNegReply = linkCtl<<10 | 0x0034 // IO Capability Request Negative Reply |
| opCreatePhysicalLink = linkCtl<<10 | 0x0035 // Create Physical Link |
| opAcceptPhysicalLink = linkCtl<<10 | 0x0036 // Accept Physical Link |
| opDisconnectPhysicalLink = linkCtl<<10 | 0x0037 // Disconnect Physical Link |
| opCreateLogicalLink = linkCtl<<10 | 0x0038 // Create Logical Link |
| opAcceptLogicalLink = linkCtl<<10 | 0x0039 // Accept Logical Link |
| opDisconnectLogicalLink = linkCtl<<10 | 0x003A // Disconnect Logical Link |
| opLogicalLinkCancel = linkCtl<<10 | 0x003B // Logical Link Cancel |
| opFlowSpecModify = linkCtl<<10 | 0x003C // Flow Spec Modify |
| ) |
| |
| const ( |
| opHoldMode = linkPolicy<<10 | 0x0001 // Hold Mode |
| opSniffMode = linkPolicy<<10 | 0x0003 // Sniff Mode |
| opExitSniffMode = linkPolicy<<10 | 0x0004 // Exit Sniff Mode |
| opParkMode = linkPolicy<<10 | 0x0005 // Park State |
| opExitParkMode = linkPolicy<<10 | 0x0006 // Exit Park State |
| opQoSSetup = linkPolicy<<10 | 0x0007 // QoS Setup |
| opRoleDiscovery = linkPolicy<<10 | 0x0009 // Role Discovery |
| opSwitchRole = linkPolicy<<10 | 0x000B // Switch Role |
| opReadLinkPolicy = linkPolicy<<10 | 0x000C // Read Link Policy Settings |
| opWriteLinkPolicy = linkPolicy<<10 | 0x000D // Write Link Policy Settings |
| opReadDefaultLinkPolicy = linkPolicy<<10 | 0x000E // Read Default Link Policy Settings |
| opWriteDefaultLinkPolicy = linkPolicy<<10 | 0x000F // Write Default Link Policy Settings |
| opFlowSpecification = linkPolicy<<10 | 0x0010 // Flow Specification |
| opSniffSubrating = linkPolicy<<10 | 0x0011 // Sniff Subrating |
| ) |
| |
| const ( |
| opSetEventMask = hostCtl<<10 | 0x0001 // Set Event Mask |
| opReset = hostCtl<<10 | 0x0003 // Reset |
| opSetEventFlt = hostCtl<<10 | 0x0005 // Set Event Filter |
| opFlush = hostCtl<<10 | 0x0008 // Flush |
| opReadPinType = hostCtl<<10 | 0x0009 // Read PIN Type |
| opWritePinType = hostCtl<<10 | 0x000A // Write PIN Type |
| opCreateNewUnitKey = hostCtl<<10 | 0x000B // Create New Unit Key |
| opReadStoredLinkKey = hostCtl<<10 | 0x000D // Read Stored Link Key |
| opWriteStoredLinkKey = hostCtl<<10 | 0x0011 // Write Stored Link Key |
| opDeleteStoredLinkKey = hostCtl<<10 | 0x0012 // Delete Stored Link Key |
| opWriteLocalName = hostCtl<<10 | 0x0013 // Write Local Name |
| opReadLocalName = hostCtl<<10 | 0x0014 // Read Local Name |
| opReadConnAcceptTimeout = hostCtl<<10 | 0x0015 // Read Connection Accept Timeout |
| opWriteConnAcceptTimeout = hostCtl<<10 | 0x0016 // Write Connection Accept Timeout |
| opReadPageTimeout = hostCtl<<10 | 0x0017 // Read Page Timeout |
| opWritePageTimeout = hostCtl<<10 | 0x0018 // Write Page Timeout |
| opReadScanEnable = hostCtl<<10 | 0x0019 // Read Scan Enable |
| opWriteScanEnable = hostCtl<<10 | 0x001A // Write Scan Enable |
| opReadPageActivity = hostCtl<<10 | 0x001B // Read Page Scan Activity |
| opWritePageActivity = hostCtl<<10 | 0x001C // Write Page Scan Activity |
| opReadInqActivity = hostCtl<<10 | 0x001D // Read Inquiry Scan Activity |
| opWriteInqActivity = hostCtl<<10 | 0x001E // Write Inquiry Scan Activity |
| opReadAuthEnable = hostCtl<<10 | 0x001F // Read Authentication Enable |
| opWriteAuthEnable = hostCtl<<10 | 0x0020 // Write Authentication Enable |
| opReadEncryptMode = hostCtl<<10 | 0x0021 |
| opWriteEncryptMode = hostCtl<<10 | 0x0022 |
| opReadClassOfDev = hostCtl<<10 | 0x0023 // Read Class of Device |
| opWriteClassOfDevice = hostCtl<<10 | 0x0024 // Write Class of Device |
| opReadVoiceSetting = hostCtl<<10 | 0x0025 // Read Voice Setting |
| opWriteVoiceSetting = hostCtl<<10 | 0x0026 // Write Voice Setting |
| opReadAutomaticFlushTimeout = hostCtl<<10 | 0x0027 // Read Automatic Flush Timeout |
| opWriteAutomaticFlushTimeout = hostCtl<<10 | 0x0028 // Write Automatic Flush Timeout |
| opReadNumBroadcastRetrans = hostCtl<<10 | 0x0029 // Read Num Broadcast Retransmissions |
| opWriteNumBroadcastRetrans = hostCtl<<10 | 0x002A // Write Num Broadcast Retransmissions |
| opReadHoldModeActivity = hostCtl<<10 | 0x002B // Read Hold Mode Activity |
| opWriteHoldModeActivity = hostCtl<<10 | 0x002C // Write Hold Mode Activity |
| opReadTransmitPowerLevel = hostCtl<<10 | 0x002D // Read Transmit Power Level |
| opReadSyncFlowEnable = hostCtl<<10 | 0x002E // Read Synchronous Flow Control |
| opWriteSyncFlowEnable = hostCtl<<10 | 0x002F // Write Synchronous Flow Control |
| opSetControllerToHostFC = hostCtl<<10 | 0x0031 // Set Controller To Host Flow Control |
| opHostBufferSize = hostCtl<<10 | 0x0033 // Host Buffer Size |
| opHostNumCompPkts = hostCtl<<10 | 0x0035 // Host Number Of Completed Packets |
| opReadLinkSupervisionTimeout = hostCtl<<10 | 0x0036 // Read Link Supervision Timeout |
| opWriteLinkSupervisionTimeout = hostCtl<<10 | 0x0037 // Write Link Supervision Timeout |
| opReadNumSupportedIAC = hostCtl<<10 | 0x0038 // Read Number Of Supported IAC |
| opReadCurrentIACLAP = hostCtl<<10 | 0x0039 // Read Current IAC LAP |
| opWriteCurrentIACLAP = hostCtl<<10 | 0x003A // Write Current IAC LAP |
| opReadPageScanPeriodMode = hostCtl<<10 | 0x003B |
| opWritePageScanPeriodMode = hostCtl<<10 | 0x003C |
| opReadPageScanMode = hostCtl<<10 | 0x003D |
| opWritePageScanMode = hostCtl<<10 | 0x003E |
| opSetAFHClassification = hostCtl<<10 | 0x003F // Set AFH Host Channel Classification |
| opReadInquiryScanType = hostCtl<<10 | 0x0042 // Read Inquiry Scan Type |
| opWriteInquiryScanType = hostCtl<<10 | 0x0043 // Write Inquiry Scan Type |
| opReadInquiryMode = hostCtl<<10 | 0x0044 // Read Inquiry Mode |
| opWriteInquiryMode = hostCtl<<10 | 0x0045 // Write Inquiry Mode |
| opReadPageScanType = hostCtl<<10 | 0x0046 // Read Page Scan Type |
| opWritePageScanType = hostCtl<<10 | 0x0047 // Write Page Scan Type |
| opReadAFHMode = hostCtl<<10 | 0x0048 // Read AFH Channel Assessment Mode |
| opWriteAFHMode = hostCtl<<10 | 0x0049 // Write AFH Channel Assesment Mode |
| opReadExtInquiryResponse = hostCtl<<10 | 0x0051 // Read Extended Inquiry Response |
| opWriteExtInquiryResponse = hostCtl<<10 | 0x0052 // Write Extended Inquiry Response |
| opRefreshEncryptionKey = hostCtl<<10 | 0x0053 // Refresh Encryption Key |
| opReadSimplePairingMode = hostCtl<<10 | 0x0055 // Read Simple Pairing Mode |
| opWriteSimplePairingMode = hostCtl<<10 | 0x0056 // Write Simple Pairing Mode |
| opReadLocalOobData = hostCtl<<10 | 0x0057 // Read Local OOB Data |
| opReadInqResponseTransmitPowerLevel = hostCtl<<10 | 0x0058 // Read Inquiry Response Transmit Power Level |
| opWriteInquiryTransmitPowerLevel = hostCtl<<10 | 0x0059 // Write Inquiry Response Transmit Power Level |
| opReadDefaultErrorDataReporting = hostCtl<<10 | 0x005A // Read Default Erroneous Data Reporting |
| opWriteDefaultErrorDataReporting = hostCtl<<10 | 0x005B // Write Default Erroneous Data Reporting |
| opEnhancedFlush = hostCtl<<10 | 0x005F // Enhanced Flush |
| opSendKeypressNotify = hostCtl<<10 | 0x0060 // send Keypress Notification |
| opReadLogicalLinkAcceptTimeout = hostCtl<<10 | 0x0061 // Read Logical Link Accept Timeout |
| opWriteLogicalLinkAcceptTimeout = hostCtl<<10 | 0x0062 // Write Logical Link Accept Timeout |
| opSetEventMaskPage2 = hostCtl<<10 | 0x0063 // Set Event Mask Page 2 |
| opReadLocationData = hostCtl<<10 | 0x0064 // Read Location Data |
| opWriteLocationData = hostCtl<<10 | 0x0065 // Write Location Data |
| opReadFlowControlMode = hostCtl<<10 | 0x0066 // Read Flow Control Mode |
| opWriteFlowControlMode = hostCtl<<10 | 0x0067 // Write Flow Control Mode |
| opReadEnhancedTransmitpowerLevel = hostCtl<<10 | 0x0068 // Read Enhanced Transmit Power Level |
| opReadBestEffortFlushTimeout = hostCtl<<10 | 0x0069 // Read Best Effort Flush Timeout |
| opWriteBestEffortFlushTimeout = hostCtl<<10 | 0x006A // Write Best Effort Flush Timeout |
| opReadLEHostSupported = hostCtl<<10 | 0x006C // Read LE Host Supported |
| opWriteLEHostSupported = hostCtl<<10 | 0x006D // Write LE Host Supported |
| ) |
| const ( |
| opReadLocalVersionInformation = infoParam<<10 | 0x0001 // Read Local Version Information |
| opReadLocalSupportedCommands = infoParam<<10 | 0x0002 // Read Local Supported Commands |
| opReadLocalSupportedFeatures = infoParam<<10 | 0x0003 // Read Local Supported Features |
| opReadLocalExtendedFeatures = infoParam<<10 | 0x0004 // Read Local Extended Features |
| opReadBufferSize = infoParam<<10 | 0x0005 // Read Buffer Size |
| opReadBDADDR = infoParam<<10 | 0x0009 // Read BD_ADDR |
| opReadDataBlockSize = infoParam<<10 | 0x000A // Read Data Block Size |
| opReadLocalSupportedCodecs = infoParam<<10 | 0x000B // Read Local Supported Codecs |
| ) |
| const ( |
| opLESetEventMask = leCtl<<10 | 0x0001 // LE Set Event Mask |
| opLEReadBufferSize = leCtl<<10 | 0x0002 // LE Read Buffer Size |
| opLEReadLocalSupportedFeatures = leCtl<<10 | 0x0003 // LE Read Local Supported Features |
| opLESetRandomAddress = leCtl<<10 | 0x0005 // LE Set Random Address |
| opLESetAdvertisingParameters = leCtl<<10 | 0x0006 // LE Set Advertising Parameters |
| opLEReadAdvertisingChannelTxPower = leCtl<<10 | 0x0007 // LE Read Advertising Channel Tx Power |
| opLESetAdvertisingData = leCtl<<10 | 0x0008 // LE Set Advertising Data |
| opLESetScanResponseData = leCtl<<10 | 0x0009 // LE Set Scan Response Data |
| opLESetAdvertiseEnable = leCtl<<10 | 0x000a // LE Set Advertising Enable |
| opLESetScanParameters = leCtl<<10 | 0x000b // LE Set Scan Parameters |
| opLESetScanEnable = leCtl<<10 | 0x000c // LE Set Scan Enable |
| opLECreateConn = leCtl<<10 | 0x000d // LE Create Connection |
| opLECreateConnCancel = leCtl<<10 | 0x000e // LE Create Connection Cancel |
| opLEReadWhiteListSize = leCtl<<10 | 0x000f // LE Read White List Size |
| opLEClearWhiteList = leCtl<<10 | 0x0010 // LE Clear White List |
| opLEAddDeviceToWhiteList = leCtl<<10 | 0x0011 // LE Add Device To White List |
| opLERemoveDeviceFromWhiteList = leCtl<<10 | 0x0012 // LE Remove Device From White List |
| opLEConnUpdate = leCtl<<10 | 0x0013 // LE Connection Update |
| opLESetHostChannelClassification = leCtl<<10 | 0x0014 // LE Set Host Channel Classification |
| opLEReadChannelMap = leCtl<<10 | 0x0015 // LE Read Channel Map |
| opLEReadRemoteUsedFeatures = leCtl<<10 | 0x0016 // LE Read Remote Used Features |
| opLEEncrypt = leCtl<<10 | 0x0017 // LE Encrypt |
| opLERand = leCtl<<10 | 0x0018 // LE Rand |
| opLEStartEncryption = leCtl<<10 | 0x0019 // LE Star Encryption |
| opLELTKReply = leCtl<<10 | 0x001a // LE Long Term Key Request Reply |
| opLELTKNegReply = leCtl<<10 | 0x001b // LE Long Term Key Request Negative Reply |
| opLEReadSupportedStates = leCtl<<10 | 0x001c // LE Read Supported States |
| opLEReceiverTest = leCtl<<10 | 0x001d // LE Reciever Test |
| opLETransmitterTest = leCtl<<10 | 0x001e // LE Transmitter Test |
| opLETestEnd = leCtl<<10 | 0x001f // LE Test End |
| opLERemoteConnectionParameterReply = leCtl<<10 | 0x0020 // LE Remote Connection Parameter Request Reply |
| opLERemoteConnectionParameterNegReply = leCtl<<10 | 0x0021 // LE Remote Connection Parameter Request Negative Reply |
| ) |
| |
| var o = util.Order |
| |
| // Link Control Commands |
| |
| // Disconnect (0x0006) |
| type Disconnect struct { |
| ConnectionHandle uint16 |
| Reason uint8 |
| } |
| |
| func (c Disconnect) Opcode() int { return opDisconnect } |
| func (c Disconnect) Len() int { return 3 } |
| func (c Disconnect) Marshal(b []byte) { |
| o.PutUint16(b[0:], c.ConnectionHandle) |
| b[2] = c.Reason |
| } |
| |
| // No Return Parameters, Check for Disconnection Complete Event |
| type DisconnectRP struct{} |
| |
| // Link Policy Commands |
| |
| // Write Default Link Policy |
| type WriteDefaultLinkPolicy struct{ DefaultLinkPolicySettings uint16 } |
| |
| func (c WriteDefaultLinkPolicy) Opcode() int { return opWriteDefaultLinkPolicy } |
| func (c WriteDefaultLinkPolicy) Len() int { return 2 } |
| func (c WriteDefaultLinkPolicy) Marshal(b []byte) { o.PutUint16(b, c.DefaultLinkPolicySettings) } |
| |
| type WriteDefaultLinkPolicyRP struct{ Status uint8 } |
| |
| // Host Control Commands |
| |
| // Set Event Mask (0x0001) |
| type SetEventMask struct{ EventMask uint64 } |
| |
| func (c SetEventMask) Opcode() int { return opSetEventMask } |
| func (c SetEventMask) Len() int { return 8 } |
| func (c SetEventMask) Marshal(b []byte) { o.PutUint64(b, c.EventMask) } |
| |
| type SetEventMaskRP struct{ Status uint8 } |
| |
| // Reset (0x0002) |
| type Reset struct{} |
| |
| func (c Reset) Opcode() int { return opReset } |
| func (c Reset) Len() int { return 0 } |
| func (c Reset) Marshal(b []byte) {} |
| |
| type ResetRP struct{ Status uint8 } |
| |
| // Set Event Filter (0x0003) |
| // FIXME: This structures are overloading. |
| // Both Marshal() and Len() are just placeholder. |
| // Need more effort for decoding. |
| // type SetEventFlt struct { |
| // FilterType uint8 |
| // FilterConditionType uint8 |
| // Condition uint8 |
| // } |
| |
| // func (c SetEventFlt) Opcode() int { return opSetEventFlt } |
| // func (c SetEventFlt) Len() int { return 0 } |
| // func (c SetEventFlt) Marshal(b []byte) {} |
| |
| type SetEventFltRP struct{ Status uint8 } |
| |
| // Flush (0x0008) |
| type Flush struct{ ConnectionHandle uint16 } |
| |
| func (c Flush) Opcode() int { return opFlush } |
| func (c Flush) Len() int { return 2 } |
| func (c Flush) Marshal(b []byte) { o.PutUint16(b, c.ConnectionHandle) } |
| |
| type flushRP struct{ status uint8 } |
| |
| // Write Page Timeout (0x0018) |
| type WritePageTimeout struct{ PageTimeout uint16 } |
| |
| func (c WritePageTimeout) Opcode() int { return opWritePageTimeout } |
| func (c WritePageTimeout) Len() int { return 2 } |
| func (c WritePageTimeout) Marshal(b []byte) { o.PutUint16(b, c.PageTimeout) } |
| |
| type WritePageTimeoutRP struct{} |
| |
| // Write Class of Device (0x0024) |
| type WriteClassOfDevice struct{ ClassOfDevice [3]byte } |
| |
| func (c WriteClassOfDevice) Opcode() int { return opWriteClassOfDevice } |
| func (c WriteClassOfDevice) Len() int { return 3 } |
| func (c WriteClassOfDevice) Marshal(b []byte) { copy(b, c.ClassOfDevice[:]) } |
| |
| type WriteClassOfDevRP struct{ status uint8 } |
| |
| // Write Host Buffer Size (0x0033) |
| type HostBufferSize struct { |
| HostACLDataPacketLength uint16 |
| HostSynchronousDataPacketLength uint8 |
| HostTotalNumACLDataPackets uint16 |
| HostTotalNumSynchronousDataPackets uint16 |
| } |
| |
| func (c HostBufferSize) Opcode() int { return opHostBufferSize } |
| func (c HostBufferSize) Len() int { return 7 } |
| func (c HostBufferSize) Marshal(b []byte) { |
| o.PutUint16(b[0:], c.HostACLDataPacketLength) |
| o.PutUint8(b[2:], c.HostSynchronousDataPacketLength) |
| o.PutUint16(b[3:], c.HostTotalNumACLDataPackets) |
| o.PutUint16(b[5:], c.HostTotalNumSynchronousDataPackets) |
| } |
| |
| type HostBufferSizeRP struct{ Status uint8 } |
| |
| // Write Inquiry Scan Type (0x0043) |
| type WriteInquiryScanType struct{ ScanType uint8 } |
| |
| func (c WriteInquiryScanType) Opcode() int { return opWriteInquiryScanType } |
| func (c WriteInquiryScanType) Len() int { return 1 } |
| func (c WriteInquiryScanType) Marshal(b []byte) { b[0] = c.ScanType } |
| |
| type WriteInquiryScanTypeRP struct{ Status uint8 } |
| |
| // Write Inquiry Mode (0x0045) |
| type WriteInquiryMode struct { |
| InquiryMode uint8 |
| } |
| |
| func (c WriteInquiryMode) Opcode() int { return opWriteInquiryMode } |
| func (c WriteInquiryMode) Len() int { return 1 } |
| func (c WriteInquiryMode) Marshal(b []byte) { b[0] = c.InquiryMode } |
| |
| type WriteInquiryModeRP struct{ Status uint8 } |
| |
| // Write Page Scan Type (0x0046) |
| type WritePageScanType struct{ PageScanType uint8 } |
| |
| func (c WritePageScanType) Opcode() int { return opWritePageScanType } |
| func (c WritePageScanType) Len() int { return 1 } |
| func (c WritePageScanType) Marshal(b []byte) { b[0] = c.PageScanType } |
| |
| type WritePageScanTypeRP struct{ Status uint8 } |
| |
| // Write Simple Pairing Mode (0x0056) |
| type WriteSimplePairingMode struct{ SimplePairingMode uint8 } |
| |
| func (c WriteSimplePairingMode) Opcode() int { return opWriteSimplePairingMode } |
| func (c WriteSimplePairingMode) Len() int { return 1 } |
| func (c WriteSimplePairingMode) Marshal(b []byte) { b[0] = c.SimplePairingMode } |
| |
| type WriteSimplePairingModeRP struct{} |
| |
| // Set Event Mask Page 2 (0x0063) |
| type SetEventMaskPage2 struct{ EventMaskPage2 uint64 } |
| |
| func (c SetEventMaskPage2) Opcode() int { return opSetEventMaskPage2 } |
| func (c SetEventMaskPage2) Len() int { return 8 } |
| func (c SetEventMaskPage2) Marshal(b []byte) { o.PutUint64(b, c.EventMaskPage2) } |
| |
| type SetEventMaskPage2RP struct{ Status uint8 } |
| |
| // Write LE Host Supported (0x006D) |
| type WriteLEHostSupported struct { |
| LESupportedHost uint8 |
| SimultaneousLEHost uint8 |
| } |
| |
| func (c WriteLEHostSupported) Opcode() int { return opWriteLEHostSupported } |
| func (c WriteLEHostSupported) Len() int { return 2 } |
| func (c WriteLEHostSupported) Marshal(b []byte) { b[0], b[1] = c.LESupportedHost, c.SimultaneousLEHost } |
| |
| type WriteLeHostSupportedRP struct{ Status uint8 } |
| |
| // LE Controller Commands |
| |
| // LE Set Event Mask (0x0001) |
| type LESetEventMask struct{ LEEventMask uint64 } |
| |
| func (c LESetEventMask) Opcode() int { return opLESetEventMask } |
| func (c LESetEventMask) Len() int { return 8 } |
| func (c LESetEventMask) Marshal(b []byte) { o.PutUint64(b, c.LEEventMask) } |
| |
| type LESetEventMaskRP struct{ Status uint8 } |
| |
| // LE Read Buffer Size (0x0002) |
| type LEReadBufferSize struct{} |
| |
| func (c LEReadBufferSize) Opcode() int { return opLEReadBufferSize } |
| func (c LEReadBufferSize) Len() int { return 1 } |
| func (c LEReadBufferSize) Marshal(b []byte) {} |
| |
| type LEReadBufferSizeRP struct { |
| Status uint8 |
| HCLEACLDataPacketLength uint16 |
| HCTotalNumLEACLDataPackets uint8 |
| } |
| |
| // LE Read Local Supported Features (0x0003) |
| type LEReadLocalSupportedFeatures struct{} |
| |
| func (c LEReadLocalSupportedFeatures) Opcode() int { return opLEReadLocalSupportedFeatures } |
| func (c LEReadLocalSupportedFeatures) Len() int { return 0 } |
| func (c LEReadLocalSupportedFeatures) Marshal(b []byte) {} |
| |
| type LEReadLocalSupportedFeaturesRP struct { |
| Status uint8 |
| LEFeatures uint64 |
| } |
| |
| // LE Set Random Address (0x0005) |
| type LESetRandomAddress struct{ RandomAddress [6]byte } |
| |
| func (c LESetRandomAddress) Opcode() int { return opLESetRandomAddress } |
| func (c LESetRandomAddress) Len() int { return 6 } |
| func (c LESetRandomAddress) Marshal(b []byte) { o.PutMAC(b, c.RandomAddress) } |
| |
| type LESetRandomAddressRP struct{ Status uint8 } |
| |
| // LE Set Advertising Parameters (0x0006) |
| type LESetAdvertisingParameters struct { |
| AdvertisingIntervalMin uint16 |
| AdvertisingIntervalMax uint16 |
| AdvertisingType uint8 |
| OwnAddressType uint8 |
| DirectAddressType uint8 |
| DirectAddress [6]byte |
| AdvertisingChannelMap uint8 |
| AdvertisingFilterPolicy uint8 |
| } |
| |
| func (c LESetAdvertisingParameters) Opcode() int { return opLESetAdvertisingParameters } |
| func (c LESetAdvertisingParameters) Len() int { return 15 } |
| func (c LESetAdvertisingParameters) Marshal(b []byte) { |
| o.PutUint16(b[0:], c.AdvertisingIntervalMin) |
| o.PutUint16(b[2:], c.AdvertisingIntervalMax) |
| o.PutUint8(b[4:], c.AdvertisingType) |
| o.PutUint8(b[5:], c.OwnAddressType) |
| o.PutUint8(b[6:], c.DirectAddressType) |
| o.PutMAC(b[7:], c.DirectAddress) |
| o.PutUint8(b[13:], c.AdvertisingChannelMap) |
| o.PutUint8(b[14:], c.AdvertisingFilterPolicy) |
| } |
| |
| type LESetAdvertisingParametersRP struct{ Status uint8 } |
| |
| // LE Read Advertising Channel Tx Power (0x0007) |
| type LEReadAdvertisingChannelTxPower struct{} |
| |
| func (c LEReadAdvertisingChannelTxPower) Opcode() int { return opLEReadAdvertisingChannelTxPower } |
| func (c LEReadAdvertisingChannelTxPower) Len() int { return 0 } |
| func (c LEReadAdvertisingChannelTxPower) Marshal(b []byte) {} |
| |
| type LEReadAdvertisingChannelTxPowerRP struct { |
| Status uint8 |
| TransmitPowerLevel uint8 |
| } |
| |
| // LE Set Advertising Data (0x0008) |
| type LESetAdvertisingData struct { |
| AdvertisingDataLength uint8 |
| AdvertisingData [31]byte |
| } |
| |
| func (c LESetAdvertisingData) Opcode() int { return opLESetAdvertisingData } |
| func (c LESetAdvertisingData) Len() int { return 32 } |
| func (c LESetAdvertisingData) Marshal(b []byte) { |
| b[0] = c.AdvertisingDataLength |
| copy(b[1:], c.AdvertisingData[:c.AdvertisingDataLength]) |
| } |
| |
| type LESetAdvertisingDataRP struct{ Status uint8 } |
| |
| // LE Set Scan Response Data (0x0009) |
| type LESetScanResponseData struct { |
| ScanResponseDataLength uint8 |
| ScanResponseData [31]byte |
| } |
| |
| func (c LESetScanResponseData) Opcode() int { return opLESetScanResponseData } |
| func (c LESetScanResponseData) Len() int { return 32 } |
| func (c LESetScanResponseData) Marshal(b []byte) { |
| b[0] = c.ScanResponseDataLength |
| copy(b[1:], c.ScanResponseData[:c.ScanResponseDataLength]) |
| } |
| |
| type LESetScanResponseDataRP struct{ Status uint8 } |
| |
| // LE Set Advertising Enable (0x000A) |
| type LESetAdvertiseEnable struct{ AdvertisingEnable uint8 } |
| |
| func (c LESetAdvertiseEnable) Opcode() int { return opLESetAdvertiseEnable } |
| func (c LESetAdvertiseEnable) Len() int { return 1 } |
| func (c LESetAdvertiseEnable) Marshal(b []byte) { b[0] = c.AdvertisingEnable } |
| |
| type LESetAdvertiseEnableRP struct{ Status uint8 } |
| |
| // LE Set Scan Parameters (0x000B) |
| type LESetScanParameters struct { |
| LEScanType uint8 |
| LEScanInterval uint16 |
| LEScanWindow uint16 |
| OwnAddressType uint8 |
| ScanningFilterPolicy uint8 |
| } |
| |
| func (c LESetScanParameters) Opcode() int { return opLESetScanParameters } |
| func (c LESetScanParameters) Len() int { return 7 } |
| func (c LESetScanParameters) Marshal(b []byte) { |
| o.PutUint8(b[0:], c.LEScanType) |
| o.PutUint16(b[1:], c.LEScanInterval) |
| o.PutUint16(b[3:], c.LEScanWindow) |
| o.PutUint8(b[5:], c.OwnAddressType) |
| o.PutUint8(b[6:], c.ScanningFilterPolicy) |
| } |
| |
| type LESetScanParametersRP struct{ Status uint8 } |
| |
| // LE Set Scan Enable (0x000C) |
| type LESetScanEnable struct { |
| LEScanEnable uint8 |
| FilterDuplicates uint8 |
| } |
| |
| func (c LESetScanEnable) Opcode() int { return opLESetScanEnable } |
| func (c LESetScanEnable) Len() int { return 2 } |
| func (c LESetScanEnable) Marshal(b []byte) { b[0], b[1] = c.LEScanEnable, c.FilterDuplicates } |
| |
| type LESetScanEnableRP struct{ Status uint8 } |
| |
| // LE Create Connection (0x000D) |
| type LECreateConn struct { |
| LEScanInterval uint16 |
| LEScanWindow uint16 |
| InitiatorFilterPolicy uint8 |
| PeerAddressType uint8 |
| PeerAddress [6]byte |
| OwnAddressType uint8 |
| ConnIntervalMin uint16 |
| ConnIntervalMax uint16 |
| ConnLatency uint16 |
| SupervisionTimeout uint16 |
| MinimumCELength uint16 |
| MaximumCELength uint16 |
| } |
| |
| func (c LECreateConn) Opcode() int { return opLECreateConn } |
| func (c LECreateConn) Len() int { return 25 } |
| func (c LECreateConn) Marshal(b []byte) { |
| o.PutUint16(b[0:], c.LEScanInterval) |
| o.PutUint16(b[2:], c.LEScanWindow) |
| o.PutUint8(b[4:], c.InitiatorFilterPolicy) |
| o.PutUint8(b[5:], c.PeerAddressType) |
| o.PutMAC(b[6:], c.PeerAddress) |
| o.PutUint8(b[12:], c.OwnAddressType) |
| o.PutUint16(b[13:], c.ConnIntervalMin) |
| o.PutUint16(b[15:], c.ConnIntervalMax) |
| o.PutUint16(b[17:], c.ConnLatency) |
| o.PutUint16(b[19:], c.SupervisionTimeout) |
| o.PutUint16(b[21:], c.MinimumCELength) |
| o.PutUint16(b[23:], c.MaximumCELength) |
| } |
| |
| type LECreateConnRP struct{} |
| |
| // LE Create Connection Cancel (0x000E) |
| type LECreateConnCancel struct{} |
| |
| func (c LECreateConnCancel) Opcode() int { return opLECreateConnCancel } |
| func (c LECreateConnCancel) Len() int { return 0 } |
| func (c LECreateConnCancel) Marshal(b []byte) {} |
| |
| type LECreateConnCancelRP struct{ Status uint8 } |
| |
| // LE Read White List Size (0x000F) |
| type LEReadWhiteListSize struct{} |
| |
| func (c LEReadWhiteListSize) Opcode() int { return opLEReadWhiteListSize } |
| func (c LEReadWhiteListSize) Len() int { return 0 } |
| func (c LEReadWhiteListSize) Marshal(b []byte) {} |
| |
| type LEReadWhiteListSizeRP struct { |
| Status uint8 |
| WhiteListSize uint8 |
| } |
| |
| // LE Clear White List (0x0010) |
| type LEClearWhiteList struct{} |
| |
| func (c LEClearWhiteList) Opcode() int { return opLEClearWhiteList } |
| func (c LEClearWhiteList) Len() int { return 0 } |
| func (c LEClearWhiteList) Marshal(b []byte) {} |
| |
| type LEClearWhiteListRP struct{ Status uint8 } |
| |
| // LE Add Device To White List (0x0011) |
| type LEAddDeviceToWhiteList struct { |
| AddressType uint8 |
| Address [6]byte |
| } |
| |
| func (c LEAddDeviceToWhiteList) Opcode() int { return opLEAddDeviceToWhiteList } |
| func (c LEAddDeviceToWhiteList) Len() int { return 7 } |
| func (c LEAddDeviceToWhiteList) Marshal(b []byte) { |
| b[0] = c.AddressType |
| o.PutMAC(b[1:], c.Address) |
| } |
| |
| type LEAddDeviceToWhiteListRP struct{ Status uint8 } |
| |
| // LE Remove Device From White List (0x0012) |
| type LERemoveDeviceFromWhiteList struct { |
| AddressType uint8 |
| Address [6]byte |
| } |
| |
| func (c LERemoveDeviceFromWhiteList) Opcode() int { return opLERemoveDeviceFromWhiteList } |
| func (c LERemoveDeviceFromWhiteList) Len() int { return 7 } |
| func (c LERemoveDeviceFromWhiteList) Marshal(b []byte) { |
| b[0] = c.AddressType |
| o.PutMAC(b[1:], c.Address) |
| } |
| |
| type LERemoveDeviceFromWhiteListRP struct{ Status uint8 } |
| |
| // LE Connection Update (0x0013) |
| type LEConnUpdate struct { |
| ConnectionHandle uint16 |
| ConnIntervalMin uint16 |
| ConnIntervalMax uint16 |
| ConnLatency uint16 |
| SupervisionTimeout uint16 |
| MinimumCELength uint16 |
| MaximumCELength uint16 |
| } |
| |
| func (c LEConnUpdate) Opcode() int { return opLEConnUpdate } |
| func (c LEConnUpdate) Len() int { return 14 } |
| func (c LEConnUpdate) Marshal(b []byte) { |
| o.PutUint16(b[0:], c.ConnectionHandle) |
| o.PutUint16(b[2:], c.ConnIntervalMin) |
| o.PutUint16(b[4:], c.ConnIntervalMax) |
| o.PutUint16(b[6:], c.ConnLatency) |
| o.PutUint16(b[8:], c.SupervisionTimeout) |
| o.PutUint16(b[10:], c.MinimumCELength) |
| o.PutUint16(b[12:], c.MaximumCELength) |
| } |
| |
| type LEConnUpdateRP struct{} |
| |
| // LE Set Host Channel Classification (0x0014) |
| type LESetHostChannelClassification struct{ ChannelMap [5]byte } |
| |
| func (c LESetHostChannelClassification) Opcode() int { return opLESetHostChannelClassification } |
| func (c LESetHostChannelClassification) Len() int { return 5 } |
| func (c LESetHostChannelClassification) Marshal(b []byte) { copy(b, c.ChannelMap[:]) } |
| |
| type LESetHostChannelClassificationRP struct{ Status uint8 } |
| |
| // LE Read Channel Map (0x0015) |
| type LEReadChannelMap struct{ ConnectionHandle uint16 } |
| |
| func (c LEReadChannelMap) Opcode() int { return opLEReadChannelMap } |
| func (c LEReadChannelMap) Len() int { return 2 } |
| func (c LEReadChannelMap) Marshal(b []byte) { o.PutUint16(b, c.ConnectionHandle) } |
| |
| type LEReadChannelMapRP struct { |
| Status uint8 |
| ConnectionHandle uint16 |
| ChannelMap [5]byte |
| } |
| |
| // LE Read Remote Used Features (0x0016) |
| type LEReadRemoteUsedFeatures struct{ ConnectionHandle uint16 } |
| |
| func (c LEReadRemoteUsedFeatures) Opcode() int { return opLEReadRemoteUsedFeatures } |
| func (c LEReadRemoteUsedFeatures) Len() int { return 8 } |
| func (c LEReadRemoteUsedFeatures) Marshal(b []byte) { o.PutUint16(b, c.ConnectionHandle) } |
| |
| type LEReadRemoteUsedFeaturesRP struct{} |
| |
| // LE Encrypt (0x0017) |
| type LEEncrypt struct { |
| Key [16]byte |
| PlaintextData [16]byte |
| } |
| |
| func (c LEEncrypt) Opcode() int { return opLEEncrypt } |
| func (c LEEncrypt) Len() int { return 32 } |
| func (c LEEncrypt) Marshal(b []byte) { |
| copy(b[0:], c.Key[:]) |
| copy(b[16:], c.PlaintextData[:]) |
| } |
| |
| type LEEncryptRP struct { |
| Stauts uint8 |
| EncryptedData [16]byte |
| } |
| |
| // LE Rand (0x0018) |
| type LERand struct{} |
| |
| func (c LERand) Opcode() int { return opLERand } |
| func (c LERand) Len() int { return 0 } |
| func (c LERand) Marshal(b []byte) {} |
| |
| type LERandRP struct { |
| Status uint8 |
| RandomNumber uint64 |
| } |
| |
| // LE Start Encryption (0x0019) |
| type LEStartEncryption struct { |
| ConnectionHandle uint16 |
| RandomNumber uint64 |
| EncryptedDiversifier uint16 |
| LongTermKey [16]byte |
| } |
| |
| func (c LEStartEncryption) Opcode() int { return opLEStartEncryption } |
| func (c LEStartEncryption) Len() int { return 28 } |
| func (c LEStartEncryption) Marshal(b []byte) { |
| o.PutUint16(b[0:], c.ConnectionHandle) |
| o.PutUint64(b[2:], c.RandomNumber) |
| o.PutUint16(b[10:], c.EncryptedDiversifier) |
| copy(b[12:], c.LongTermKey[:]) |
| } |
| |
| type LEStartEncryptionRP struct{} |
| |
| // LE Long Term Key Reply (0x001A) |
| type LELTKReply struct { |
| ConnectionHandle uint16 |
| LongTermKey [16]byte |
| } |
| |
| func (c LELTKReply) Opcode() int { return opLELTKReply } |
| func (c LELTKReply) Len() int { return 18 } |
| func (c LELTKReply) Marshal(b []byte) { |
| o.PutUint16(b[0:], c.ConnectionHandle) |
| copy(b[2:], c.LongTermKey[:]) |
| } |
| |
| type LELTKReplyRP struct { |
| Status uint8 |
| ConnectionHandle uint16 |
| } |
| |
| // LE Long Term Key Negative Reply (0x001B) |
| type LELTKNegReply struct{ ConnectionHandle uint16 } |
| |
| func (c LELTKNegReply) Opcode() int { return opLELTKNegReply } |
| func (c LELTKNegReply) Len() int { return 2 } |
| func (c LELTKNegReply) Marshal(b []byte) { o.PutUint16(b, c.ConnectionHandle) } |
| |
| type LELTKNegReplyRP struct { |
| Status uint8 |
| ConnectionHandle uint16 |
| } |
| |
| // LE Read Supported States (0x001C) |
| type LEReadSupportedStates struct{} |
| |
| func (c LEReadSupportedStates) Opcode() int { return opLEReadSupportedStates } |
| func (c LEReadSupportedStates) Len() int { return 0 } |
| func (c LEReadSupportedStates) Marshal(b []byte) {} |
| |
| type LEReadSupportedStatesRP struct { |
| Status uint8 |
| LEStates [8]byte |
| } |
| |
| // LE Reciever Test (0x001D) |
| type LEReceiverTest struct{ RxChannel uint8 } |
| |
| func (c LEReceiverTest) Opcode() int { return opLEReceiverTest } |
| func (c LEReceiverTest) Len() int { return 1 } |
| func (c LEReceiverTest) Marshal(b []byte) { b[0] = c.RxChannel } |
| |
| type LEReceiverTestRP struct{ Status uint8 } |
| |
| // LE Transmitter Test (0x001E) |
| type LETransmitterTest struct { |
| TxChannel uint8 |
| LengthOfTestData uint8 |
| PacketPayload uint8 |
| } |
| |
| func (c LETransmitterTest) Opcode() int { return opLETransmitterTest } |
| func (c LETransmitterTest) Len() int { return 3 } |
| func (c LETransmitterTest) Marshal(b []byte) { |
| b[0], b[1], b[2] = c.TxChannel, c.LengthOfTestData, c.PacketPayload |
| } |
| |
| type LETransmitterTestRP struct{ Status uint8 } |
| |
| // LE Test End (0x001F) |
| type LETestEnd struct{} |
| |
| func (c LETestEnd) Opcode() int { return opLETestEnd } |
| func (c LETestEnd) Len() int { return 0 } |
| func (c LETestEnd) Marshal(b []byte) {} |
| |
| type LETestEndRP struct { |
| Status uint8 |
| NumberOfPackets uint16 |
| } |
| |
| // LE Remote Connection Parameters Reply (0x0020) |
| type LERemoteConnectionParameterReply struct { |
| ConnectionHandle uint16 |
| IntervalMin uint16 |
| IntervalMax uint16 |
| Latency uint16 |
| Timeout uint16 |
| MinimumCELength uint16 |
| MaximumCELength uint16 |
| } |
| |
| func (c LERemoteConnectionParameterReply) Opcode() int { return opLERemoteConnectionParameterReply } |
| func (c LERemoteConnectionParameterReply) Len() int { return 14 } |
| func (c LERemoteConnectionParameterReply) Marshal(b []byte) { |
| o.PutUint16(b[0:], c.ConnectionHandle) |
| o.PutUint16(b[2:], c.IntervalMin) |
| o.PutUint16(b[4:], c.IntervalMax) |
| o.PutUint16(b[6:], c.Latency) |
| o.PutUint16(b[8:], c.Timeout) |
| o.PutUint16(b[10:], c.MinimumCELength) |
| o.PutUint16(b[12:], c.MaximumCELength) |
| } |
| |
| type LERemoteConnectionParameterReplyRP struct { |
| Status uint8 |
| ConnectionHandle uint16 |
| } |
| |
| // LE Remote Connection Parameters Negative Reply (0x0021) |
| type LERemoteConnectionParameterNegReply struct { |
| ConnectionHandle uint16 |
| Reason uint8 |
| } |
| |
| func (c LERemoteConnectionParameterNegReply) Opcode() int { |
| return opLERemoteConnectionParameterNegReply |
| } |
| func (c LERemoteConnectionParameterNegReply) Len() int { return 3 } |
| func (c LERemoteConnectionParameterNegReply) Marshal(b []byte) { |
| o.PutUint16(b[0:], c.ConnectionHandle) |
| b[2] = c.Reason |
| } |
| |
| type LERemoteConnectionParameterNegReplyRP struct { |
| Status uint8 |
| ConnectionHandle uint16 |
| } |