2 * $Id: parameter.c,v 0.0.0.1 2003/10/13
4 * DEBUG: section 11 parameter
6 * -------------------------------------------------------------------
8 * Open Real-Time Ethernet
10 * Copyright (C) 2001-2006
11 * Department of Control Engineering FEE CTU Prague, Czech Republic
12 * http://dce.felk.cvut.cz
13 * http://www.ocera.org
15 * Author: Petr Smolik petr@smoliku.cz
17 * Project Responsible: Zdenek Hanzalek
18 * --------------------------------------------------------------------
20 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License as published by
22 * the Free Software Foundation; either version 2 of the License, or
23 * (at your option) any later version.
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
34 /*****************************************************************************/
36 parameterPutString(ParameterSequence *ps, int8_t id, int8_t *sstr)
40 len = strlen((char *)sstr)+1;
42 ps->parameterLength = len;
45 if (MAX_PARAMETER_LOCAL_LENGTH < len) {
46 ps->parameter = (u_char *)MALLOC(len);
47 strncpy((char *)ps->parameter, (const char *)sstr, len);
49 strncpy((char *)ps->parameterLocal.asStr, (const char *)sstr, len);
53 /*****************************************************************************/
55 parameterDelete(CSChange *csChange)
57 ParameterSequence *ps;
59 ul_list_for_each(CSChangeAttributes,
62 if ((ps->parameterLength) > MAX_PARAMETER_LOCAL_LENGTH)
65 //ps is like one piece of memory
66 if (CSChangeAttributes_first(csChange))
67 FREE(CSChangeAttributes_first(csChange));
68 CSChangeAttributes_init_head(csChange);
73 /*****************************************************************************/
75 parameterCodeCodecFromCSChange(CSChange *csChange, CDR_Codec *cdrCodec)
77 ParameterSequence *ps;
79 ul_list_for_each(CSChangeAttributes,
83 if (CDR_put_ushort(cdrCodec, ps->parameterID) == CORBA_FALSE)
85 if (CDR_put_ushort(cdrCodec, ps->parameterLength) == CORBA_FALSE)
88 debug(11, 10) ("parameterCodeCodecToCSChange: parameterID-0x%x, len-%d\n",
89 ps->parameterID, ps->parameterLength);
91 switch (ps->parameterID) {
95 case PID_EXPIRATION_TIME:
97 case PID_MINIMUM_SEPARATION:
99 if (CDR_put_long(cdrCodec, ps->parameterLocal.asNtpTime.seconds) ==
102 /* time in seconds / 2^32 */
103 if (CDR_put_ulong(cdrCodec, ps->parameterLocal.asNtpTime.fraction) ==
107 //CORBA_unsigned_long
108 case PID_TYPE_CHECKSUM:
110 case PID_SEND_QUEUE_SIZE:
111 case PID_RECV_QUEUE_SIZE:
112 case PID_RELIABILITY_OFFERED:
113 case PID_RELIABILITY_REQUESTED:
114 case PID_MANAGER_KEY:
115 case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
116 case PID_APP_IPADDRESS:
117 case PID_USERDATA_MULTICAST_IPADDRESS:
118 case PID_METATRAFFIC_UNICAST_PORT:
119 case PID_USERDATA_UNICAST_PORT:
120 if (CDR_put_ulong(cdrCodec, ps->parameterLocal.asLong) ==
126 if (CDR_put_octet(cdrCodec, ps->parameterLocal.asVendorId.major) ==
129 if (CDR_put_octet(cdrCodec, ps->parameterLocal.asVendorId.minor) ==
134 case PID_PROTOCOL_VERSION:
135 if (CDR_put_octet(cdrCodec, ps->parameterLocal.asProtocolVersion.major) ==
138 if (CDR_put_octet(cdrCodec, ps->parameterLocal.asProtocolVersion.minor) ==
143 case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
144 if (CDR_put_ulong(cdrCodec, ps->parameterLocal.asSequenceNumber.high) ==
147 if (CDR_put_ulong(cdrCodec, ps->parameterLocal.asSequenceNumber.low) ==
152 case PID_EXPECTS_ACK:
153 if (CDR_put_octet(cdrCodec, ps->parameterLocal.asOctet) ==
159 case PID_TYPE_NAME: {
162 wptr = cdrCodec->wptr;
164 len = ps->parameterLength;
165 if (len % 4) { //length alignment to 4
169 len += 4; //data size
170 cdrCodec->wptr -= 2; //new alignments value
171 if (CDR_put_ushort(cdrCodec, (CORBA_unsigned_short)len) == CORBA_FALSE)
174 if (ps->parameterLength > MAX_PARAMETER_LOCAL_LENGTH) {
175 if (CDR_put_string(cdrCodec, (char *)ps->parameter) ==
179 if (CDR_put_string(cdrCodec, (char *)ps->parameterLocal.asStr) ==
184 cdrCodec->wptr = wptr+len;
189 debug(11, 1) ("parameterCodeCodecFromCSChange: undefined parameterID: %d\n",
197 /*****************************************************************************/
199 parameterDecodeCodecToCSChange(CSChange *csChange, CDR_Codec *cdrCodec)
201 ParameterId parameterId;
202 ParameterLength parameterLength;
203 ParameterSequence *ps;
204 uint16_t counter = 0;
207 CSChangeAttributes_init_head(csChange);
208 rptr = cdrCodec->rptr;
210 //count number of parameters -> we need one memory allocation for ps
211 while (cdrCodec->rptr < cdrCodec->buf_len) {
212 if (CDR_get_ushort(cdrCodec, ¶meterId) == CORBA_FALSE)
214 if (CDR_get_ushort(cdrCodec, ¶meterLength) == CORBA_FALSE)
216 if (parameterId == PID_SENTINEL)
219 cdrCodec->rptr += parameterLength;
222 ps = (ParameterSequence *)MALLOC(sizeof(ParameterSequence)*(counter+1));
223 cdrCodec->rptr = rptr;
226 CDR_get_ushort(cdrCodec, ¶meterId);
227 CDR_get_ushort(cdrCodec, ¶meterLength);
229 ps->parameterID = parameterId;
230 ps->parameterLength = parameterLength;
231 ps->parameter = NULL;
233 /* save start position of parameter */
234 rptr = cdrCodec->rptr;
236 debug(11, 10) ("parameterDecodeCodecToCSChange: parameterID-0x%x, len-%d\n",
237 parameterId, parameterLength);
238 switch (parameterId) {
243 case PID_EXPIRATION_TIME:
244 case PID_PERSISTENCE:
245 case PID_MINIMUM_SEPARATION:
246 /* time in seconds */
247 CDR_get_long(cdrCodec, &ps->parameterLocal.asNtpTime.seconds);
248 /* time in seconds / 2^32 */
249 CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&ps->parameterLocal.asNtpTime.fraction);
251 //CORBA_unsigned_long
252 case PID_TYPE_CHECKSUM:
254 case PID_SEND_QUEUE_SIZE:
255 case PID_RECV_QUEUE_SIZE:
256 case PID_RELIABILITY_OFFERED:
257 case PID_RELIABILITY_REQUESTED:
258 case PID_MANAGER_KEY:
259 case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
260 case PID_APP_IPADDRESS:
261 case PID_USERDATA_MULTICAST_IPADDRESS:
262 case PID_METATRAFFIC_UNICAST_PORT:
263 case PID_USERDATA_UNICAST_PORT:
264 CDR_get_ulong(cdrCodec, &ps->parameterLocal.asLong);
268 CDR_get_octet(cdrCodec, (CORBA_octet *)&ps->parameterLocal.asVendorId.major);
269 CDR_get_octet(cdrCodec, (CORBA_octet *)&ps->parameterLocal.asVendorId.minor);
272 case PID_PROTOCOL_VERSION:
273 CDR_get_octet(cdrCodec, (CORBA_octet *)&ps->parameterLocal.asProtocolVersion.major);
274 CDR_get_octet(cdrCodec, (CORBA_octet *)&ps->parameterLocal.asProtocolVersion.minor);
277 case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
278 CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&ps->parameterLocal.asSequenceNumber.high);
279 CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&ps->parameterLocal.asSequenceNumber.low);
282 case PID_EXPECTS_ACK:
283 CDR_get_octet(cdrCodec, ps->parameterLocal.asStr);
287 case PID_TYPE_NAME: {
288 CORBA_unsigned_long len;
290 CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&len);
292 ps->parameterLength = (uint16_t)len;
293 if (ps->parameterLength > MAX_PARAMETER_LOCAL_LENGTH) {
294 CDR_get_string(cdrCodec, (CORBA_char **)&ps->parameter);
296 CDR_get_string_buff(cdrCodec, (CORBA_char *)ps->parameterLocal.asStr);
302 debug(11, 1) ("parameterDecodeCodecToCSChange: undefined parameterID: %d\n",
306 CSChangeAttributes_insert(csChange, ps);
310 cdrCodec->rptr = rptr+parameterLength;
313 ps->parameterID = PID_SENTINEL;
314 ps->parameterLength = 0;
315 ps->parameter = NULL;
316 CSChangeAttributes_insert(csChange, ps);
320 /*****************************************************************************/
322 parameterUpdateCSChange(
323 CSChange *csChange, AppParams *ap, Boolean Manager)
325 ParameterSequence *ps;
328 i = ap->managerKeyCount+
329 ap->metatrafficMulticastIPAddressCount+
330 ap->unicastIPAddressCount+7;
333 CSChangeAttributes_init_head(csChange);
334 ps = (ParameterSequence *)MALLOC(sizeof(ParameterSequence)*i);
336 ps->parameterID = PID_EXPIRATION_TIME;
337 ps->parameterLength = 8;
338 memcpy(ps->parameterLocal.asStr, &ap->expirationTime, ps->parameterLength);
339 ps->parameter = NULL;
340 CSChangeAttributes_insert(csChange, ps);
342 //MATATRAFFIC_MULTICAST_IPADDRESS
343 for (i = 0; i < ap->metatrafficMulticastIPAddressCount; i++) {
344 ps->parameterID = PID_MATATRAFFIC_MULTICAST_IPADDRESS;
345 ps->parameterLength = 4;
346 ps->parameterLocal.asIPAddress = ap->metatrafficMulticastIPAddressList[i];
347 ps->parameter = NULL;
348 CSChangeAttributes_insert(csChange, ps);
351 //METATRAFFIC_UNICAST_PORT
352 ps->parameterID = PID_METATRAFFIC_UNICAST_PORT;
353 ps->parameterLength = 4;
354 ps->parameterLocal.asPort = ap->metatrafficUnicastPort;
355 ps->parameter = NULL;
356 CSChangeAttributes_insert(csChange, ps);
358 //USERDATA_UNICAST_PORT
359 ps->parameterID = PID_USERDATA_UNICAST_PORT;
360 ps->parameterLength = 4;
361 ps->parameterLocal.asPort = ap->userdataUnicastPort;
362 ps->parameter = NULL;
363 CSChangeAttributes_insert(csChange, ps);
366 for (i = 0; i < ap->unicastIPAddressCount; i++) {
367 ps->parameterID = PID_APP_IPADDRESS;
369 ps->parameterLength = 4;
370 ps->parameterLocal.asIPAddress = ap->unicastIPAddressList[i];
371 ps->parameter = NULL;
372 CSChangeAttributes_insert(csChange, ps);
376 ps->parameterID = PID_PROTOCOL_VERSION;
377 ps->parameterLength = 2;
378 ps->parameterLocal.asProtocolVersion = ap->protocolVersion;
379 ps->parameter = NULL;
380 CSChangeAttributes_insert(csChange, ps);
383 ps->parameterID = PID_VENDOR_ID;
384 ps->parameterLength = 2;
385 ps->parameterLocal.asVendorId = ap->vendorId;
386 ps->parameter = NULL;
387 CSChangeAttributes_insert(csChange, ps);
389 if (Manager) { //Manager
390 //VARGAPPS_SEQUENCE_NUMBER_LAST
391 ps->parameterID = PID_VARGAPPS_SEQUENCE_NUMBER_LAST;
392 ps->parameterLength = 8;
393 ps->parameterLocal.asSequenceNumber = ap->vargAppsSequenceNumber;
394 ps->parameter = NULL;
395 CSChangeAttributes_insert(csChange, ps);
399 for (i = 0; i < ap->managerKeyCount; i++) {
400 ps->parameterID = PID_MANAGER_KEY;
401 ps->parameterLength = 4;
402 ps->parameterLocal.asUInt32 = ap->managerKeyList[i];
403 ps->parameter = NULL;
404 CSChangeAttributes_insert(csChange, ps);
408 ps->parameterID = PID_SENTINEL;
409 ps->parameterLength = 0;
410 ps->parameter = NULL;
411 CSChangeAttributes_insert(csChange, ps);
415 /*****************************************************************************/
417 parameterUpdateCSChangeFromPublication(CSChange *csChange, ORTEPublProp *pp)
419 ParameterSequence *ps;
421 CSChangeAttributes_init_head(csChange);
422 ps = (ParameterSequence *)MALLOC(sizeof(ParameterSequence)*8);
424 ps->parameterID = PID_PERSISTENCE;
425 ps->parameterLength = 8;
426 memcpy(ps->parameterLocal.asStr, &pp->persistence, ps->parameterLength);
427 ps->parameter = NULL;
428 CSChangeAttributes_insert(csChange, ps);
430 /* reliabitityOffered */
431 ps->parameterID = PID_RELIABILITY_OFFERED;
432 ps->parameterLength = 4;
433 ps->parameterLocal.asUInt32 = pp->reliabilityOffered;
434 ps->parameter = NULL;
435 CSChangeAttributes_insert(csChange, ps);
438 ps->parameterID = PID_SEND_QUEUE_SIZE;
439 ps->parameterLength = 4;
440 ps->parameterLocal.asUInt32 = pp->sendQueueSize;
441 ps->parameter = NULL;
442 CSChangeAttributes_insert(csChange, ps);
445 ps->parameterID = PID_STRENGTH;
446 ps->parameterLength = 4;
447 ps->parameterLocal.asUInt32 = pp->strength;
448 ps->parameter = NULL;
449 CSChangeAttributes_insert(csChange, ps);
452 parameterPutString(ps, PID_TOPIC, pp->topic);
453 CSChangeAttributes_insert(csChange, ps);
456 ps->parameterID = PID_TYPE_CHECKSUM;
457 ps->parameterLength = 4;
458 ps->parameterLocal.asUInt32 = pp->typeChecksum;
459 ps->parameter = NULL;
460 CSChangeAttributes_insert(csChange, ps);
463 parameterPutString(ps, PID_TYPE_NAME, pp->typeName);
464 CSChangeAttributes_insert(csChange, ps);
466 /* sentinel -> end */
467 ps->parameterID = PID_SENTINEL;
468 ps->parameterLength = 0;
469 ps->parameter = NULL;
470 CSChangeAttributes_insert(csChange, ps);
474 /*****************************************************************************/
476 parameterUpdateCSChangeFromSubscription(CSChange *csChange, ORTESubsProp *sp)
478 ParameterSequence *ps;
480 CSChangeAttributes_init_head(csChange);
481 ps = (ParameterSequence *)MALLOC(sizeof(ParameterSequence)*8);
483 ps->parameterID = PID_MINIMUM_SEPARATION;
484 ps->parameterLength = 8;
485 memcpy(ps->parameterLocal.asStr, &sp->minimumSeparation, ps->parameterLength);
486 ps->parameter = NULL;
487 CSChangeAttributes_insert(csChange, ps);
489 /* receive queue size*/
490 ps->parameterID = PID_RECV_QUEUE_SIZE;
491 ps->parameterLength = 4;
492 ps->parameterLocal.asUInt32 = sp->recvQueueSize;
493 ps->parameter = NULL;
494 CSChangeAttributes_insert(csChange, ps);
496 /* reliabitityRequested */
497 ps->parameterID = PID_RELIABILITY_REQUESTED;
498 ps->parameterLength = 4;
499 ps->parameterLocal.asUInt32 = sp->reliabilityRequested;
500 ps->parameter = NULL;
501 CSChangeAttributes_insert(csChange, ps);
504 parameterPutString(ps, PID_TOPIC, sp->topic);
505 CSChangeAttributes_insert(csChange, ps);
508 ps->parameterID = PID_TYPE_CHECKSUM;
509 ps->parameterLength = 4;
510 ps->parameterLocal.asUInt32 = sp->typeChecksum;
511 ps->parameter = NULL;
512 CSChangeAttributes_insert(csChange, ps);
515 parameterPutString(ps, PID_TYPE_NAME, sp->typeName);
516 CSChangeAttributes_insert(csChange, ps);
518 /* userdata multicast ipaddress */
519 ps->parameterID = PID_USERDATA_MULTICAST_IPADDRESS;
520 ps->parameterLength = 4;
521 ps->parameterLocal.asIPAddress = sp->multicast;
522 ps->parameter = NULL;
523 CSChangeAttributes_insert(csChange, ps);
525 /* sentinel -> end */
526 ps->parameterID = PID_SENTINEL;
527 ps->parameterLength = 0;
528 ps->parameter = NULL;
529 CSChangeAttributes_insert(csChange, ps);
533 /*****************************************************************************/
535 parameterUpdateApplication(CSChange *csChange, AppParams *ap)
537 ParameterSequence *ps;
539 ap->managerKeyCount = 0;
540 ap->metatrafficMulticastIPAddressCount = 0;
541 ap->unicastIPAddressCount = 0;
542 ap->appId = csChange->guid.aid;
543 ap->hostId = csChange->guid.hid;
544 ul_list_for_each(CSChangeAttributes, csChange, ps) {
545 switch (ps->parameterID) {
546 case PID_EXPIRATION_TIME:
547 ap->expirationTime = ps->parameterLocal.asNtpTime;
549 case PID_MANAGER_KEY:
550 ap->managerKeyList[ap->managerKeyCount] =
551 ps->parameterLocal.asUInt32;
552 ap->managerKeyCount++;
554 case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
555 ap->metatrafficMulticastIPAddressList[ap->metatrafficMulticastIPAddressCount] =
556 ps->parameterLocal.asIPAddress;
557 ap->metatrafficMulticastIPAddressCount++;
559 case PID_APP_IPADDRESS:
560 ap->unicastIPAddressList[ap->unicastIPAddressCount] =
561 ps->parameterLocal.asIPAddress;
562 ap->unicastIPAddressCount++;
564 case PID_USERDATA_MULTICAST_IPADDRESS:
566 case PID_METATRAFFIC_UNICAST_PORT:
567 ap->metatrafficUnicastPort = ps->parameterLocal.asPort;
569 case PID_USERDATA_UNICAST_PORT:
570 ap->userdataUnicastPort = ps->parameterLocal.asPort;
573 ap->vendorId = ps->parameterLocal.asVendorId;
575 case PID_PROTOCOL_VERSION:
576 ap->protocolVersion = ps->parameterLocal.asProtocolVersion;
578 case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
579 ap->vargAppsSequenceNumber = ps->parameterLocal.asSequenceNumber;
586 /*****************************************************************************/
588 parameterUpdatePublication(CSChange *csChange, ORTEPublProp *pp)
590 ParameterSequence *ps;
592 ul_list_for_each(CSChangeAttributes, csChange, ps) {
593 switch (ps->parameterID) {
594 case PID_EXPECTS_ACK:
595 pp->expectsAck = *(Boolean *)&ps->parameterLocal;
597 case PID_PERSISTENCE:
598 pp->persistence = ps->parameterLocal.asNtpTime;
600 case PID_RELIABILITY_OFFERED:
601 pp->reliabilityOffered = ps->parameterLocal.asUInt32;
603 case PID_SEND_QUEUE_SIZE:
604 pp->sendQueueSize = ps->parameterLocal.asUInt32;
607 pp->strength = ps->parameterLocal.asUInt32;
610 if (ps->parameterLength > MAX_PARAMETER_LOCAL_LENGTH)
611 strncpy((char *)pp->topic, (const char *)ps->parameter, ps->parameterLength);
613 strncpy((char *)pp->topic, (const char *)ps->parameterLocal.asStr, ps->parameterLength);
615 case PID_TYPE_CHECKSUM:
616 pp->typeChecksum = ps->parameterLocal.asTypeChecksum;
619 if (ps->parameterLength > MAX_PARAMETER_LOCAL_LENGTH)
620 strncpy((char *)pp->typeName, (const char *)ps->parameter, ps->parameterLength);
622 strncpy((char *)pp->typeName, (const char *)ps->parameterLocal.asStr, ps->parameterLength);
629 /*****************************************************************************/
631 parameterUpdateSubscription(CSChange *csChange, ORTESubsProp *sp)
633 ParameterSequence *ps;
635 ul_list_for_each(CSChangeAttributes, csChange, ps) {
636 switch (ps->parameterID) {
637 case PID_MINIMUM_SEPARATION:
638 sp->minimumSeparation = ps->parameterLocal.asNtpTime;
640 case PID_RECV_QUEUE_SIZE:
641 sp->recvQueueSize = ps->parameterLocal.asUInt32;
643 case PID_RELIABILITY_REQUESTED:
644 sp->reliabilityRequested = ps->parameterLocal.asUInt32;
647 if (ps->parameterLength > MAX_PARAMETER_LOCAL_LENGTH)
648 strncpy((char *)sp->topic, (const char *)ps->parameter, ps->parameterLength);
650 strncpy((char *)sp->topic, (const char *)ps->parameterLocal.asStr, ps->parameterLength);
652 case PID_TYPE_CHECKSUM:
653 sp->typeChecksum = ps->parameterLocal.asTypeChecksum;
656 if (ps->parameterLength > MAX_PARAMETER_LOCAL_LENGTH)
657 strncpy((char *)sp->typeName, (const char *)ps->parameter, ps->parameterLength);
659 strncpy((char *)sp->typeName, (const char *)ps->parameterLocal.asStr, ps->parameterLength);
661 case PID_USERDATA_MULTICAST_IPADDRESS:
662 sp->multicast = ps->parameterLocal.asIPAddress;