2 * $Id: parameter.c,v 0.0.0.1 2003/10/13
4 * DEBUG: section 11 parameter
5 * AUTHOR: Petr Smolik petr.smolik@wo.cz
7 * ORTE - OCERA Real-Time Ethernet http://www.ocera.org/
8 * --------------------------------------------------------------------
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
24 /*****************************************************************************/
26 parameterDelete(CSChange *csChange) {
27 ParameterSequence *ps;
29 ul_list_for_each(CSChangeAttributes,
32 if ((ps->parameterLength) > MAX_PARAMETER_LOCAL_LENGTH)
35 //ps is like one piece of memory
36 if (CSChangeAttributes_first(csChange))
37 FREE(CSChangeAttributes_first(csChange));
38 CSChangeAttributes_init_head(csChange);
43 /*****************************************************************************/
45 parameterCodeStreamFromCSChange(CSChange *csChange,
46 uint8_t *rtps_msg,uint32_t max_msg_len) {
47 ParameterSequence *ps;
50 ul_list_for_each(CSChangeAttributes,
53 if (max_msg_len<(uint32_t)(4+ps->parameterLength)) return -1; //no memory for copy
54 *((ParameterId*)rtps_msg)=ps->parameterID;
55 *((ParameterLength*)(rtps_msg+2))=ps->parameterLength;
56 if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH) {
57 memcpy(rtps_msg+4,ps->parameter,ps->parameterLength);
59 memcpy(rtps_msg+4,ps->parameterLocal,ps->parameterLength);
61 rtps_msg=rtps_msg+4+ps->parameterLength;
62 max_msg_len=max_msg_len-ps->parameterLength-4;
63 result=result+4+ps->parameterLength;
68 /*****************************************************************************/
70 parameterDecodeStreamToCSChange(CSChange *csChange,uint8_t *rtps_msg,
71 uint16_t submsg_len,uint8_t e_bit) {
72 ParameterId parameterId;
73 ParameterLength parameterLength;
74 ParameterSequence *ps;
76 uint8_t *rtps_msg_it=rtps_msg;
78 CSChangeAttributes_init_head(csChange);
79 //count number of parameters
81 parameterId=*((ParameterId*)rtps_msg_it);
82 conv_u16(¶meterId,e_bit);
83 parameterLength=*((ParameterId*)(rtps_msg_it+2));
84 conv_u16(¶meterLength,e_bit);
85 if (submsg_len>parameterLength) submsg_len-=parameterLength;
87 if (parameterId==PID_SENTINEL) break;
89 rtps_msg_it+=4+parameterLength;
91 ps=(ParameterSequence*)MALLOC(sizeof(ParameterSequence)*(counter+1));
94 parameterId=*((ParameterId*)rtps_msg_it);
95 conv_u16(¶meterId,e_bit);
96 ps->parameterID=parameterId;
97 parameterLength=*((ParameterId*)(rtps_msg_it+2));
98 conv_u16(¶meterLength,e_bit);
99 ps->parameterLength=parameterLength;
101 switch (parameterId) {
106 case PID_EXPIRATION_TIME:
107 case PID_PERSISTENCE:
108 case PID_MINIMUM_SEPARATION:
109 *(NtpTime*)ps->parameterLocal=*((NtpTime*)(rtps_msg_it+4));
110 conv_ntp((NtpTime*)ps->parameterLocal,e_bit);
113 case PID_TYPE_CHECKSUM:
115 case PID_SEND_QUEUE_SIZE:
116 case PID_RECV_QUEUE_SIZE:
117 case PID_RELIABILITY_OFFERED:
118 case PID_RELIABILITY_REQUESTED:
119 case PID_MANAGER_KEY:
120 *(uint32_t*)ps->parameterLocal=*((uint32_t*)(rtps_msg_it+4));
121 conv_u32((uint32_t*)ps->parameterLocal,e_bit);
124 case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
125 case PID_APP_IPADDRESS:
126 case PID_USERDATA_MULTICAST_IPADDRESS:
127 *(IPAddress*)ps->parameterLocal=*((IPAddress*)(rtps_msg_it+4));
128 conv_u32((IPAddress*)ps->parameterLocal,e_bit);
131 case PID_METATRAFFIC_UNICAST_PORT:
132 case PID_USERDATA_UNICAST_PORT:
133 *(Port*)ps->parameterLocal=*((Port*)(rtps_msg_it+4));
134 conv_u32((Port*)ps->parameterLocal,e_bit);
138 *(VendorId*)ps->parameterLocal=*((VendorId*)(rtps_msg_it+4));
141 case PID_PROTOCOL_VERSION:
142 *(ProtocolVersion*)ps->parameterLocal=*((ProtocolVersion*)(rtps_msg_it+4));
145 case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
146 *(SequenceNumber*)ps->parameterLocal=*((SequenceNumber*)(rtps_msg_it+4));
147 conv_sn((SequenceNumber*)ps->parameterLocal,e_bit);
150 case PID_EXPECTS_ACK:
151 *(Boolean*)ps->parameterLocal=*((Boolean*)(rtps_msg_it+4));
156 if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH) {
157 ps->parameter=MALLOC(ps->parameterLength);
158 memcpy(ps->parameter,rtps_msg_it+4,ps->parameterLength);
160 memcpy(ps->parameterLocal,rtps_msg_it+4,ps->parameterLength);
166 CSChangeAttributes_insert(csChange,ps);
169 rtps_msg_it+=4+parameterLength;
172 ps->parameterID=PID_SENTINEL;
173 ps->parameterLength=0;
175 CSChangeAttributes_insert(csChange,ps);
179 /*****************************************************************************/
181 parameterUpdateCSChange(
182 CSChange *csChange,AppParams *ap,Boolean Manager) {
183 ParameterSequence *ps;
186 i=ap->managerKeyCount+
187 ap->metatrafficMulticastIPAddressCount+
188 ap->unicastIPAddressCount+7;
190 CSChangeAttributes_init_head(csChange);
191 ps=(ParameterSequence*)MALLOC(sizeof(ParameterSequence)*i);
193 ps->parameterID=PID_EXPIRATION_TIME;
194 ps->parameterLength=8;
195 memcpy(ps->parameterLocal,&ap->expirationTime,ps->parameterLength);
197 CSChangeAttributes_insert(csChange,ps);
199 //MATATRAFFIC_MULTICAST_IPADDRESS
200 for (i=0;i<ap->metatrafficMulticastIPAddressCount;i++) {
201 ps->parameterID=PID_MATATRAFFIC_MULTICAST_IPADDRESS;
202 ps->parameterLength=4;
203 *(IPAddress*)ps->parameterLocal=ap->metatrafficMulticastIPAddressList[i];
205 CSChangeAttributes_insert(csChange,ps);
208 //METATRAFFIC_UNICAST_PORT
209 ps->parameterID=PID_METATRAFFIC_UNICAST_PORT;
210 ps->parameterLength=4;
211 *(Port*)&ps->parameterLocal=ap->metatrafficUnicastPort;
213 CSChangeAttributes_insert(csChange,ps);
215 //USERDATA_UNICAST_PORT
216 ps->parameterID=PID_USERDATA_UNICAST_PORT;
217 ps->parameterLength=4;
218 *(Port*)&ps->parameterLocal=ap->userdataUnicastPort;
220 CSChangeAttributes_insert(csChange,ps);
223 for (i=0;i<ap->unicastIPAddressCount;i++) {
224 ps->parameterID=PID_APP_IPADDRESS;;
225 ps->parameterLength=4;
226 *(IPAddress*)ps->parameterLocal=ap->unicastIPAddressList[i];
228 CSChangeAttributes_insert(csChange,ps);
232 ps->parameterID=PID_PROTOCOL_VERSION;
233 ps->parameterLength=2;
234 *(ProtocolVersion*)&ps->parameterLocal=ap->protocolVersion;
236 CSChangeAttributes_insert(csChange,ps);
239 ps->parameterID=PID_VENDOR_ID;
240 ps->parameterLength=2;
241 *(VendorId*)&ps->parameterLocal=ap->vendorId;
243 CSChangeAttributes_insert(csChange,ps);
245 if (Manager) { //Manager
246 //VARGAPPS_SEQUENCE_NUMBER_LAST
247 ps->parameterID=PID_VARGAPPS_SEQUENCE_NUMBER_LAST;
248 ps->parameterLength=8;
249 *(SequenceNumber*)&ps->parameterLocal=ap->vargAppsSequenceNumber;
251 CSChangeAttributes_insert(csChange,ps);
255 for (i=0;i<ap->managerKeyCount;i++) {
256 ps->parameterID=PID_MANAGER_KEY;
257 ps->parameterLength=4;
258 *(uint32_t*)ps->parameterLocal=ap->managerKeyList[i];
260 CSChangeAttributes_insert(csChange,ps);
264 ps->parameterID=PID_SENTINEL;
265 ps->parameterLength=0;
267 CSChangeAttributes_insert(csChange,ps);
271 /*****************************************************************************/
273 parameterUpdateCSChangeFromPublication(CSChange *csChange,ORTEPublProp *pp) {
275 ParameterSequence *ps;
277 CSChangeAttributes_init_head(csChange);
278 ps=(ParameterSequence*)MALLOC(sizeof(ParameterSequence)*8);
280 ps->parameterID=PID_PERSISTENCE;
281 ps->parameterLength=8;
282 memcpy(ps->parameterLocal,&pp->persistence,ps->parameterLength);
284 CSChangeAttributes_insert(csChange,ps);
286 /* reliabitityOffered */
287 ps->parameterID=PID_RELIABILITY_OFFERED;
288 ps->parameterLength=4;
289 *(uint32_t*)ps->parameterLocal=pp->reliabilityOffered;
291 CSChangeAttributes_insert(csChange,ps);
294 ps->parameterID=PID_SEND_QUEUE_SIZE;
295 ps->parameterLength=4;
296 *(uint32_t*)ps->parameterLocal=pp->sendQueueSize;
298 CSChangeAttributes_insert(csChange,ps);
301 ps->parameterID=PID_STRENGTH;
302 ps->parameterLength=4;
303 *(uint32_t*)ps->parameterLocal=pp->strength;
305 CSChangeAttributes_insert(csChange,ps);
308 ps->parameterID=PID_TOPIC;
309 len=strlen(pp->topic);
310 ps->parameter=(int8_t*)MALLOC(len+8);
311 *(uint32_t*)ps->parameter=len+1;
312 strncpy((4+ps->parameter),pp->topic,len);
313 *(uint32_t*)(ps->parameter+len+4)=0;
314 ps->parameterLength=len+8;
315 CSChangeAttributes_insert(csChange,ps);
318 ps->parameterID=PID_TYPE_CHECKSUM;
319 ps->parameterLength=4;
320 *(uint32_t*)ps->parameterLocal=pp->typeChecksum;
322 CSChangeAttributes_insert(csChange,ps);
325 ps->parameterID=PID_TYPE_NAME;
326 len=strlen(pp->typeName);
327 ps->parameter=(int8_t*)MALLOC(len+8);
328 *(uint32_t*)ps->parameter=len+1;
329 strncpy((4+ps->parameter),pp->typeName,len);
330 *(uint32_t*)(ps->parameter+len+4)=0;
331 ps->parameterLength=len+8;
332 CSChangeAttributes_insert(csChange,ps);
334 /* sentinel -> end */
335 ps->parameterID=PID_SENTINEL;
336 ps->parameterLength=0;
338 CSChangeAttributes_insert(csChange,ps);
342 /*****************************************************************************/
344 parameterUpdateCSChangeFromSubscription(CSChange *csChange,ORTESubsProp *sp) {
346 ParameterSequence *ps;
348 CSChangeAttributes_init_head(csChange);
349 ps=(ParameterSequence*)MALLOC(sizeof(ParameterSequence)*7);
351 ps->parameterID=PID_MINIMUM_SEPARATION;
352 ps->parameterLength=8;
353 memcpy(ps->parameterLocal,&sp->minimumSeparation,ps->parameterLength);
355 CSChangeAttributes_insert(csChange,ps);
357 /* receive queue size*/
358 ps->parameterID=PID_RECV_QUEUE_SIZE;
359 ps->parameterLength=4;
360 *(uint32_t*)ps->parameterLocal=sp->recvQueueSize;
362 CSChangeAttributes_insert(csChange,ps);
364 /* reliabitityRequested */
365 ps->parameterID=PID_RELIABILITY_REQUESTED;
366 ps->parameterLength=4;
367 *(uint32_t*)ps->parameterLocal=sp->reliabilityRequested;
369 CSChangeAttributes_insert(csChange,ps);
372 ps->parameterID=PID_TOPIC;
373 len=strlen(sp->topic);
374 ps->parameter=(int8_t*)MALLOC(len+8);
375 *(uint32_t*)ps->parameter=len+1;
376 strncpy((4+ps->parameter),sp->topic,len);
377 *(uint32_t*)(ps->parameter+len+4)=0;
378 ps->parameterLength=len+8;
379 CSChangeAttributes_insert(csChange,ps);
382 ps->parameterID=PID_TYPE_CHECKSUM;
383 ps->parameterLength=4;
384 *(uint32_t*)ps->parameterLocal=sp->typeChecksum;
386 CSChangeAttributes_insert(csChange,ps);
389 ps->parameterID=PID_TYPE_NAME;
390 len=strlen(sp->typeName);
391 ps->parameter=(int8_t*)MALLOC(len+8);
392 *(uint32_t*)ps->parameter=len+1;
393 strncpy((4+ps->parameter),sp->typeName,len);
394 *(uint32_t*)(ps->parameter+len+4)=0;
395 ps->parameterLength=len+8;
396 CSChangeAttributes_insert(csChange,ps);
398 /* sentinel -> end */
399 ps->parameterID=PID_SENTINEL;
400 ps->parameterLength=0;
402 CSChangeAttributes_insert(csChange,ps);
406 /*****************************************************************************/
408 parameterUpdateApplication(CSChange *csChange,AppParams *ap) {
409 ParameterSequence *ps;
411 ap->managerKeyCount=0;
412 ap->metatrafficMulticastIPAddressCount=0;
413 ap->unicastIPAddressCount=0;
414 ap->appId=csChange->guid.aid;
415 ap->hostId=csChange->guid.hid;
416 ul_list_for_each(CSChangeAttributes,csChange,ps) {
417 switch (ps->parameterID) {
418 case PID_EXPIRATION_TIME:
419 ap->expirationTime=*(NtpTime*)ps->parameterLocal;
421 case PID_MANAGER_KEY:
422 ap->managerKeyList[ap->managerKeyCount]=
423 *(uint32_t*)ps->parameterLocal;
424 ap->managerKeyCount++;
426 case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
427 ap->metatrafficMulticastIPAddressList[ap->metatrafficMulticastIPAddressCount]=
428 *(IPAddress*)ps->parameterLocal;
429 ap->metatrafficMulticastIPAddressCount++;
431 case PID_APP_IPADDRESS:
432 ap->unicastIPAddressList[ap->unicastIPAddressCount]=
433 *(IPAddress*)ps->parameterLocal;
434 ap->unicastIPAddressCount++;
436 case PID_USERDATA_MULTICAST_IPADDRESS:
438 case PID_METATRAFFIC_UNICAST_PORT:
439 ap->metatrafficUnicastPort=*(Port*)ps->parameterLocal;
441 case PID_USERDATA_UNICAST_PORT:
442 ap->userdataUnicastPort=*(Port*)ps->parameterLocal;
445 ap->vendorId=*(VendorId*)ps->parameterLocal;
447 case PID_PROTOCOL_VERSION:
448 ap->protocolVersion=*(ProtocolVersion*)ps->parameterLocal;
450 case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
451 ap->vargAppsSequenceNumber=*(SequenceNumber*)ps->parameterLocal;
458 /*****************************************************************************/
460 parameterUpdatePublication(CSChange *csChange,ORTEPublProp *pp) {
461 ParameterSequence *ps;
463 ul_list_for_each(CSChangeAttributes,csChange,ps) {
464 switch (ps->parameterID) {
465 case PID_EXPECTS_ACK:
466 pp->expectsAck=*(Boolean*)&ps->parameterLocal;
468 case PID_PERSISTENCE:
469 pp->persistence=*(NtpTime*)&ps->parameterLocal;
471 case PID_RELIABILITY_OFFERED:
472 pp->reliabilityOffered=*(u_long*)&ps->parameterLocal;
474 case PID_SEND_QUEUE_SIZE:
475 pp->sendQueueSize=*(u_long*)&ps->parameterLocal;
478 pp->strength=*(int32_t*)&ps->parameterLocal;
481 if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH)
482 strncpy(pp->topic,ps->parameter+4,ps->parameterLength-3);
484 strncpy(pp->topic,ps->parameterLocal+4,ps->parameterLength-3);
486 case PID_TYPE_CHECKSUM:
487 pp->typeChecksum=*(TypeChecksum*)&ps->parameterLocal;
490 if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH)
491 strncpy(pp->typeName,ps->parameter+4,ps->parameterLength-3);
493 strncpy(pp->typeName,ps->parameterLocal+4,ps->parameterLength-3);
500 /*****************************************************************************/
502 parameterUpdateSubscription(CSChange *csChange,ORTESubsProp *sp) {
503 ParameterSequence *ps;
505 ul_list_for_each(CSChangeAttributes,csChange,ps) {
506 switch (ps->parameterID) {
507 case PID_MINIMUM_SEPARATION:
508 sp->minimumSeparation=*(NtpTime*)&ps->parameterLocal;
510 case PID_RECV_QUEUE_SIZE:
511 sp->recvQueueSize=*(uint32_t*)&ps->parameterLocal;
513 case PID_RELIABILITY_REQUESTED:
514 sp->reliabilityRequested=*(uint32_t*)&ps->parameterLocal;
517 if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH)
518 strncpy(sp->topic,ps->parameter+4,ps->parameterLength-3);
520 strncpy(sp->topic,ps->parameterLocal+4,ps->parameterLength-3);
522 case PID_TYPE_CHECKSUM:
523 sp->typeChecksum=*(TypeChecksum*)&ps->parameterLocal;
526 if (ps->parameterLength>MAX_PARAMETER_LOCAL_LENGTH)
527 strncpy(sp->typeName,ps->parameter+4,ps->parameterLength-3);
529 strncpy(sp->typeName,ps->parameterLocal+4,ps->parameterLength-3);