- SV publisher: make VLAN tagging optional

pull/179/head
Michael Zillgith 6 years ago
parent 3391f4c139
commit 46d7f6ff2d

@ -85,7 +85,7 @@ struct sSVPublisher {
static bool static bool
preparePacketBuffer(SVPublisher self, CommParameters* parameters, const char* interfaceId) preparePacketBuffer(SVPublisher self, CommParameters* parameters, const char* interfaceId, bool useVlanTags)
{ {
uint8_t defaultDstAddr[] = CONFIG_SV_DEFAULT_DST_ADDRESS; uint8_t defaultDstAddr[] = CONFIG_SV_DEFAULT_DST_ADDRESS;
@ -134,17 +134,19 @@ preparePacketBuffer(SVPublisher self, CommParameters* parameters, const char* in
int bufPos = 12; int bufPos = 12;
/* Priority tag - IEEE 802.1Q */ if (useVlanTags) {
self->buffer[bufPos++] = 0x81; /* Priority tag - IEEE 802.1Q */
self->buffer[bufPos++] = 0x00; self->buffer[bufPos++] = 0x81;
self->buffer[bufPos++] = 0x00;
uint8_t tci1 = priority << 5; uint8_t tci1 = priority << 5;
tci1 += vlanId / 256; tci1 += vlanId / 256;
uint8_t tci2 = vlanId % 256; uint8_t tci2 = vlanId % 256;
self->buffer[bufPos++] = tci1; /* Priority + VLAN-ID */ self->buffer[bufPos++] = tci1; /* Priority + VLAN-ID */
self->buffer[bufPos++] = tci2; /* VLAN-ID */ self->buffer[bufPos++] = tci2; /* VLAN-ID */
}
/* EtherType Sampled Values */ /* EtherType Sampled Values */
self->buffer[bufPos++] = 0x88; self->buffer[bufPos++] = 0x88;
@ -293,14 +295,14 @@ encodeUtcTime(uint64_t timeval, uint8_t* buffer, int bufPos)
} }
SVPublisher SVPublisher
SVPublisher_create(CommParameters* parameters, const char* interfaceId) SVPublisher_createEx(CommParameters* parameters, const char* interfaceId, bool useVlanTag)
{ {
SVPublisher self = (SVPublisher) GLOBAL_CALLOC(1, sizeof(struct sSVPublisher)); SVPublisher self = (SVPublisher) GLOBAL_CALLOC(1, sizeof(struct sSVPublisher));
if (self) { if (self) {
self->asduList = NULL; self->asduList = NULL;
if (preparePacketBuffer(self, parameters, interfaceId) == false) { if (preparePacketBuffer(self, parameters, interfaceId, useVlanTag) == false) {
GLOBAL_FREEMEM(self); GLOBAL_FREEMEM(self);
self = NULL; self = NULL;
} }
@ -310,6 +312,12 @@ SVPublisher_create(CommParameters* parameters, const char* interfaceId)
return self; return self;
} }
SVPublisher
SVPublisher_create(CommParameters* parameters, const char* interfaceId)
{
return SVPublisher_createEx(parameters, interfaceId, true);
}
SVPublisher_ASDU SVPublisher_ASDU
SVPublisher_addASDU(SVPublisher self, const char* svID, const char* datset, uint32_t confRev) SVPublisher_addASDU(SVPublisher self, const char* svID, const char* datset, uint32_t confRev)
{ {

@ -70,6 +70,9 @@ typedef struct sSVPublisher_ASDU* SVPublisher_ASDU;
/** /**
* \brief Create a new IEC61850-9-2 Sampled Values publisher. * \brief Create a new IEC61850-9-2 Sampled Values publisher.
* *
* NOTE: VLAN tagging is enabled when calling this constructor. To disable VLAN tagging
* use \ref SVPublisher_createEx instead.
*
* \param[in] interfaceId the name of the interface over which the SV publisher should send SV packets. * \param[in] interfaceId the name of the interface over which the SV publisher should send SV packets.
* \param[in] parameters optional parameters for setting VLAN options and destination MAC address. Use NULL for default values. * \param[in] parameters optional parameters for setting VLAN options and destination MAC address. Use NULL for default values.
* \return the new SV publisher instance. * \return the new SV publisher instance.
@ -77,6 +80,17 @@ typedef struct sSVPublisher_ASDU* SVPublisher_ASDU;
LIB61850_API SVPublisher LIB61850_API SVPublisher
SVPublisher_create(CommParameters* parameters, const char* interfaceId); SVPublisher_create(CommParameters* parameters, const char* interfaceId);
/**
* \brief Create a new IEC61850-9-2 Sampled Values publisher.
*
* \param[in] interfaceId the name of the interface over which the SV publisher should send SV packets.
* \param[in] parameters optional parameters for setting VLAN options and destination MAC address. Use NULL for default values.
* \param[in] useVlanTags enable(true)/disable(false) VLAN tagging
* \return the new SV publisher instance.
*/
LIB61850_API SVPublisher
SVPublisher_createEx(CommParameters* parameters, const char* interfaceId, bool useVlanTag);
/** /**
* \brief Create an Application Service Data Unit (ASDU) and add it to an existing Sampled Values publisher. * \brief Create an Application Service Data Unit (ASDU) and add it to an existing Sampled Values publisher.
* *

Loading…
Cancel
Save