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) {
56 ParameterSequence *ps;
58 ul_list_for_each(CSChangeAttributes,
61 if ((ps->parameterLength) > MAX_PARAMETER_LOCAL_LENGTH)
64 //ps is like one piece of memory
65 if (CSChangeAttributes_first(csChange))
66 FREE(CSChangeAttributes_first(csChange));
67 CSChangeAttributes_init_head(csChange);
72 /*****************************************************************************/
74 parameterCodeCodecFromCSChange(CSChange *csChange,CDR_Codec *cdrCodec)
76 ParameterSequence *ps;
78 ul_list_for_each(CSChangeAttributes,
82 if (CDR_put_ushort(cdrCodec,ps->parameterID)==CORBA_FALSE) return -1;
83 if (CDR_put_ushort(cdrCodec,ps->parameterLength)==CORBA_FALSE) return -1;
85 debug(11,10) ("parameterCodeCodecToCSChange: parameterID-0x%x, len-%d\n",
86 ps->parameterID,ps->parameterLength);
88 switch (ps->parameterID) {
92 case PID_EXPIRATION_TIME:
94 case PID_MINIMUM_SEPARATION:
96 if (CDR_put_long(cdrCodec, ps->parameterLocal.asNtpTime.seconds)==
97 CORBA_FALSE) return -1;
98 /* time in seconds / 2^32 */
99 if (CDR_put_ulong(cdrCodec, ps->parameterLocal.asNtpTime.fraction)==
100 CORBA_FALSE) return -1;
102 //CORBA_unsigned_long
103 case PID_TYPE_CHECKSUM:
105 case PID_SEND_QUEUE_SIZE:
106 case PID_RECV_QUEUE_SIZE:
107 case PID_RELIABILITY_OFFERED:
108 case PID_RELIABILITY_REQUESTED:
109 case PID_MANAGER_KEY:
110 case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
111 case PID_APP_IPADDRESS:
112 case PID_USERDATA_MULTICAST_IPADDRESS:
113 case PID_METATRAFFIC_UNICAST_PORT:
114 case PID_USERDATA_UNICAST_PORT:
115 if (CDR_put_ulong(cdrCodec, ps->parameterLocal.asLong)==
116 CORBA_FALSE) return -1;
120 if (CDR_put_octet(cdrCodec, ps->parameterLocal.asVendorId.major)==
121 CORBA_FALSE) return -1;
122 if (CDR_put_octet(cdrCodec, ps->parameterLocal.asVendorId.minor)==
123 CORBA_FALSE) return -1;
126 case PID_PROTOCOL_VERSION:
127 if (CDR_put_octet(cdrCodec, ps->parameterLocal.asProtocolVersion.major)==
128 CORBA_FALSE) return -1;
129 if (CDR_put_octet(cdrCodec, ps->parameterLocal.asProtocolVersion.minor)==
130 CORBA_FALSE) return -1;
133 case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
134 if (CDR_put_ulong(cdrCodec, ps->parameterLocal.asSequenceNumber.high)==
135 CORBA_FALSE) return -1;
136 if (CDR_put_ulong(cdrCodec, ps->parameterLocal.asSequenceNumber.low)==
137 CORBA_FALSE) return -1;
140 case PID_EXPECTS_ACK:
141 if (CDR_put_octet(cdrCodec,ps->parameterLocal.asOctet)==
142 CORBA_FALSE) return -1;
151 len=ps->parameterLength;
152 if (len % 4) { //length alignment to 4
157 cdrCodec->wptr-=2; //new alignments value
158 if (CDR_put_ushort(cdrCodec,(CORBA_unsigned_short)len)==CORBA_FALSE) return -1;
160 if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH) {
161 if (CDR_put_string(cdrCodec,(char*)ps->parameter)==
162 CORBA_FALSE) return -1;
164 if (CDR_put_string(cdrCodec,(char*)ps->parameterLocal.asStr)==
165 CORBA_FALSE) return -1;
168 cdrCodec->wptr=wptr+len;
173 debug(11,1) ("parameterCodeCodecFromCSChange: undefined parameterID: %d\n",
181 /*****************************************************************************/
183 parameterDecodeCodecToCSChange(CSChange *csChange,CDR_Codec *cdrCodec)
185 ParameterId parameterId;
186 ParameterLength parameterLength;
187 ParameterSequence *ps;
191 CSChangeAttributes_init_head(csChange);
194 //count number of parameters -> we need one memory allocation for ps
195 while (cdrCodec->rptr<cdrCodec->buf_len) {
196 if (CDR_get_ushort(cdrCodec,¶meterId)==CORBA_FALSE)
198 if (CDR_get_ushort(cdrCodec,¶meterLength)==CORBA_FALSE)
200 if (parameterId==PID_SENTINEL)
203 cdrCodec->rptr+=parameterLength;
206 ps=(ParameterSequence*)MALLOC(sizeof(ParameterSequence)*(counter+1));
210 CDR_get_ushort(cdrCodec,¶meterId);
211 CDR_get_ushort(cdrCodec,¶meterLength);
213 ps->parameterID=parameterId;
214 ps->parameterLength=parameterLength;
217 /* save start position of parameter */
220 debug(11,10) ("parameterDecodeCodecToCSChange: parameterID-0x%x, len-%d\n",
221 parameterId,parameterLength);
222 switch (parameterId) {
227 case PID_EXPIRATION_TIME:
228 case PID_PERSISTENCE:
229 case PID_MINIMUM_SEPARATION:
230 /* time in seconds */
231 CDR_get_long(cdrCodec, &ps->parameterLocal.asNtpTime.seconds);
232 /* time in seconds / 2^32 */
233 CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&ps->parameterLocal.asNtpTime.fraction);
235 //CORBA_unsigned_long
236 case PID_TYPE_CHECKSUM:
238 case PID_SEND_QUEUE_SIZE:
239 case PID_RECV_QUEUE_SIZE:
240 case PID_RELIABILITY_OFFERED:
241 case PID_RELIABILITY_REQUESTED:
242 case PID_MANAGER_KEY:
243 case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
244 case PID_APP_IPADDRESS:
245 case PID_USERDATA_MULTICAST_IPADDRESS:
246 case PID_METATRAFFIC_UNICAST_PORT:
247 case PID_USERDATA_UNICAST_PORT:
248 CDR_get_ulong(cdrCodec, &ps->parameterLocal.asLong);
252 CDR_get_octet(cdrCodec, (CORBA_octet *)&ps->parameterLocal.asVendorId.major);
253 CDR_get_octet(cdrCodec, (CORBA_octet *)&ps->parameterLocal.asVendorId.minor);
256 case PID_PROTOCOL_VERSION:
257 CDR_get_octet(cdrCodec, (CORBA_octet *)&ps->parameterLocal.asProtocolVersion.major);
258 CDR_get_octet(cdrCodec, (CORBA_octet *)&ps->parameterLocal.asProtocolVersion.minor);
261 case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
262 CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&ps->parameterLocal.asSequenceNumber.high);
263 CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&ps->parameterLocal.asSequenceNumber.low);
266 case PID_EXPECTS_ACK:
267 CDR_get_octet(cdrCodec, ps->parameterLocal.asStr);
272 CORBA_unsigned_long len;
274 CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&len);
276 ps->parameterLength=(uint16_t)len;
277 if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH) {
278 CDR_get_string(cdrCodec,(CORBA_char**)&ps->parameter);
280 CDR_get_string_buff(cdrCodec,(CORBA_char*)ps->parameterLocal.asStr);
286 debug(11,1) ("parameterDecodeCodecToCSChange: undefined parameterID: %d\n",
290 CSChangeAttributes_insert(csChange,ps);
294 cdrCodec->rptr=rptr+parameterLength;
297 ps->parameterID=PID_SENTINEL;
298 ps->parameterLength=0;
300 CSChangeAttributes_insert(csChange,ps);
304 /*****************************************************************************/
306 parameterUpdateCSChange(
307 CSChange *csChange,AppParams *ap,Boolean Manager) {
308 ParameterSequence *ps;
311 i=ap->managerKeyCount+
312 ap->metatrafficMulticastIPAddressCount+
313 ap->unicastIPAddressCount+7;
315 CSChangeAttributes_init_head(csChange);
316 ps=(ParameterSequence*)MALLOC(sizeof(ParameterSequence)*i);
318 ps->parameterID=PID_EXPIRATION_TIME;
319 ps->parameterLength=8;
320 memcpy(ps->parameterLocal.asStr,&ap->expirationTime,ps->parameterLength);
322 CSChangeAttributes_insert(csChange,ps);
324 //MATATRAFFIC_MULTICAST_IPADDRESS
325 for (i=0;i<ap->metatrafficMulticastIPAddressCount;i++) {
326 ps->parameterID=PID_MATATRAFFIC_MULTICAST_IPADDRESS;
327 ps->parameterLength=4;
328 ps->parameterLocal.asIPAddress=ap->metatrafficMulticastIPAddressList[i];
330 CSChangeAttributes_insert(csChange,ps);
333 //METATRAFFIC_UNICAST_PORT
334 ps->parameterID=PID_METATRAFFIC_UNICAST_PORT;
335 ps->parameterLength=4;
336 ps->parameterLocal.asPort=ap->metatrafficUnicastPort;
338 CSChangeAttributes_insert(csChange,ps);
340 //USERDATA_UNICAST_PORT
341 ps->parameterID=PID_USERDATA_UNICAST_PORT;
342 ps->parameterLength=4;
343 ps->parameterLocal.asPort=ap->userdataUnicastPort;
345 CSChangeAttributes_insert(csChange,ps);
348 for (i=0;i<ap->unicastIPAddressCount;i++) {
349 ps->parameterID=PID_APP_IPADDRESS;;
350 ps->parameterLength=4;
351 ps->parameterLocal.asIPAddress=ap->unicastIPAddressList[i];
353 CSChangeAttributes_insert(csChange,ps);
357 ps->parameterID=PID_PROTOCOL_VERSION;
358 ps->parameterLength=2;
359 ps->parameterLocal.asProtocolVersion=ap->protocolVersion;
361 CSChangeAttributes_insert(csChange,ps);
364 ps->parameterID=PID_VENDOR_ID;
365 ps->parameterLength=2;
366 ps->parameterLocal.asVendorId=ap->vendorId;
368 CSChangeAttributes_insert(csChange,ps);
370 if (Manager) { //Manager
371 //VARGAPPS_SEQUENCE_NUMBER_LAST
372 ps->parameterID=PID_VARGAPPS_SEQUENCE_NUMBER_LAST;
373 ps->parameterLength=8;
374 ps->parameterLocal.asSequenceNumber=ap->vargAppsSequenceNumber;
376 CSChangeAttributes_insert(csChange,ps);
380 for (i=0;i<ap->managerKeyCount;i++) {
381 ps->parameterID=PID_MANAGER_KEY;
382 ps->parameterLength=4;
383 ps->parameterLocal.asUInt32=ap->managerKeyList[i];
385 CSChangeAttributes_insert(csChange,ps);
389 ps->parameterID=PID_SENTINEL;
390 ps->parameterLength=0;
392 CSChangeAttributes_insert(csChange,ps);
396 /*****************************************************************************/
398 parameterUpdateCSChangeFromPublication(CSChange *csChange,ORTEPublProp *pp) {
399 ParameterSequence *ps;
401 CSChangeAttributes_init_head(csChange);
402 ps=(ParameterSequence*)MALLOC(sizeof(ParameterSequence)*8);
404 ps->parameterID=PID_PERSISTENCE;
405 ps->parameterLength=8;
406 memcpy(ps->parameterLocal.asStr,&pp->persistence,ps->parameterLength);
408 CSChangeAttributes_insert(csChange,ps);
410 /* reliabitityOffered */
411 ps->parameterID=PID_RELIABILITY_OFFERED;
412 ps->parameterLength=4;
413 ps->parameterLocal.asUInt32=pp->reliabilityOffered;
415 CSChangeAttributes_insert(csChange,ps);
418 ps->parameterID=PID_SEND_QUEUE_SIZE;
419 ps->parameterLength=4;
420 ps->parameterLocal.asUInt32=pp->sendQueueSize;
422 CSChangeAttributes_insert(csChange,ps);
425 ps->parameterID=PID_STRENGTH;
426 ps->parameterLength=4;
427 ps->parameterLocal.asUInt32=pp->strength;
429 CSChangeAttributes_insert(csChange,ps);
432 parameterPutString(ps,PID_TOPIC,pp->topic);
433 CSChangeAttributes_insert(csChange,ps);
436 ps->parameterID=PID_TYPE_CHECKSUM;
437 ps->parameterLength=4;
438 ps->parameterLocal.asUInt32=pp->typeChecksum;
440 CSChangeAttributes_insert(csChange,ps);
443 parameterPutString(ps,PID_TYPE_NAME,pp->typeName);
444 CSChangeAttributes_insert(csChange,ps);
446 /* sentinel -> end */
447 ps->parameterID=PID_SENTINEL;
448 ps->parameterLength=0;
450 CSChangeAttributes_insert(csChange,ps);
454 /*****************************************************************************/
456 parameterUpdateCSChangeFromSubscription(CSChange *csChange,ORTESubsProp *sp) {
457 ParameterSequence *ps;
459 CSChangeAttributes_init_head(csChange);
460 ps=(ParameterSequence*)MALLOC(sizeof(ParameterSequence)*8);
462 ps->parameterID=PID_MINIMUM_SEPARATION;
463 ps->parameterLength=8;
464 memcpy(ps->parameterLocal.asStr,&sp->minimumSeparation,ps->parameterLength);
466 CSChangeAttributes_insert(csChange,ps);
468 /* receive queue size*/
469 ps->parameterID=PID_RECV_QUEUE_SIZE;
470 ps->parameterLength=4;
471 ps->parameterLocal.asUInt32=sp->recvQueueSize;
473 CSChangeAttributes_insert(csChange,ps);
475 /* reliabitityRequested */
476 ps->parameterID=PID_RELIABILITY_REQUESTED;
477 ps->parameterLength=4;
478 ps->parameterLocal.asUInt32=sp->reliabilityRequested;
480 CSChangeAttributes_insert(csChange,ps);
483 parameterPutString(ps,PID_TOPIC,sp->topic);
484 CSChangeAttributes_insert(csChange,ps);
487 ps->parameterID=PID_TYPE_CHECKSUM;
488 ps->parameterLength=4;
489 ps->parameterLocal.asUInt32=sp->typeChecksum;
491 CSChangeAttributes_insert(csChange,ps);
494 parameterPutString(ps,PID_TYPE_NAME,sp->typeName);
495 CSChangeAttributes_insert(csChange,ps);
497 /* userdata multicast ipaddress */
498 ps->parameterID=PID_USERDATA_MULTICAST_IPADDRESS;
499 ps->parameterLength=4;
500 ps->parameterLocal.asIPAddress=sp->multicast;
502 CSChangeAttributes_insert(csChange,ps);
504 /* sentinel -> end */
505 ps->parameterID=PID_SENTINEL;
506 ps->parameterLength=0;
508 CSChangeAttributes_insert(csChange,ps);
512 /*****************************************************************************/
514 parameterUpdateApplication(CSChange *csChange,AppParams *ap) {
515 ParameterSequence *ps;
517 ap->managerKeyCount=0;
518 ap->metatrafficMulticastIPAddressCount=0;
519 ap->unicastIPAddressCount=0;
520 ap->appId=csChange->guid.aid;
521 ap->hostId=csChange->guid.hid;
522 ul_list_for_each(CSChangeAttributes,csChange,ps) {
523 switch (ps->parameterID) {
524 case PID_EXPIRATION_TIME:
525 ap->expirationTime=ps->parameterLocal.asNtpTime;
527 case PID_MANAGER_KEY:
528 ap->managerKeyList[ap->managerKeyCount]=
529 ps->parameterLocal.asUInt32;
530 ap->managerKeyCount++;
532 case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
533 ap->metatrafficMulticastIPAddressList[ap->metatrafficMulticastIPAddressCount]=
534 ps->parameterLocal.asIPAddress;
535 ap->metatrafficMulticastIPAddressCount++;
537 case PID_APP_IPADDRESS:
538 ap->unicastIPAddressList[ap->unicastIPAddressCount]=
539 ps->parameterLocal.asIPAddress;
540 ap->unicastIPAddressCount++;
542 case PID_USERDATA_MULTICAST_IPADDRESS:
544 case PID_METATRAFFIC_UNICAST_PORT:
545 ap->metatrafficUnicastPort=ps->parameterLocal.asPort;
547 case PID_USERDATA_UNICAST_PORT:
548 ap->userdataUnicastPort=ps->parameterLocal.asPort;
551 ap->vendorId=ps->parameterLocal.asVendorId;
553 case PID_PROTOCOL_VERSION:
554 ap->protocolVersion=ps->parameterLocal.asProtocolVersion;
556 case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
557 ap->vargAppsSequenceNumber=ps->parameterLocal.asSequenceNumber;
564 /*****************************************************************************/
566 parameterUpdatePublication(CSChange *csChange,ORTEPublProp *pp) {
567 ParameterSequence *ps;
569 ul_list_for_each(CSChangeAttributes,csChange,ps) {
570 switch (ps->parameterID) {
571 case PID_EXPECTS_ACK:
572 pp->expectsAck=*(Boolean*)&ps->parameterLocal;
574 case PID_PERSISTENCE:
575 pp->persistence=ps->parameterLocal.asNtpTime;
577 case PID_RELIABILITY_OFFERED:
578 pp->reliabilityOffered=ps->parameterLocal.asUInt32;
580 case PID_SEND_QUEUE_SIZE:
581 pp->sendQueueSize=ps->parameterLocal.asUInt32;
584 pp->strength=ps->parameterLocal.asUInt32;
587 if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH)
588 strncpy((char *)pp->topic, (const char*)ps->parameter,ps->parameterLength);
590 strncpy((char *)pp->topic, (const char*)ps->parameterLocal.asStr,ps->parameterLength);
592 case PID_TYPE_CHECKSUM:
593 pp->typeChecksum=ps->parameterLocal.asTypeChecksum;
596 if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH)
597 strncpy((char *)pp->typeName, (const char*)ps->parameter,ps->parameterLength);
599 strncpy((char *)pp->typeName, (const char*)ps->parameterLocal.asStr,ps->parameterLength);
606 /*****************************************************************************/
608 parameterUpdateSubscription(CSChange *csChange,ORTESubsProp *sp) {
609 ParameterSequence *ps;
611 ul_list_for_each(CSChangeAttributes,csChange,ps) {
612 switch (ps->parameterID) {
613 case PID_MINIMUM_SEPARATION:
614 sp->minimumSeparation=ps->parameterLocal.asNtpTime;
616 case PID_RECV_QUEUE_SIZE:
617 sp->recvQueueSize=ps->parameterLocal.asUInt32;
619 case PID_RELIABILITY_REQUESTED:
620 sp->reliabilityRequested=ps->parameterLocal.asUInt32;
623 if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH)
624 strncpy((char *)sp->topic, (const char*)ps->parameter,ps->parameterLength);
626 strncpy((char *)sp->topic, (const char*)ps->parameterLocal.asStr,ps->parameterLength);
628 case PID_TYPE_CHECKSUM:
629 sp->typeChecksum=ps->parameterLocal.asTypeChecksum;
632 if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH)
633 strncpy((char *)sp->typeName, (const char*)ps->parameter,ps->parameterLength);
635 strncpy((char *)sp->typeName, (const char*)ps->parameterLocal.asStr,ps->parameterLength);
637 case PID_USERDATA_MULTICAST_IPADDRESS:
638 sp->multicast=ps->parameterLocal.asIPAddress;