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
Revision 12:57f7679dd651, committed 2011-06-19
- Comitter:
- networker
- Date:
- Sun Jun 19 19:32:51 2011 +0000
- Parent:
- 11:e6245f64412d
- Child:
- 13:327622e38551
- Commit message:
- fixed default mtu, small impovement in config processing
Changed in this revision
| L2CAP.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- 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 {