Test version of BlueUSB stack. Includes SDP and RFCOMM. As Client it allows to connect to my fischertechnik TX Controller. As Server it echo\\\\\\\'s characters to Putty. PIN=1234
Dependencies: mbed myUSBHost AvailableMemory
Dependents: mbed_TANK_Kinect myBlueUSB_ros ftusbClass
Diff: L2CAP.cpp
- Revision:
- 12:57f7679dd651
- Parent:
- 10:1928a3d02e32
--- a/L2CAP.cpp Sun Jun 19 15:05:39 2011 +0000 +++ b/L2CAP.cpp Sun Jun 19 19:32:51 2011 +0000 @@ -235,15 +235,15 @@ p[1] = data0; p[2] = data1; int parlen = 2; - switch(reason){ - case 0: //command not understood - break; - case 1: //MTU exceeded - parlen = 4; //return actual mtu in data - break; - case 2: //invalid CID - parlen = 6; //return local, remote cid - break; + switch (reason) { + case 0: //command not understood + break; + case 1: //MTU exceeded + parlen = 4; //return actual mtu in data + break; + case 2: //invalid CID + parlen = 6; //return local, remote cid + break; } return Send(L2CAP_COMMAND_REJ,TXID,p,parlen); } @@ -282,9 +282,9 @@ rfcomm_manager.SerServer(socket, state, data, len, userData); } } else if (state==SocketState_L2CAP_WaitDisconnect) { - printf("Calling RFCOMMManager::SerServer\n"); - rfcomm_manager.SerServer(socket, state, data, len, userData); - } + printf("Calling RFCOMMManager::SerServer\n"); + rfcomm_manager.SerServer(socket, state, data, len, userData); + } } //code8, tid8, lengthData16 @@ -313,7 +313,7 @@ p[1] = scid; p[3] = 0; //no further information printf(" scid=%d, psm=%d\n", scid, psm); - peer_mtu = 48; //minimum allowed mtu + peer_mtu = 672; //default mtu int s = 0; switch (psm) { case L2CAP_PSM_SDP: @@ -420,6 +420,7 @@ int len = LE16(data+2); int scid = LE16(data+4);//flags (data[6] LSB is continuation flag, data[10],[11] are the MTU int flags = LE16(data+6); + const u8* conf = data+8; if (flags) printf("Warning! Continuation flag in L2CAP configuration not supported\n"); L2CAPSocket* s = SCIDToSocket(scid); @@ -432,37 +433,62 @@ printf("Connection should be rejected\n"); break; } +#if 0 if (len > 4) switch (data[8]) { case 1: peer_mtu = LE16(data+10); printf("Peer L2CAP MTU = %d bytes\n", peer_mtu); break; + case 2: //flush timeout + case 3: //QOS + case 4: //retrans and FC option default: printf("Unsupported configuration option %d, value = %#X\n", data[8], LE16(data+10)); break; } else - printf("Empty config req. peer_mtu = %d\n", peer_mtu); - if (1 /* options acceptable */) { - printf("Sending ConfigureResponse, old state=%d ", s->si.State); - ConfigureResponse(data[1],s->dcid);//data[1]==txid, success - switch (s->si.State) { - case SocketState_L2CAP_Config_wait: - s->si.State = SocketState_L2CAP_Config_wait_send; - ConfigureRequest(s->dcid); - s->si.State = SocketState_L2CAP_Config_wait_rsp; + printf("Empty config req. peer_mtu = %d\n", peer_mtu); +#else + while (conf < data+len+4) { + bool hint = conf[0] & 0x80; + switch (conf[0] & 0x7F) { + case 1: + peer_mtu = LE16(conf+2); + printf("Peer L2CAP MTU = %d bytes\n", peer_mtu); break; - case SocketState_L2CAP_Config_wait_req: - ((SocketInternal*)s)->SetState(SocketState_Open); - break; - case SocketState_L2CAP_Config_wait_rsp: - break; - case SocketState_L2CAP_Config_wait_reqrsp: - s->si.State = SocketState_L2CAP_Config_wait_rsp; + case 2: //flush timeout + case 3: //QOS + case 4: //retrans and FC option + default: + printf("Unsupported configuration option %d, value = %#X\n", conf[0], LE16(conf+2)); break; } - printf("new state=%d\n", s->si.State); + conf += conf[1]+2; + } +#endif + if (1 /* options acceptable */) { + if (flags == 0) { + printf("Sending ConfigureResponse, old state=%d ", s->si.State); + ConfigureResponse(data[1],s->dcid);//data[1]==txid, success + switch (s->si.State) { + case SocketState_L2CAP_Config_wait: + s->si.State = SocketState_L2CAP_Config_wait_send; + ConfigureRequest(s->dcid); + s->si.State = SocketState_L2CAP_Config_wait_rsp; + break; + case SocketState_L2CAP_Config_wait_req: + ((SocketInternal*)s)->SetState(SocketState_Open); + break; + case SocketState_L2CAP_Config_wait_rsp: + break; + case SocketState_L2CAP_Config_wait_reqrsp: + s->si.State = SocketState_L2CAP_Config_wait_rsp; + break; + } + printf("new state=%d\n", s->si.State); + } else + printf("L2CAP config continuation, delaying response...\n"); } else { //options not acceptable printf("Configure failure should be indicated\n"); ConfigureResponse(data[1],s->dcid);//indicates success but should indicate fail @@ -473,7 +499,7 @@ int dcid = LE16(data+4); int scid = LE16(data+6); L2CAPSocket* s = SCIDToSocket(dcid); - if (s){ + if (s) { s->si.SetState(SocketState_Closed); DisconnectResponse(data[1], scid, dcid); } else {