Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
ITS - Intelligent Transport Systems
ITS
Commits
85992be5
Commit
85992be5
authored
Sep 02, 2016
by
garciay
Browse files
Add its_aid port information in GeoNetworkingReq
Add Commsignia support
parent
11296813
Changes
15
Hide whitespace changes
Inline
Side-by-side
javasrc/adapter/org/etsi/its/adapter/SecurityHelper.java
View file @
85992be5
...
...
@@ -353,7 +353,6 @@ public class SecurityHelper {
if
(
(
p_headerfields
[
signerInfoTypeIndex
]
!=
0x24
)
&&
// CAM
(
p_headerfields
[
signerInfoTypeIndex
]
!=
0x25
)
&&
// DENM
// TODO Add MAPEM/SPATEM, IVIM & SREM/SSEM
(
p_headerfields
[
signerInfoTypeIndex
]
!=
p_itsAidOther
)
)
{
if
(
p_enforceSecurityCheck
)
{
...
...
@@ -365,9 +364,23 @@ public class SecurityHelper {
//TERFactory.getInstance().logDebug("SecurityHelper.checkHeaderfields: ItsAid=" + p_headerfields[signerInfoTypeIndex]);
lowerInfo
.
put
(
SecurityHelper
.
SEC_ITS_AID
,
ByteHelper
.
intToByteArray
(
p_headerfields
[
signerInfoTypeIndex
],
Integer
.
SIZE
/
Byte
.
SIZE
));
signerInfoTypeIndex
+=
1
;
}
else
{
// FIXME to be continued
}
else
{
// FIXME To be refined
signerInfoTypeIndex
+=
1
;
if
(
(
p_headerfields
[
signerInfoTypeIndex
]
!=
0x89
)
&&
// SPATEM
(
p_headerfields
[
signerInfoTypeIndex
]
!=
0x8a
)
&&
// MAPEM
(
p_headerfields
[
signerInfoTypeIndex
]
!=
0x8b
)
&&
// IVIM
(
p_headerfields
[
signerInfoTypeIndex
]
!=
0x8c
)
// SREM/SSEM
)
{
if
(
p_enforceSecurityCheck
)
{
// Drop it
//TERFactory.getInstance().logError("SecurityHelper.checkHeaderfields: Drop packet - Unknown ItsAid value");
return
false
;
}
}
//TERFactory.getInstance().logDebug("SecurityHelper.checkHeaderfields: ItsAid=" + p_headerfields[signerInfoTypeIndex]);
lowerInfo
.
put
(
SecurityHelper
.
SEC_ITS_AID
,
ByteHelper
.
intToByteArray
(
p_headerfields
[
signerInfoTypeIndex
],
Integer
.
SIZE
/
Byte
.
SIZE
));
signerInfoTypeIndex
+=
1
;
}
}
}
...
...
javasrc/adapter/org/etsi/its/adapter/layers/CommsigniaLayer.java
0 → 100644
View file @
85992be5
package
org.etsi.its.adapter.layers
;
import
java.lang.reflect.InvocationTargetException
;
import
java.lang.reflect.Method
;
import
java.nio.ByteBuffer
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Stack
;
import
java.util.concurrent.TimeoutException
;
import
org.etsi.adapter.TERFactory
;
import
org.etsi.common.ByteHelper
;
import
org.etsi.its.adapter.IManagementLayers
;
import
com.commsignia.v2x.client.ITSApplication
;
import
com.commsignia.v2x.client.ITSEventAdapter
;
import
com.commsignia.v2x.client.MessageSet
;
import
com.commsignia.v2x.client.exception.ClientException
;
import
com.commsignia.v2x.client.model.BTPType
;
import
com.commsignia.v2x.client.model.GNNotification
;
import
com.commsignia.v2x.client.model.GeonetSendData
;
import
com.commsignia.v2x.client.model.InjectData
;
import
com.commsignia.v2x.client.model.InjectData.Builder
;
import
com.commsignia.v2x.client.model.InjectData.Type
;
import
com.commsignia.v2x.client.model.WsmpNotification
;
import
com.commsignia.v2x.client.model.WsmpSendData
;
import
com.commsignia.v2x.client.model.dev.DeviceId
;
import
com.commsignia.v2x.client.model.dev.DeviceInfoResponse
;
import
com.commsignia.v2x.client.model.dev.FacilityModule
;
import
rx.Observable
;
import
rx.Scheduler
;
import
rx.Scheduler.Worker
;
public
class
CommsigniaLayer
extends
Layer
{
/**
* Well-known Ethernet broadcast address
*/
public
static
byte
[]
MAC_BROADCAST
=
new
byte
[]{(
byte
)
0xFF
,(
byte
)
0xFF
,(
byte
)
0xFF
,(
byte
)
0xFF
,(
byte
)
0xFF
,(
byte
)
0xFF
};
/**
* Parameter name for Link-Layer destination
*/
public
static
final
String
LINK_LAYER_DESTINATION
=
"LinkLayerDestination"
;
/**
* Constructor
* @param management Layer management instance
* @param lowerStack Lower protocol stack
*/
public
CommsigniaLayer
(
IManagementLayers
management
,
Stack
<
String
>
lowerStack
)
{
super
(
management
,
lowerStack
);
int
its_aid
=
5
;
String
targetHost
=
"172.17.15.38"
;
int
targetPort
=
7942
;
MessageSet
defaultMessageSet
=
MessageSet
.
C
;
itsApplication
=
new
ITSApplication
(
its_aid
,
targetHost
,
targetPort
,
defaultMessageSet
);
try
{
itsApplication
.
connect
(
1000
);
itsApplication
.
registerBlocking
();
DeviceInfoResponse
deviceInfoResponse
=
itsApplication
.
requestDeviceInfoBlocking
();
System
.
out
.
println
(
deviceInfoResponse
);
itsApplication
.
setFacilityModuleStatus
(
FacilityModule
.
BSM
,
false
);
itsApplication
.
setFacilityModuleStatus
(
FacilityModule
.
CAM
,
false
);
itsApplication
.
addEventListener
(
new
ITSEventAdapter
()
{
@Override
public
void
onGnNotification
(
GNNotification
notification
)
{
ByteBuffer
buffer
=
ByteBuffer
.
wrap
(
notification
.
getData
());
System
.
out
.
printf
(
"GN GBC receive. GN address: %s Sequence number: %d RSSI: %d dBm\n"
,
notification
.
getGNAddress
(),
buffer
.
getInt
(),
notification
.
getRssi
()
);
}
});
itsApplication
.
gnBindBlocking
(
BTPType
.
NONE
,
65535
);
}
catch
(
TimeoutException
e
)
{
e
.
printStackTrace
();
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
catch
(
ClientException
e
)
{
e
.
printStackTrace
();
}
}
/* (non-Javadoc)
* @see org.etsi.its.adapter.layers.Layer#register(org.etsi.its.adapter.layers.Layer)
*/
@Override
public
void
register
(
Layer
upperLayer
)
{
if
(
registeredUpperLayer
==
null
)
{
super
.
register
(
upperLayer
);
try
{
Method
getEthernetType
=
registeredUpperLayer
.
getClass
().
getMethod
(
"getEthernetType"
,
(
Class
<?>[])
null
);
if
(
getEthernetType
!=
null
)
{
upperLayerFrameType
=
(
Short
)
getEthernetType
.
invoke
(
registeredUpperLayer
,
(
Object
[])
null
);
}
}
catch
(
SecurityException
e
)
{
e
.
printStackTrace
();
}
catch
(
NoSuchMethodException
e
)
{
e
.
printStackTrace
();
}
catch
(
IllegalArgumentException
e
)
{
e
.
printStackTrace
();
}
catch
(
IllegalAccessException
e
)
{
e
.
printStackTrace
();
}
catch
(
InvocationTargetException
e
)
{
e
.
printStackTrace
();
}
localMacAddress
=
management
.
getLinkLayerAddress
();
}
}
/* (non-Javadoc)
* @see org.etsi.its.adapter.layers.Layer#send(byte[], java.util.Map)
*/
@Override
public
boolean
send
(
byte
[]
message
,
Map
<
String
,
Object
>
params
)
{
TERFactory
.
getInstance
().
logDebug
(
">>> CommsigniaLayer.send: "
+
ByteHelper
.
byteArrayToString
(
message
));
byte
[]
dst
=
(
byte
[])
params
.
get
(
LINK_LAYER_DESTINATION
);
if
(
dst
==
null
)
{
dst
=
MAC_BROADCAST
;
}
byte
[]
packet
=
ByteHelper
.
concat
(
dst
,
localMacAddress
,
ByteHelper
.
intToByteArray
(
upperLayerFrameType
,
2
),
message
);
try
{
String
dstAddress
=
String
.
format
(
"%02x:%02x:%02x:%02x:%02x:%02x"
,
dst
[
0
],
dst
[
1
],
dst
[
2
],
dst
[
3
],
dst
[
4
],
dst
[
5
]);
String
srcAddress
=
String
.
format
(
"%02x:%02x:%02x:%02x:%02x:%02x"
,
localMacAddress
[
0
],
localMacAddress
[
1
],
localMacAddress
[
2
],
localMacAddress
[
3
],
localMacAddress
[
4
],
localMacAddress
[
5
]);
Builder
build
=
new
InjectData
.
Builder
();
build
.
withDstAddress
(
dstAddress
)
.
withSrcAddress
(
srcAddress
)
.
withType
(
Type
.
GNP
)
.
withInterfaceID
(
2
)
.
withData
(
message
);
InjectData
injectData
=
build
.
build
();
TERFactory
.
getInstance
().
logDebug
(
"CommsigniaLayer.send: "
+
ByteHelper
.
byteArrayToString
(
injectData
.
getData
()));
itsApplication
.
sendOnRadioBlocking
(
injectData
);
TERFactory
.
getInstance
().
logDebug
(
"<<< GnLayer.send: "
+
ByteHelper
.
byteArrayToString
(
packet
));
return
super
.
send
(
packet
,
params
);
}
catch
(
ClientException
e
)
{
e
.
printStackTrace
();
}
catch
(
Exception
ex
)
{
ex
.
printStackTrace
();
}
return
false
;
}
/* (non-Javadoc)
* @see org.etsi.its.adapter.layers.Layer#unregister(org.etsi.its.adapter.layers.Layer)
*/
@Override
public
void
unregister
(
Layer
upperLayer
)
{
if
(
itsApplication
!=
null
)
{
try
{
itsApplication
.
gnCloseBlocking
(
BTPType
.
NONE
,
65535
);
itsApplication
.
deregisterBlocking
();
}
catch
(
ClientException
e
)
{
// TODO Auto-generated catch block
e
.
printStackTrace
();
}
itsApplication
.
shutdown
();
itsApplication
=
null
;
}
}
/**
* Local Ethernet address
*/
private
byte
[]
localMacAddress
;
/**
* Upper layer's frame type
*/
private
short
upperLayerFrameType
;
private
ITSApplication
itsApplication
=
null
;
}
javasrc/adapter/org/etsi/its/adapter/layers/EthernetLayer.java
View file @
85992be5
...
...
@@ -20,7 +20,7 @@ import org.etsi.its.adapter.PcapMultiplexer;
* Implementation of Ethernet layer using jpcap (background thread)
*/
public
class
EthernetLayer
extends
Layer
{
/**
* Well-known Ethernet broadcast address
*/
...
...
javasrc/adapter/org/etsi/its/adapter/layers/GnLayer.java
View file @
85992be5
...
...
@@ -296,7 +296,7 @@ public class GnLayer extends Layer implements Runnable, IEthernetSpecific {
if
(!
management
.
isSecuredModeSet
())
{
// Secure mode disabled
toBeSent
=
ByteHelper
.
concat
(
basicHdr
,
commonHdr
,
extHdr
,
message
);
}
else
{
toBeSent
=
createSecuredMessage
(
basicHdr
,
commonHdr
,
extHdr
,
message
);
toBeSent
=
createSecuredMessage
(
basicHdr
,
commonHdr
,
extHdr
,
message
,
params
);
}
//TERFactory.getInstance().logDebug("<<< GnLayer.send: " + ByteHelper.byteArrayToString(toBeSent));
...
...
@@ -645,7 +645,7 @@ public class GnLayer extends Layer implements Runnable, IEthernetSpecific {
return
ByteHelper
.
concat
(
tsb
,
depv
);
}
private
byte
[]
createSecuredMessage
(
final
byte
[]
basicHdr
,
final
byte
[]
commonHdr
,
final
byte
[]
extHdr
,
final
byte
[]
message
)
{
private
byte
[]
createSecuredMessage
(
final
byte
[]
basicHdr
,
final
byte
[]
commonHdr
,
final
byte
[]
extHdr
,
final
byte
[]
message
,
Map
<
String
,
Object
>
params
)
{
//TERFactory.getInstance().logDebug(">>> GnLayer.createSecuredMessage");
// SecuredMessage payload length
...
...
@@ -669,60 +669,73 @@ public class GnLayer extends Layer implements Runnable, IEthernetSpecific {
generationTime
// Time64 value
)
);
if
((
commonHdr
[
0
]
&
0xF0
)
==
0x01
)
{
// Next header = Btp-A
int
its_aid
=
-
1
;
switch
((
int
)
params
.
get
(
BtpLayer
.
BTP_DSTPORT
))
{
case
2001
:
// CAM
its_aid
=
36
;
break
;
case
2002
:
// DENM
its_aid
=
37
;
break
;
case
2003
:
// MAPEM
its_aid
=
137
;
break
;
case
2004
:
// SPATEM
its_aid
=
138
;
break
;
case
2006
:
// IVIM
its_aid
=
140
;
break
;
case
2007
:
// SREM/SSEM
// No break;
case
2008
:
its_aid
=
140
;
break
;
}
// End of 'switch' statement
if
(
its_aid
==
36
)
{
// CAM
headersField
=
ByteHelper
.
concat
(
headersField
,
new
byte
[]
{
(
byte
)
0x05
,
// its-aid
(
byte
)
0x24
// 36 = CAM
(
byte
)
0x05
,
// its-aid
(
byte
)
its_aid
// 36 = CAM
}
);
}
else
if
(
(
commonHdr
[
0
]
&
0xF0
)
==
0x02
)
{
// Next header = Btp-B
}
else
if
(
its_aid
==
37
)
{
// DENM
headersField
=
ByteHelper
.
concat
(
headersField
,
new
byte
[]
{
(
byte
)
0x03
// GenerationLocation
},
management
.
getLatitude
(),
// Latitude
management
.
getLongitude
(),
// Longitude
new
byte
[]
{
(
byte
)
0x00
,
(
byte
)
0x00
},
// Elevation
},
management
.
getLatitude
(),
// Latitude
management
.
getLongitude
(),
// Longitude
new
byte
[]
{
(
byte
)
0x00
,
(
byte
)
0x00
},
// Elevation
new
byte
[]
{
(
byte
)
0x05
,
// its-aid
(
byte
)
0x25
// 37 = DENM
(
byte
)
0x05
,
// its-aid
(
byte
)
its_aid
// 37 = DENM
}
);
}
else
{
// Add Its-Aid for Other profile
int
itsAid
=
management
.
getItsAidOther
();
byte
[]
b
;
if
(
itsAid
<
128
)
{
b
=
new
byte
[]
{
(
byte
)
itsAid
};
}
else
if
(
itsAid
<
Short
.
MAX_VALUE
)
{
b
=
ByteHelper
.
intToByteArray
(
itsAid
,
Short
.
SIZE
/
Byte
.
SIZE
);
b
=
ByteHelper
.
concat
(
SecurityHelper
.
getInstance
().
size2tls
(
b
.
length
),
b
);
if
(
its_aid
<
128
)
{
b
=
new
byte
[]
{
(
byte
)
its_aid
};
}
else
{
b
=
ByteHelper
.
intToByteArray
(
itsAid
,
Integer
.
SIZE
/
Integer
.
SIZE
);
b
=
ByteHelper
.
concat
(
SecurityHelper
.
getInstance
().
size2tls
(
b
.
length
),
b
);
b
=
SecurityHelper
.
getInstance
().
size2tls
(
its_aid
);
}
headersField
=
ByteHelper
.
concat
(
headersField
,
new
byte
[]
{
(
byte
)
0x03
// GenerationLocation
},
management
.
getLatitude
(),
// Latitude
management
.
getLongitude
(),
// Longitude
new
byte
[]
{
(
byte
)
0x00
,
(
byte
)
0x00
},
// Elevation
(
byte
)
0x03
// GenerationLocation
},
management
.
getLatitude
(),
// Latitude
management
.
getLongitude
(),
// Longitude
new
byte
[]
{
(
byte
)
0x00
,
(
byte
)
0x00
},
// Elevation
new
byte
[]
{
(
byte
)
0x05
// Its-aid
},
b
b
// Other profile
);
}
byte
[]
payloadLengthTls
=
SecurityHelper
.
getInstance
().
size2tls
(
payloadLength
);
byte
[]
toBeSignedData
=
ByteHelper
.
concat
(
new
byte
[]
{
// SecuredMessage version
(
byte
)
0x02
// version
...
...
@@ -731,8 +744,8 @@ public class GnLayer extends Layer implements Runnable, IEthernetSpecific {
headersField
,
// HeaderFields
new
byte
[]
{
// SecuredMessage Payloads
(
byte
)
0x01
,
// Secured payload type: signed (1)
(
byte
)
payloadLength
,
// Data payload length
},
payloadLengthTls
,
// Data payload length
commonHdr
,
extHdr
,
message
,
// End of SecuredMessage Payloads
...
...
javasrc/adapter/org/etsi/its/adapter/layers/Layer.java
View file @
85992be5
...
...
@@ -24,104 +24,104 @@ public abstract class Layer {
public
static
final
String
RECEPTION_TIMESTAMP
=
"ReceptionTimestamp"
;
/**
* Constructor
* @param management Layer management instance
/**
* Constructor
* @param management Layer management instance
* @param lowerStack Lower protocol stack
*/
public
Layer
(
IManagementLayers
management
,
Stack
<
String
>
lowerStack
)
{
this
.
management
=
management
;
this
.
lowerStack
=
lowerStack
;
this
.
initialized
=
false
;
}
/**
* Initialises lower stack
*/
protected
void
initialize
()
{
if
(!
initialized
&&
lowerStack
!=
null
&&
!
lowerStack
.
isEmpty
())
{
lowerLayerName
=
lowerStack
.
pop
();
lowerLayer
=
LayerFactory
.
getInstance
().
createLayer
(
management
,
lowerLayerName
,
lowerStack
);
lowerLayer
.
register
(
this
);
}
initialized
=
true
;
}
/**
* Transmits a message to registered lower layer after encapsulation
*/
public
Layer
(
IManagementLayers
management
,
Stack
<
String
>
lowerStack
)
{
this
.
management
=
management
;
this
.
lowerStack
=
lowerStack
;
this
.
initialized
=
false
;
}
/**
* Initialises lower stack
*/
protected
void
initialize
()
{
if
(!
initialized
&&
lowerStack
!=
null
&&
!
lowerStack
.
isEmpty
())
{
lowerLayerName
=
lowerStack
.
pop
();
lowerLayer
=
LayerFactory
.
getInstance
().
createLayer
(
management
,
lowerLayerName
,
lowerStack
);
lowerLayer
.
register
(
this
);
}
initialized
=
true
;
}
/**
* Transmits a message to registered lower layer after encapsulation
* @param message Encoded message to be sent
* @param params Layer parameters for sending message
* @return true if send operation is successful, false otherwise
*/
public
boolean
send
(
byte
[]
message
,
Map
<
String
,
Object
>
params
)
{
if
(
lowerLayer
!=
null
)
{
return
lowerLayer
.
send
(
message
,
params
);
}
return
true
;
}
/**
* Callback method invoked by registered lower layer upon message reception from lower stack
* @param message Message received from lower layer
* @param lowerInfo Additional information transmitted by lower layers
* @param receptionTime Message reception time
*/
public
void
receive
(
byte
[]
message
,
Map
<
String
,
Object
>
lowerInfo
)
{
if
(
registeredUpperLayer
!=
null
)
{
registeredUpperLayer
.
receive
(
message
,
lowerInfo
);
}
}
/**
* Registers an upper layer.
* This method will also cause current layer to initialise its lower stack
* Messages received from lower layer will now be transmitted to upper layer, if necessary
* @param upperLayer Instance of the upper layer
*/
public
void
register
(
Layer
upperLayer
)
{
registeredUpperLayer
=
upperLayer
;
initialize
();
}
/**
* Unregisters upper layer.
* This method will also cause current layer to unregister from its lower layer
* @param upperLayer
*/
public
void
unregister
(
Layer
upperLayer
)
{
registeredUpperLayer
=
null
;
if
(
lowerLayer
!=
null
)
{
lowerLayer
.
unregister
(
this
);
}
}
/**
* Name of the lower layer
*/
protected
String
lowerLayerName
;
/**
* Registered upper layer instance
*/
protected
Layer
registeredUpperLayer
=
null
;
/**
* Lower layer instance
*/
protected
Layer
lowerLayer
=
null
;
/**
* Management instance
*/
protected
IManagementLayers
management
=
null
;
/**
* Lower stack
*/
private
Stack
<
String
>
lowerStack
;
/**
* Set to true if lower stack has been initialised (true if layer is operational), false otherwise
*/
private
boolean
initialized
;
* @return true if send operation is successful, false otherwise
*/
public
boolean
send
(
byte
[]
message
,
Map
<
String
,
Object
>
params
)
{
if
(
lowerLayer
!=
null
)
{
return
lowerLayer
.
send
(
message
,
params
);
}
return
true
;
}
/**
* Callback method invoked by registered lower layer upon message reception from lower stack
* @param message Message received from lower layer
* @param lowerInfo Additional information transmitted by lower layers
* @param receptionTime Message reception time
*/
public
void
receive
(
byte
[]
message
,
Map
<
String
,
Object
>
lowerInfo
)
{
if
(
registeredUpperLayer
!=
null
)
{
registeredUpperLayer
.
receive
(
message
,
lowerInfo
);
}
}
/**
* Registers an upper layer.
* This method will also cause current layer to initialise its lower stack
* Messages received from lower layer will now be transmitted to upper layer, if necessary
* @param upperLayer Instance of the upper layer
*/
public
void
register
(
Layer
upperLayer
)
{
registeredUpperLayer
=
upperLayer
;
initialize
();
}
/**
* Unregisters upper layer.
* This method will also cause current layer to unregister from its lower layer
* @param upperLayer
*/
public
void
unregister
(
Layer
upperLayer
)
{
registeredUpperLayer
=
null
;
if
(
lowerLayer
!=
null
)
{
lowerLayer
.
unregister
(
this
);
}
}
/**
* Name of the lower layer
*/
protected
String
lowerLayerName
;
/**
* Registered upper layer instance
*/
protected
Layer
registeredUpperLayer
=
null
;
/**
* Lower layer instance
*/
protected
Layer
lowerLayer
=
null
;
/**
* Management instance
*/
protected
IManagementLayers
management
=
null
;
/**
* Lower stack
*/