0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 #include <string.h>
0035 #include <stdio.h>
0036 #include <stdlib.h>
0037 #include <memory.h>
0038 #include <errno.h>
0039 #include <math.h>
0040 #include <ndrx_ddr.h>
0041 #include <fcntl.h>
0042 #include <assert.h>
0043
0044 #include "atmi_int.h"
0045 #include <lcfint.h>
0046 #include <atmi_shm.h>
0047 #include <typed_buf.h>
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057 exprivate int ndrx_ddr_key_hash(ndrx_lh_config_t *conf, void *key_get, size_t key_len)
0058 {
0059 return ndrx_hash_fn(key_get) % conf->elmmax;
0060 }
0061
0062
0063 exprivate void ndrx_ddr_key_debug(ndrx_lh_config_t *conf, void *key_get, size_t key_len,
0064 char *dbg_out, size_t dbg_len)
0065 {
0066 NDRX_STRCPY_SAFE_DST(dbg_out, key_get, dbg_len);
0067 }
0068
0069
0070 exprivate void ndrx_ddr_debug(ndrx_lh_config_t *conf, int idx, char *dbg_out, size_t dbg_len)
0071 {
0072 snprintf(dbg_out, dbg_len, "%s", NDRX_DDRV_SVC_INDEX((*conf->memptr), idx)->svcnm);
0073
0074 }
0075
0076 exprivate int ndrx_ddr_compare(ndrx_lh_config_t *conf, void *key_get, size_t key_len, int idx)
0077 {
0078 return strcmp(NDRX_DDRV_SVC_INDEX((*conf->memptr), idx)->svcnm, key_get);
0079 }
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090 exprivate int ndrx_ddr_position_get(char *svcnm, int oflag, int *pos,
0091 int *have_value, char **mem, long memmax)
0092 {
0093 ndrx_lh_config_t conf;
0094
0095 conf.elmmax = memmax;
0096 conf.elmsz = sizeof(ndrx_services_t);
0097 conf.flags_offset = EXOFFSET(ndrx_services_t, flags);
0098 conf.memptr = (void **)mem;
0099 conf.p_key_hash=&ndrx_ddr_key_hash;
0100 conf.p_key_debug=&ndrx_ddr_key_debug;
0101 conf.p_val_debug=&ndrx_ddr_debug;
0102 conf.p_compare=&ndrx_ddr_compare;
0103
0104 return ndrx_lh_position_get(&conf, svcnm, 0, oflag, pos, have_value, "ddrsvc");
0105 }
0106
0107
0108
0109
0110
0111 expublic int ndrx_ddr_services_put(ndrx_services_t *svc, char *mem, long memmax)
0112 {
0113 int have_value=EXFALSE;
0114 int pos=0;
0115 int ret = EXSUCCEED;
0116 ndrx_services_t *ptr = (ndrx_services_t *)mem;
0117
0118
0119
0120 if (!ndrx_ddr_position_get(svc->svcnm, O_CREAT, &pos, &have_value, &mem, memmax))
0121 {
0122 NDRX_LOG(log_error, "Failed to get position for [%s] in LH", svc->svcnm);
0123 EXFAIL_OUT(ret);
0124 }
0125
0126
0127 memcpy(&ptr[pos], svc, sizeof(*svc));
0128 ptr[pos].flags=NDRX_LH_FLAG_ISUSED|NDRX_LH_FLAG_WASUSED;
0129
0130 out:
0131 return ret;
0132 }
0133
0134
0135 #define DDR_SHM_CHANGED ndrx_G_shmcfg->ddr_ver1!=ver1_ok && ndrx_G_shmcfg->ddr_ver1!=ver2_ok
0136
0137
0138
0139
0140 #define DDR_SHM_VALIDATE \
0141 if (DDR_SHM_CHANGED) \
0142 {\
0143 NDRX_LOG(log_error, "Unable to get DDR data for [%s] service - increase <ddrreload> "\
0144 "time (accepted version: %u,%u current: %u)", \
0145 svcnm, ver1_ok, ver2_ok, ndrx_G_shmcfg->ddr_ver1);\
0146 userlog("Unable to get DDR data for [%s] service - increase <ddrreload> "\
0147 "time (accepted version: %u,%u current: %u)", \
0148 svcnm, ver1_ok, ver2_ok, ndrx_G_shmcfg->ddr_ver1);\
0149 ndrx_TPset_error_fmt(TPESYSTEM, "Unable to get DDR data for [%s] service - increase <ddrreload> "\
0150 "time (accepted version: %u,%u current: %u)", \
0151 svcnm, ver1_ok, ver2_ok, ndrx_G_shmcfg->ddr_ver1);\
0152 EXFAIL_OUT(ret);\
0153 }
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163 expublic int ndrx_ddr_services_get(char *svcnm, ndrx_services_t **svc)
0164 {
0165 int ret = EXFALSE;
0166 int have_value=EXFALSE;
0167 int pos=0;
0168 int page;
0169 unsigned char ver1_ok;
0170 unsigned char ver2_ok;
0171 ndrx_services_t *ptr;
0172
0173
0174 if (!ndrx_G_shmcfg->use_ddr)
0175 {
0176
0177 return EXFALSE;
0178 }
0179
0180 ver1_ok = ndrx_G_shmcfg->ddr_ver1;
0181 ver2_ok = ndrx_G_shmcfg->ddr_ver1+1;
0182
0183 page = ndrx_G_shmcfg->ddr_page;
0184 ptr = (ndrx_services_t *) (ndrx_G_routsvc.mem + page*G_atmi_env.rtsvcmax * sizeof(ndrx_services_t));
0185
0186 if (EXTRUE==ndrx_ddr_position_get(svcnm, 0, &pos,
0187 &have_value, (char **)&ptr, G_atmi_env.rtsvcmax) && have_value)
0188 {
0189 *svc = &ptr[pos];
0190
0191 NDRX_LOG(log_debug, "Found service [%s] in ddr service table, autotran=%d",
0192 (*svc)->svcnm, (*svc)->autotran);
0193 ret=EXTRUE;
0194 }
0195
0196 DDR_SHM_VALIDATE;
0197
0198
0199 out:
0200 return ret;
0201 }
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215 expublic int ndrx_ddr_grp_get(char *svcnm, size_t svcnmsz, char *data, long len,
0216 int *prio)
0217 {
0218 int ret = EXSUCCEED;
0219 ndrx_services_t *svc;
0220 int page;
0221 ndrx_routcrit_t *ccrit;
0222 ndrx_routcritseq_t *range;
0223 int offset_step=0, chk_step=0;
0224 int i;
0225 double floatval;
0226 long longval;
0227 char *strval=NULL;
0228 int strval_alloc=EXFALSE;
0229 buffer_obj_t *buf;
0230 char *mem_start;
0231 int in_range=EXFALSE;
0232 BFLDID fldid;
0233 int fieldtypeid;
0234 char fldnm[UBFFLDMAX+1];
0235 int len_new;
0236 char grp[NDRX_DDR_GRP_MAX+1];
0237 unsigned char ver1_ok;
0238 unsigned char ver2_ok;
0239 int is_default = EXFALSE;
0240 int had_type_match = EXFALSE;
0241
0242
0243 if (!ndrx_shm_is_attached(&ndrx_G_routsvc))
0244 {
0245 goto out;
0246 }
0247
0248
0249 if (!ndrx_G_shmcfg->use_ddr)
0250 {
0251 goto out;
0252 }
0253
0254 ver1_ok = ndrx_G_shmcfg->ddr_ver1;
0255 ver2_ok = ndrx_G_shmcfg->ddr_ver1+1;
0256
0257 ret=ndrx_ddr_services_get(svcnm, &svc);
0258
0259 if (EXTRUE!=ret)
0260 {
0261 if (EXFALSE==ret)
0262 {
0263 NDRX_LOG(log_debug, "No DDR service for [%s]", svcnm);
0264 }
0265
0266
0267
0268
0269
0270 goto out;
0271 }
0272
0273 ret = EXSUCCEED;
0274
0275
0276 *prio = svc->prio;
0277
0278 if (EXEOS==svc->criterion[0])
0279 {
0280
0281 goto out;
0282 }
0283
0284
0285
0286
0287
0288
0289 buf = ndrx_find_buffer(data);
0290 if (NULL==buf)
0291 {
0292 NDRX_LOG(log_error, "Cannot route [%s] service - invalid data buffer",
0293 svcnm);
0294 userlog("Cannot route [%s] service - invalid data buffer",
0295 svcnm);
0296 ndrx_TPset_error_fmt(TPESYSTEM, "Cannot route [%s] service - invalid data buffer",
0297 svcnm);
0298 EXFAIL_OUT(ret);
0299 }
0300
0301
0302 page = ndrx_G_shmcfg->ddr_page;
0303 mem_start = ndrx_G_routcrit.mem + page * G_atmi_env.rtcrtmax+svc->offset;
0304
0305 do
0306 {
0307
0308
0309
0310 DDR_SHM_VALIDATE;
0311
0312 ccrit = (ndrx_routcrit_t *)(mem_start + offset_step);
0313
0314 if (ccrit->criterionid!=svc->cirterionid)
0315 {
0316
0317
0318
0319 DDR_SHM_VALIDATE;
0320 goto out_rej;
0321 }
0322
0323
0324
0325 if (buf->type_id == ccrit->buffer_type_id)
0326 {
0327 had_type_match = EXTRUE;
0328
0329
0330 if (BUF_TYPE_UBF==buf->type_id)
0331 {
0332 fieldtypeid = ccrit->fieldtypeid;
0333 fldid = ccrit->fldid;
0334 NDRX_STRCPY_SAFE(fldnm, ccrit->field);
0335
0336
0337 DDR_SHM_VALIDATE;
0338
0339 if (BFLD_LONG == fieldtypeid)
0340 {
0341 if (EXSUCCEED!=CBget((UBFH *)data, fldid, 0,
0342 (char *)&longval, 0L, BFLD_LONG))
0343 {
0344 NDRX_LOG(log_error, "Cannot route [%s] - routing field not found [%s]: %s",
0345 svcnm, fldnm, Bstrerror(Berror));
0346 userlog("Cannot route [%s] - routing field not found [%s]: %s",
0347 svcnm, fldnm, Bstrerror(Berror));
0348 ndrx_TPset_error_fmt(TPESYSTEM, "Cannot route [%s] - routing field not found [%s]: %s",
0349 svcnm, fldnm, Bstrerror(Berror));
0350 EXFAIL_OUT(ret);
0351 }
0352 }
0353 else if (BFLD_DOUBLE == fieldtypeid)
0354 {
0355 if (EXSUCCEED!=CBget((UBFH *)data, fldid, 0,
0356 (char *)&floatval, 0L, BFLD_DOUBLE))
0357 {
0358 NDRX_LOG(log_error, "Cannot route [%s] - routing field not found [%s]: %s",
0359 svcnm, fldnm, Bstrerror(Berror));
0360 userlog("Cannot route [%s] - routing field not found [%s]: %s",
0361 svcnm, fldnm, Bstrerror(Berror));
0362 ndrx_TPset_error_fmt(TPESYSTEM, "Cannot route [%s] - routing field not found [%s]: %s",
0363 svcnm, fldnm, Bstrerror(Berror));
0364 EXFAIL_OUT(ret);
0365 }
0366 }
0367 else
0368 {
0369
0370
0371
0372
0373 if (BFLD_STRING==Bfldtype(fldid))
0374 {
0375
0376 strval = Bfind((UBFH *)data, fldid, 0, NULL);
0377 }
0378 else
0379 {
0380 strval = Bgetsa ((UBFH *)data, fldid, 0, NULL);
0381
0382 strval_alloc=EXTRUE;
0383 }
0384
0385 if (NULL==strval)
0386 {
0387 NDRX_LOG(log_error, "Cannot route [%s] - routing field not found [%s]: %s",
0388 svcnm, fldnm, Bstrerror(Berror));
0389 userlog("Cannot route [%s] - routing field not found [%s]: %s",
0390 svcnm, fldnm, Bstrerror(Berror));
0391 ndrx_TPset_error_fmt(TPESYSTEM, "Cannot route [%s] - routing field not found [%s]: %s",
0392 svcnm, fldnm, Bstrerror(Berror));
0393 EXFAIL_OUT(ret);
0394 }
0395 }
0396 }
0397
0398 offset_step+=sizeof(ndrx_routcrit_t);
0399
0400 for (i=0; i < ccrit->rangesnr; i++)
0401 {
0402
0403 DDR_SHM_VALIDATE;
0404
0405
0406 range = (ndrx_routcritseq_t *)(mem_start + offset_step);
0407
0408
0409 if (range->flags & NDRX_DDR_FLAG_DEFAULT_VAL)
0410 {
0411
0412 in_range=EXTRUE;
0413 }
0414 else if (range->flags & NDRX_DDR_FLAG_MIN)
0415 {
0416
0417 if (BFLD_LONG == fieldtypeid)
0418 {
0419 if (longval <= range->upperl)
0420 {
0421 in_range=EXTRUE;
0422 }
0423 }
0424 else if (BFLD_DOUBLE == fieldtypeid)
0425 {
0426 if (floatval < range->upperd ||
0427 fabs(floatval - range->upperd) < DOUBLE_EQUAL)
0428 {
0429 in_range=EXTRUE;
0430 }
0431 }
0432 else if (BFLD_STRING == fieldtypeid)
0433 {
0434 if (strcmp(strval, range->strrange) <= 0)
0435 {
0436 in_range=EXTRUE;
0437 }
0438 }
0439 }
0440 else if (range->flags & NDRX_DDR_FLAG_MAX)
0441 {
0442
0443 if (BFLD_LONG == fieldtypeid)
0444 {
0445 if (longval >= range->lowerl)
0446 {
0447 in_range=EXTRUE;
0448 }
0449 }
0450 else if (BFLD_DOUBLE == fieldtypeid)
0451 {
0452 if (floatval > range->lowerd ||
0453 fabs(floatval - range->lowerd) < DOUBLE_EQUAL)
0454 {
0455 in_range=EXTRUE;
0456 }
0457 }
0458 else if (BFLD_STRING == fieldtypeid)
0459 {
0460
0461
0462
0463
0464
0465
0466
0467 if (strcmp(strval, range->strrange) >=0)
0468 {
0469 in_range=EXTRUE;
0470 }
0471 }
0472 }
0473 else
0474 {
0475
0476 if (BFLD_LONG == fieldtypeid)
0477 {
0478 if (longval >= range->lowerl &&
0479 longval <= range->upperl)
0480 {
0481 in_range=EXTRUE;
0482 }
0483 }
0484 else if (BFLD_DOUBLE == fieldtypeid)
0485 {
0486 if ( (floatval > range->lowerd ||
0487 fabs(floatval - range->lowerd) < DOUBLE_EQUAL) &&
0488
0489 (floatval < range->upperd ||
0490 fabs(floatval - range->upperd) < DOUBLE_EQUAL)
0491 )
0492 {
0493 in_range=EXTRUE;
0494 }
0495 }
0496 else if (BFLD_STRING == fieldtypeid)
0497 {
0498 if (strcmp(strval, range->strrange) >=0 &&
0499 strcmp(strval, range->strrange+range->strrange_upper) <=0
0500 )
0501 {
0502 in_range=EXTRUE;
0503 }
0504 }
0505 }
0506
0507 if (in_range)
0508 {
0509 ret=EXTRUE;
0510 if (range->flags & NDRX_DDR_FLAG_DEFAULT_GRP)
0511 {
0512 NDRX_LOG(log_debug, "Default group matched");
0513 is_default=EXTRUE;
0514 }
0515 else
0516 {
0517
0518 NDRX_STRCPY_SAFE(grp, range->grp);
0519 NDRX_LOG(log_debug, "Group [%s] matched", grp);
0520 }
0521 break;
0522 }
0523
0524
0525 offset_step+=range->len;
0526 }
0527
0528 chk_step+=ccrit->len;
0529
0530
0531 if (EXTRUE!=ret)
0532 {
0533 assert(chk_step==offset_step);
0534 }
0535 }
0536 else
0537 {
0538
0539
0540
0541 offset_step+=ccrit->len;
0542 }
0543
0544
0545 } while (svc->offset + offset_step + sizeof(ndrx_routcrit_t) < G_atmi_env.rtcrtmax && EXSUCCEED==ret);
0546
0547
0548 DDR_SHM_VALIDATE;
0549
0550
0551
0552
0553
0554 if (EXTRUE==ret && (!is_default))
0555 {
0556
0557
0558
0559 len_new = strlen(svcnm) + strlen(grp) + 2;
0560
0561 if (len_new > svcnmsz)
0562 {
0563 NDRX_LOG(log_error, "Cannot route [%s] - routed service "
0564 "name too long incl 0x00: %d (max: %d)",
0565 svcnm, len_new, svcnmsz);
0566 userlog("Cannot route [%s] - routed service "
0567 "name too long incl 0x00: %d (max: %d)",
0568 svcnm, len_new, svcnmsz);
0569 ndrx_TPset_error_fmt(TPESYSTEM, "Cannot route [%s] - routed service "
0570 "name too long incl 0x00: %d (max: %d)",
0571 svcnm, len_new, svcnmsz);
0572 EXFAIL_OUT(ret);
0573 }
0574 NDRX_STRCAT_S(svcnm, svcnmsz, NDRX_SYS_SVC_PFX);
0575 NDRX_STRCAT_S(svcnm, svcnmsz, grp);
0576 }
0577
0578
0579 out_rej:
0580
0581
0582
0583
0584
0585 if (EXSUCCEED==ret && had_type_match)
0586 {
0587 NDRX_LOG(log_error, "Routing criterion for service [%s] buffer type [%s] is not found",
0588 svcnm, G_buf_descr[buf->type_id].type);
0589 userlog("Routing criterion for service [%s] buffer type [%s] is not found",
0590 svcnm, G_buf_descr[buf->type_id].type);
0591 ndrx_TPset_error_fmt(TPESYSTEM, "Routing criterion for service [%s] buffer type [%s] is not found",
0592 svcnm, G_buf_descr[buf->type_id].type);
0593 ret=EXFAIL;
0594 }
0595
0596 out:
0597
0598 if (strval_alloc && NULL!=strval)
0599 {
0600 NDRX_FREE(strval);
0601 }
0602
0603 NDRX_LOG(log_debug, "returns %d [%s]", ret, svcnm);
0604
0605 return ret;
0606 }
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616 expublic int ndrx_ddr_service_get(char *svcnm, int *autotran, unsigned long *trantime)
0617 {
0618 ndrx_services_t *svc;
0619 int ret = EXFALSE;
0620 char svcnmtmp[XATMI_SERVICE_NAME_LENGTH+1];
0621 char *p;
0622
0623
0624
0625
0626 NDRX_STRCPY_SAFE(svcnmtmp, svcnm);
0627
0628 p = strchr(svcnmtmp, NDRX_SYS_SVC_PFXC);
0629
0630 if (NULL!=p)
0631 {
0632 if (p==svcnmtmp)
0633 {
0634
0635 return EXFALSE;
0636 }
0637
0638
0639 *p = EXEOS;
0640 }
0641
0642
0643 if (!ndrx_shm_is_attached(&ndrx_G_routsvc))
0644 {
0645 goto out;
0646 }
0647
0648
0649 if (EXTRUE==(ret=ndrx_ddr_services_get(svcnmtmp, &svc)))
0650 {
0651 *autotran = svc->autotran;
0652 *trantime = svc->trantime;
0653 }
0654
0655 out:
0656 return ret;
0657 }
0658
0659
0660