diff options
author | Joey Grover <joeygrover@gmail.com> | 2017-07-28 15:18:31 -0400 |
---|---|---|
committer | Austin Kirk <askirk@umich.edu> | 2017-08-03 10:24:38 -0400 |
commit | 3c6f9b0966a9f56f7df9aeb388ac45ff42325791 (patch) | |
tree | c0ce1bfbe0d337143ffaa08564f4d096203679e0 | |
parent | e0d6380804f9001f806c4e2178e8c9c2cfca1295 (diff) | |
download | sdl_android-3c6f9b0966a9f56f7df9aeb388ac45ff42325791.tar.gz |
Optimize MTU in protocol
-rw-r--r-- | sdl_android/src/androidTest/java/com/smartdevicelink/protocol/WiProProtocolTests.java | 27 | ||||
-rw-r--r-- | sdl_android/src/main/java/com/smartdevicelink/protocol/WiProProtocol.java | 43 |
2 files changed, 34 insertions, 36 deletions
diff --git a/sdl_android/src/androidTest/java/com/smartdevicelink/protocol/WiProProtocolTests.java b/sdl_android/src/androidTest/java/com/smartdevicelink/protocol/WiProProtocolTests.java index 82e9af450..f8cae95f4 100644 --- a/sdl_android/src/androidTest/java/com/smartdevicelink/protocol/WiProProtocolTests.java +++ b/sdl_android/src/androidTest/java/com/smartdevicelink/protocol/WiProProtocolTests.java @@ -15,7 +15,6 @@ import com.smartdevicelink.transport.RouterServiceValidator; import junit.framework.Assert; import java.io.ByteArrayOutputStream; -import java.lang.reflect.Field; import java.lang.reflect.Method; /** @@ -141,31 +140,27 @@ public class WiProProtocolTests extends AndroidTestCase { wiProProtocol.setVersion((byte)0x01); try{ - Field field = wiProProtocol.getClass().getDeclaredField("MAX_DATA_SIZE"); - field.setAccessible(true); - int mtu = (Integer) field.get(wiProProtocol); - assertEquals(mtu, 1500-8); - //Ok our reflection works we can test the rest of the cases - + assertEquals(wiProProtocol.getMtu(), 1500-8); + //Version 2 wiProProtocol.setVersion((byte)0x02); - mtu = (Integer) field.get(wiProProtocol); - assertEquals(mtu, 1500-12); + assertEquals(wiProProtocol.getMtu(), 1500-12); //Version 3 wiProProtocol.setVersion((byte)0x03); - mtu = (Integer) field.get(wiProProtocol); - assertEquals(mtu, 131072); + assertEquals(wiProProtocol.getMtu(), 131072); //Version 4 wiProProtocol.setVersion((byte)0x04); - mtu = (Integer) field.get(wiProProtocol); - assertEquals(mtu, 131072); + assertEquals(wiProProtocol.getMtu(), 131072); - //Version 4+ + //Version 5 wiProProtocol.setVersion((byte)0x05); - mtu = (Integer) field.get(wiProProtocol); - assertEquals(mtu, 1500-12); + assertEquals(wiProProtocol.getMtu(), 131072); + + //Version 5+ + wiProProtocol.setVersion((byte)0x06); + assertEquals(wiProProtocol.getMtu(), 131072); }catch(Exception e){ Assert.fail("Exceptin during reflection"); diff --git a/sdl_android/src/main/java/com/smartdevicelink/protocol/WiProProtocol.java b/sdl_android/src/main/java/com/smartdevicelink/protocol/WiProProtocol.java index 20330eb21..b510067b8 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/protocol/WiProProtocol.java +++ b/sdl_android/src/main/java/com/smartdevicelink/protocol/WiProProtocol.java @@ -17,7 +17,6 @@ import com.smartdevicelink.util.BitConverter; import com.smartdevicelink.util.DebugTool;
import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
@@ -32,8 +31,6 @@ public class WiProProtocol extends AbstractProtocol { public static final int V1_HEADER_SIZE = 8;
public static final int V2_HEADER_SIZE = 12;
private static int HEADER_SIZE = 8;
- private static int MAX_DATA_SIZE = V1_V2_MTU_SIZE - HEADER_SIZE;
- private static long DYNAMIC_MTU_SIZE = MAX_DATA_SIZE;
private static int TLS_MAX_RECORD_SIZE = 16384;
int hashID = 0;
@@ -70,7 +67,7 @@ public class WiProProtocol extends AbstractProtocol { * @return the max transfer unit
*/
public int getMtu(){
- return mtus.get(SessionType.RPC).intValue();//'MAX_DATA_SIZE;
+ return mtus.get(SessionType.RPC).intValue();
}
public long getMtu(SessionType type){
@@ -84,32 +81,36 @@ public class WiProProtocol extends AbstractProtocol { public byte getVersion() {
return this._version;
}
-
+
+ /**
+ * This method will set the major protocol version that we should use. It will also set the default MTU based on version.
+ * @param version
+ */
public void setVersion(byte version) {
if (version > 5) {
this._version = 5; //protect for future, proxy only supports v5 or lower
HEADER_SIZE = 12;
- MAX_DATA_SIZE = V1_V2_MTU_SIZE - HEADER_SIZE; //default to lowest size since capabilities of this version are unknown
+ mtus.put(SessionType.RPC,new Long(V3_V4_MTU_SIZE) );
} else if (version == 5) {
this._version = version;
HEADER_SIZE = 12;
- MAX_DATA_SIZE = getMtu(); //versions 5 supports 128k MTU
+ mtus.put(SessionType.RPC,new Long(V3_V4_MTU_SIZE) );
}else if (version == 4) {
this._version = version;
HEADER_SIZE = 12;
- MAX_DATA_SIZE = V3_V4_MTU_SIZE; //versions 4 supports 128k MTU
+ mtus.put(SessionType.RPC,new Long(V3_V4_MTU_SIZE) ); //versions 4 supports 128k MTU
} else if (version == 3) {
this._version = version;
HEADER_SIZE = 12;
- MAX_DATA_SIZE = V3_V4_MTU_SIZE; //versions 3 supports 128k MTU
+ mtus.put(SessionType.RPC,new Long(V3_V4_MTU_SIZE) ); //versions 3 supports 128k MTU
} else if (version == 2) {
this._version = version;
HEADER_SIZE = 12;
- MAX_DATA_SIZE = V1_V2_MTU_SIZE - HEADER_SIZE;
+ mtus.put(SessionType.RPC,new Long(V1_V2_MTU_SIZE - HEADER_SIZE) );
} else if (version == 1){
this._version = version;
HEADER_SIZE = 8;
- MAX_DATA_SIZE = V1_V2_MTU_SIZE - HEADER_SIZE;
+ mtus.put(SessionType.RPC,new Long(V1_V2_MTU_SIZE - HEADER_SIZE) );
}
}
@@ -203,13 +204,14 @@ public class WiProProtocol extends AbstractProtocol { }
synchronized(messageLock) {
- if (data.length > MAX_DATA_SIZE) {
-
+ if (data.length > getMtu(sessionType)) {
+
messageID++;
// Assemble first frame.
- int frameCount = data.length / MAX_DATA_SIZE;
- if (data.length % MAX_DATA_SIZE > 0) {
+ Long mtu = getMtu(sessionType);
+ int frameCount = new Long(data.length / mtu).intValue();
+ if (data.length % mtu > 0) {
frameCount++;
}
//byte[] firstFrameData = new byte[HEADER_SIZE];
@@ -241,8 +243,8 @@ public class WiProProtocol extends AbstractProtocol { } // end-if
int bytesToWrite = data.length - currentOffset;
- if (bytesToWrite > MAX_DATA_SIZE) {
- bytesToWrite = MAX_DATA_SIZE;
+ if (bytesToWrite > mtu) {
+ bytesToWrite = mtu.intValue();
}
SdlPacket consecHeader = SdlPacketFactory.createMultiSendDataRest(sessionType, sessionID, bytesToWrite, frameSequenceNumber , messageID, _version,data, currentOffset, bytesToWrite, protocolMsg.getPayloadProtected());
consecHeader.setPriorityCoefficient(i+2+protocolMsg.priorityCoefficient);
@@ -432,9 +434,12 @@ public class WiProProtocol extends AbstractProtocol { _messageLocks.put((byte)packet.getSessionId(), messageLock);
}
if(packet.version >= 5){
+ Object mtu = packet.getTag(BsonTags.MTU);
+ if(mtu!=null){
+ mtus.put(serviceType,(Long) packet.getTag(BsonTags.MTU));
+ }
if(serviceType.equals(SessionType.RPC)){
hashID = (Integer) packet.getTag(BsonTags.HASH_ID);
- mtus.put(SessionType.RPC,(Long) packet.getTag(BsonTags.MTU));
MAX_PROTOCOL_VERSION = (String) packet.getTag(BsonTags.PROTOCOL_VERSION);
Log.i(serviceType.getName(), "Receiving hashID: "+hashID);
@@ -442,13 +447,11 @@ public class WiProProtocol extends AbstractProtocol { Log.i(serviceType.getName(), "Receiving MAX_PROTOCOL_VERSION: "+MAX_PROTOCOL_VERSION);
}else if(serviceType.equals(SessionType.PCM)){
hashID = (Integer) packet.getTag(BsonTags.HASH_ID);
- mtus.put(SessionType.PCM,(Long) packet.getTag(BsonTags.MTU));
Log.i(serviceType.getName(), "Receiving hashID: "+hashID);
Log.i(serviceType.getName(), "Receiving mtu: "+packet.getTag(BsonTags.MTU));
}else if(serviceType.equals(SessionType.NAV)){
hashID = (Integer) packet.getTag(BsonTags.HASH_ID);
- mtus.put(SessionType.NAV,(Long) packet.getTag(BsonTags.MTU));
Log.i(serviceType.getName(), "Receiving hashID: "+hashID);
Log.i(serviceType.getName(), "Receiving mtu: "+packet.getTag(BsonTags.MTU));
|