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

Files at this revision

API Documentation at this revision

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 {