smtparse.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. /******************************************************************************
  2. *
  3. * (C)Copyright 1998,1999 SysKonnect,
  4. * a business unit of Schneider & Koch & Co. Datensysteme GmbH.
  5. *
  6. * See the file "skfddi.c" for further information.
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * The information in this file is provided "AS IS" without warranty.
  14. *
  15. ******************************************************************************/
  16. /*
  17. parser for SMT parameters
  18. */
  19. #include "h/types.h"
  20. #include "h/fddi.h"
  21. #include "h/smc.h"
  22. #include "h/smt_p.h"
  23. #define KERNEL
  24. #include "h/smtstate.h"
  25. #ifndef lint
  26. static const char ID_sccs[] = "@(#)smtparse.c 1.12 98/10/06 (C) SK " ;
  27. #endif
  28. #ifdef sun
  29. #define _far
  30. #endif
  31. /*
  32. * convert to BCLK units
  33. */
  34. #define MS2BCLK(x) ((x)*12500L)
  35. #define US2BCLK(x) ((x/10)*125L)
  36. /*
  37. * parameter table
  38. */
  39. static struct s_ptab {
  40. char *pt_name ;
  41. u_short pt_num ;
  42. u_short pt_type ;
  43. u_long pt_min ;
  44. u_long pt_max ;
  45. } ptab[] = {
  46. { "PMFPASSWD",0, 0 } ,
  47. { "USERDATA",1, 0 } ,
  48. { "LERCUTOFFA",2, 1, 4, 15 } ,
  49. { "LERCUTOFFB",3, 1, 4, 15 } ,
  50. { "LERALARMA",4, 1, 4, 15 } ,
  51. { "LERALARMB",5, 1, 4, 15 } ,
  52. { "TMAX",6, 1, 5, 165 } ,
  53. { "TMIN",7, 1, 5, 165 } ,
  54. { "TREQ",8, 1, 5, 165 } ,
  55. { "TVX",9, 1, 2500, 10000 } ,
  56. #ifdef ESS
  57. { "SBAPAYLOAD",10, 1, 0, 1562 } ,
  58. { "SBAOVERHEAD",11, 1, 50, 5000 } ,
  59. { "MAXTNEG",12, 1, 5, 165 } ,
  60. { "MINSEGMENTSIZE",13, 1, 0, 4478 } ,
  61. { "SBACATEGORY",14, 1, 0, 0xffff } ,
  62. { "SYNCHTXMODE",15, 0 } ,
  63. #endif
  64. #ifdef SBA
  65. { "SBACOMMAND",16, 0 } ,
  66. { "SBAAVAILABLE",17, 1, 0, 100 } ,
  67. #endif
  68. { NULL }
  69. } ;
  70. /* Define maximum string size for values and keybuffer */
  71. #define MAX_VAL 40
  72. /*
  73. * local function declarations
  74. */
  75. static u_long parse_num(int type, char _far *value, char *v, u_long mn,
  76. u_long mx, int scale);
  77. static int parse_word(char *buf, char _far *text);
  78. #ifdef SIM
  79. #define DB_MAIN(a,b,c) printf(a,b,c)
  80. #else
  81. #define DB_MAIN(a,b,c)
  82. #endif
  83. /*
  84. * BEGIN_MANUAL_ENTRY()
  85. *
  86. * int smt_parse_arg(struct s_smc *,char _far *keyword,int type,
  87. char _far *value)
  88. *
  89. * parse SMT parameter
  90. * *keyword
  91. * pointer to keyword, must be \0, \n or \r terminated
  92. * *value pointer to value, either char * or u_long *
  93. * if char *
  94. * pointer to value, must be \0, \n or \r terminated
  95. * if u_long *
  96. * contains binary value
  97. *
  98. * type 0: integer
  99. * 1: string
  100. * return
  101. * 0 parameter parsed ok
  102. * != 0 error
  103. * NOTE:
  104. * function can be called with DS != SS
  105. *
  106. *
  107. * END_MANUAL_ENTRY()
  108. */
  109. int smt_parse_arg(struct s_smc *smc, char _far *keyword, int type,
  110. char _far *value)
  111. {
  112. char keybuf[MAX_VAL+1];
  113. char valbuf[MAX_VAL+1];
  114. char c ;
  115. char *p ;
  116. char *v ;
  117. char *d ;
  118. u_long val = 0 ;
  119. struct s_ptab *pt ;
  120. int st ;
  121. int i ;
  122. /*
  123. * parse keyword
  124. */
  125. if ((st = parse_word(keybuf,keyword)))
  126. return(st) ;
  127. /*
  128. * parse value if given as string
  129. */
  130. if (type == 1) {
  131. if ((st = parse_word(valbuf,value)))
  132. return(st) ;
  133. }
  134. /*
  135. * search in table
  136. */
  137. st = 0 ;
  138. for (pt = ptab ; (v = pt->pt_name) ; pt++) {
  139. for (p = keybuf ; (c = *p) ; p++,v++) {
  140. if (c != *v)
  141. break ;
  142. }
  143. if (!c && !*v)
  144. break ;
  145. }
  146. if (!v)
  147. return(-1) ;
  148. #if 0
  149. printf("=>%s<==>%s<=\n",pt->pt_name,valbuf) ;
  150. #endif
  151. /*
  152. * set value in MIB
  153. */
  154. if (pt->pt_type)
  155. val = parse_num(type,value,valbuf,pt->pt_min,pt->pt_max,1) ;
  156. switch (pt->pt_num) {
  157. case 0 :
  158. v = valbuf ;
  159. d = (char *) smc->mib.fddiPRPMFPasswd ;
  160. for (i = 0 ; i < (signed)sizeof(smc->mib.fddiPRPMFPasswd) ; i++)
  161. *d++ = *v++ ;
  162. DB_MAIN("SET %s = %s\n",pt->pt_name,smc->mib.fddiPRPMFPasswd) ;
  163. break ;
  164. case 1 :
  165. v = valbuf ;
  166. d = (char *) smc->mib.fddiSMTUserData ;
  167. for (i = 0 ; i < (signed)sizeof(smc->mib.fddiSMTUserData) ; i++)
  168. *d++ = *v++ ;
  169. DB_MAIN("SET %s = %s\n",pt->pt_name,smc->mib.fddiSMTUserData) ;
  170. break ;
  171. case 2 :
  172. smc->mib.p[PA].fddiPORTLer_Cutoff = (u_char) val ;
  173. DB_MAIN("SET %s = %d\n",
  174. pt->pt_name,smc->mib.p[PA].fddiPORTLer_Cutoff) ;
  175. break ;
  176. case 3 :
  177. smc->mib.p[PB].fddiPORTLer_Cutoff = (u_char) val ;
  178. DB_MAIN("SET %s = %d\n",
  179. pt->pt_name,smc->mib.p[PB].fddiPORTLer_Cutoff) ;
  180. break ;
  181. case 4 :
  182. smc->mib.p[PA].fddiPORTLer_Alarm = (u_char) val ;
  183. DB_MAIN("SET %s = %d\n",
  184. pt->pt_name,smc->mib.p[PA].fddiPORTLer_Alarm) ;
  185. break ;
  186. case 5 :
  187. smc->mib.p[PB].fddiPORTLer_Alarm = (u_char) val ;
  188. DB_MAIN("SET %s = %d\n",
  189. pt->pt_name,smc->mib.p[PB].fddiPORTLer_Alarm) ;
  190. break ;
  191. case 6 : /* TMAX */
  192. DB_MAIN("SET %s = %d\n",pt->pt_name,val) ;
  193. smc->mib.a[PATH0].fddiPATHT_MaxLowerBound =
  194. (u_long) -MS2BCLK((long)val) ;
  195. break ;
  196. case 7 : /* TMIN */
  197. DB_MAIN("SET %s = %d\n",pt->pt_name,val) ;
  198. smc->mib.m[MAC0].fddiMACT_Min =
  199. (u_long) -MS2BCLK((long)val) ;
  200. break ;
  201. case 8 : /* TREQ */
  202. DB_MAIN("SET %s = %d\n",pt->pt_name,val) ;
  203. smc->mib.a[PATH0].fddiPATHMaxT_Req =
  204. (u_long) -MS2BCLK((long)val) ;
  205. break ;
  206. case 9 : /* TVX */
  207. DB_MAIN("SET %s = %d \n",pt->pt_name,val) ;
  208. smc->mib.a[PATH0].fddiPATHTVXLowerBound =
  209. (u_long) -US2BCLK((long)val) ;
  210. break ;
  211. #ifdef ESS
  212. case 10 : /* SBAPAYLOAD */
  213. DB_MAIN("SET %s = %d\n",pt->pt_name,val) ;
  214. if (smc->mib.fddiESSPayload != val) {
  215. smc->ess.raf_act_timer_poll = TRUE ;
  216. smc->mib.fddiESSPayload = val ;
  217. }
  218. break ;
  219. case 11 : /* SBAOVERHEAD */
  220. DB_MAIN("SET %s = %d\n",pt->pt_name,val) ;
  221. smc->mib.fddiESSOverhead = val ;
  222. break ;
  223. case 12 : /* MAXTNEG */
  224. DB_MAIN("SET %s = %d\n",pt->pt_name,val) ;
  225. smc->mib.fddiESSMaxTNeg = (u_long) -MS2BCLK((long)val) ;
  226. break ;
  227. case 13 : /* MINSEGMENTSIZE */
  228. DB_MAIN("SET %s = %d\n",pt->pt_name,val) ;
  229. smc->mib.fddiESSMinSegmentSize = val ;
  230. break ;
  231. case 14 : /* SBACATEGORY */
  232. DB_MAIN("SET %s = %d\n",pt->pt_name,val) ;
  233. smc->mib.fddiESSCategory =
  234. (smc->mib.fddiESSCategory & 0xffff) |
  235. ((u_long)(val << 16)) ;
  236. break ;
  237. case 15 : /* SYNCHTXMODE */
  238. /* do not use memcmp(valbuf,"ALL",3) because DS != SS */
  239. if (valbuf[0] == 'A' && valbuf[1] == 'L' && valbuf[2] == 'L') {
  240. smc->mib.fddiESSSynchTxMode = TRUE ;
  241. DB_MAIN("SET %s = %s\n",pt->pt_name,valbuf) ;
  242. }
  243. /* if (!memcmp(valbuf,"SPLIT",5)) { */
  244. if (valbuf[0] == 'S' && valbuf[1] == 'P' && valbuf[2] == 'L' &&
  245. valbuf[3] == 'I' && valbuf[4] == 'T') {
  246. DB_MAIN("SET %s = %s\n",pt->pt_name,valbuf) ;
  247. smc->mib.fddiESSSynchTxMode = FALSE ;
  248. }
  249. break ;
  250. #endif
  251. #ifdef SBA
  252. case 16 : /* SBACOMMAND */
  253. /* if (!memcmp(valbuf,"START",5)) { */
  254. if (valbuf[0] == 'S' && valbuf[1] == 'T' && valbuf[2] == 'A' &&
  255. valbuf[3] == 'R' && valbuf[4] == 'T') {
  256. DB_MAIN("SET %s = %s\n",pt->pt_name,valbuf) ;
  257. smc->mib.fddiSBACommand = SB_START ;
  258. }
  259. /* if (!memcmp(valbuf,"STOP",4)) { */
  260. if (valbuf[0] == 'S' && valbuf[1] == 'T' && valbuf[2] == 'O' &&
  261. valbuf[3] == 'P') {
  262. DB_MAIN("SET %s = %s\n",pt->pt_name,valbuf) ;
  263. smc->mib.fddiSBACommand = SB_STOP ;
  264. }
  265. break ;
  266. case 17 : /* SBAAVAILABLE */
  267. DB_MAIN("SET %s = %d\n",pt->pt_name,val) ;
  268. smc->mib.fddiSBAAvailable = (u_char) val ;
  269. break ;
  270. #endif
  271. }
  272. return(0) ;
  273. }
  274. static int parse_word(char *buf, char _far *text)
  275. {
  276. char c ;
  277. char *p ;
  278. int p_len ;
  279. int quote ;
  280. int i ;
  281. int ok ;
  282. /*
  283. * skip leading white space
  284. */
  285. p = buf ;
  286. for (i = 0 ; i < MAX_VAL ; i++)
  287. *p++ = 0 ;
  288. p = buf ;
  289. p_len = 0 ;
  290. ok = 0 ;
  291. while ( (c = *text++) && (c != '\n') && (c != '\r')) {
  292. if ((c != ' ') && (c != '\t')) {
  293. ok = 1 ;
  294. break ;
  295. }
  296. }
  297. if (!ok)
  298. return(-1) ;
  299. if (c == '"') {
  300. quote = 1 ;
  301. }
  302. else {
  303. quote = 0 ;
  304. text-- ;
  305. }
  306. /*
  307. * parse valbuf
  308. */
  309. ok = 0 ;
  310. while (!ok && p_len < MAX_VAL-1 && (c = *text++) && (c != '\n')
  311. && (c != '\r')) {
  312. switch (quote) {
  313. case 0 :
  314. if ((c == ' ') || (c == '\t') || (c == '=')) {
  315. ok = 1 ;
  316. break ;
  317. }
  318. *p++ = c ;
  319. p_len++ ;
  320. break ;
  321. case 2 :
  322. *p++ = c ;
  323. p_len++ ;
  324. quote = 1 ;
  325. break ;
  326. case 1 :
  327. switch (c) {
  328. case '"' :
  329. ok = 1 ;
  330. break ;
  331. case '\\' :
  332. quote = 2 ;
  333. break ;
  334. default :
  335. *p++ = c ;
  336. p_len++ ;
  337. }
  338. }
  339. }
  340. *p++ = 0 ;
  341. for (p = buf ; (c = *p) ; p++) {
  342. if (c >= 'a' && c <= 'z')
  343. *p = c + 'A' - 'a' ;
  344. }
  345. return(0) ;
  346. }
  347. static u_long parse_num(int type, char _far *value, char *v, u_long mn,
  348. u_long mx, int scale)
  349. {
  350. u_long x = 0 ;
  351. char c ;
  352. if (type == 0) { /* integer */
  353. u_long _far *l ;
  354. u_long u1 ;
  355. l = (u_long _far *) value ;
  356. u1 = *l ;
  357. /*
  358. * if the value is negative take the lower limit
  359. */
  360. if ((long)u1 < 0) {
  361. if (- ((long)u1) > (long) mx) {
  362. u1 = 0 ;
  363. }
  364. else {
  365. u1 = (u_long) - ((long)u1) ;
  366. }
  367. }
  368. x = u1 ;
  369. }
  370. else { /* string */
  371. int sign = 0 ;
  372. if (*v == '-') {
  373. sign = 1 ;
  374. }
  375. while ((c = *v++) && (c >= '0') && (c <= '9')) {
  376. x = x * 10 + c - '0' ;
  377. }
  378. if (scale == 10) {
  379. x *= 10 ;
  380. if (c == '.') {
  381. if ((c = *v++) && (c >= '0') && (c <= '9')) {
  382. x += c - '0' ;
  383. }
  384. }
  385. }
  386. if (sign)
  387. x = (u_long) - ((long)x) ;
  388. }
  389. /*
  390. * if the value is negative
  391. * and the absolute value is outside the limits
  392. * take the lower limit
  393. * else
  394. * take the absoute value
  395. */
  396. if ((long)x < 0) {
  397. if (- ((long)x) > (long) mx) {
  398. x = 0 ;
  399. }
  400. else {
  401. x = (u_long) - ((long)x) ;
  402. }
  403. }
  404. if (x < mn)
  405. return(mn) ;
  406. else if (x > mx)
  407. return(mx) ;
  408. return(x) ;
  409. }
  410. #if 0
  411. struct s_smc SMC ;
  412. main()
  413. {
  414. char *p ;
  415. char *v ;
  416. char buf[100] ;
  417. int toggle = 0 ;
  418. while (gets(buf)) {
  419. p = buf ;
  420. while (*p && ((*p == ' ') || (*p == '\t')))
  421. p++ ;
  422. while (*p && ((*p != ' ') && (*p != '\t')))
  423. p++ ;
  424. v = p ;
  425. while (*v && ((*v == ' ') || (*v == '\t')))
  426. v++ ;
  427. if ((*v >= '0') && (*v <= '9')) {
  428. toggle = !toggle ;
  429. if (toggle) {
  430. u_long l ;
  431. l = atol(v) ;
  432. smt_parse_arg(&SMC,buf,0,(char _far *)&l) ;
  433. }
  434. else
  435. smt_parse_arg(&SMC,buf,1,(char _far *)p) ;
  436. }
  437. else {
  438. smt_parse_arg(&SMC,buf,1,(char _far *)p) ;
  439. }
  440. }
  441. exit(0) ;
  442. }
  443. #endif