ess.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:19k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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.  * *******************************************************************
  18.  * This SBA code implements the Synchronous Bandwidth Allocation
  19.  * functions described in the "FDDI Synchronous Forum Implementer's
  20.  * Agreement" dated December 1th, 1993.
  21.  * *******************************************************************
  22.  *
  23.  * PURPOSE: The purpose of this function is to control
  24.  *  synchronous allocations on a single FDDI segment.
  25.  *  Allocations are limited to the primary FDDI ring.
  26.  *  The SBM provides recovery mechanisms to recover
  27.  *  unused bandwidth also resolves T_Neg and
  28.  *  reconfiguration changes. Many of the SBM state
  29.  *  machine inputs are sourced by the underlying
  30.  *  FDDI sub-system supporting the SBA application.
  31.  *
  32.  * *******************************************************************
  33.  */
  34. #include "h/types.h"
  35. #include "h/fddi.h"
  36. #include "h/smc.h"
  37. #include "h/smt_p.h"
  38. #ifndef SLIM_SMT
  39. #ifdef ESS
  40. #ifndef lint
  41. static const char ID_sccs[] = "@(#)ess.c 1.10 96/02/23 (C) SK" ;
  42. #define LINT_USE(x)
  43. #else
  44. #define LINT_USE(x) (x)=(x)
  45. #endif
  46. #define MS2BCLK(x) ((x)*12500L)
  47. /*
  48. -------------------------------------------------------------
  49. LOCAL VARIABLES:
  50. -------------------------------------------------------------
  51. */
  52. static const u_short plist_raf_alc_res[] = { SMT_P0012, SMT_P320B, SMT_P320F,
  53. SMT_P3210, SMT_P0019, SMT_P001A,
  54. SMT_P001D, 0 } ;
  55. static const u_short plist_raf_chg_req[] = { SMT_P320B, SMT_P320F, SMT_P3210,
  56. SMT_P001A, 0 } ;
  57. static const struct fddi_addr smt_sba_da = {{0x80,0x01,0x43,0x00,0x80,0x0C}} ;
  58. static const struct fddi_addr null_addr = {{0,0,0,0,0,0}} ;
  59. /*
  60. -------------------------------------------------------------
  61. GLOBAL VARIABLES:
  62. -------------------------------------------------------------
  63. */
  64. /*
  65. -------------------------------------------------------------
  66. LOCAL FUNCTIONS:
  67. -------------------------------------------------------------
  68. */
  69. static void ess_send_response(), ess_config_fifo(),
  70. ess_send_alc_req(), ess_send_frame() ;
  71. /*
  72. -------------------------------------------------------------
  73. EXTERNAL FUNCTIONS:
  74. -------------------------------------------------------------
  75. */
  76. extern void *sm_to_para() ;
  77. extern void smt_send_frame(), smt_free_mbuf(),
  78. set_formac_tsync(), formac_reinit_tx() ;
  79. extern int smt_check_para() ;
  80. extern SMbuf *smt_get_mbuf(), *smt_build_frame() ;
  81. extern u_long smt_get_tid() ;
  82. /*
  83. -------------------------------------------------------------
  84. PUBLIC FUNCTIONS:
  85. -------------------------------------------------------------
  86. */
  87. void ess_timer_poll(), ess_para_change() ;
  88. int ess_raf_received_pack(), process_bw_alloc() ;
  89. /*
  90.  * --------------------------------------------------------------------------
  91.  * End Station Support (ESS)
  92.  * --------------------------------------------------------------------------
  93.  */
  94. /*
  95.  * evaluate the RAF frame
  96.  */
  97. int ess_raf_received_pack(smc,mb,sm,fs)
  98. struct s_smc *smc ;
  99. SMbuf *mb ;
  100. struct smt_header *sm ;
  101. int fs ;
  102. {
  103. void *p ; /* universal pointer */
  104. struct smt_p_0016 *cmd ; /* para: command for the ESS */
  105. SMbuf *db ;
  106. u_long msg_res_type ; /* recource type */
  107. u_long payload, overhead ;
  108. int local ;
  109. int i ;
  110. /*
  111.  * Message Processing Code
  112.  */
  113.  local = ((fs & L_INDICATOR) != 0) ;
  114. /*
  115.  * get the resource type
  116.  */
  117. if (!(p = (void *) sm_to_para(smc,sm,SMT_P0015))) {
  118. DB_ESS("ESS: RAF frame error, parameter type not foundn",0,0) ;
  119. return(fs) ;
  120. }
  121. msg_res_type = ((struct smt_p_0015 *)p)->res_type ;
  122. /*
  123.  * get the pointer to the ESS command
  124.  */
  125. if (!(cmd = (struct smt_p_0016 *) sm_to_para(smc,sm,SMT_P0016))) {
  126. /*
  127.  * error in frame: para ESS command was not found
  128.  */
  129.  DB_ESS("ESS: RAF frame error, parameter command not foundn",0,0);
  130.  return(fs) ;
  131. }
  132. DB_ESSN(2,"fc %x ft %xn",sm->smt_class,sm->smt_type) ;
  133. DB_ESSN(2,"ver %x tran %lxn",sm->smt_version,sm->smt_tid) ;
  134. DB_ESSN(2,"stn_id %sn",addr_to_string(&sm->smt_source),0) ;
  135. DB_ESSN(2,"infolen %x res %xn",sm->smt_len, msg_res_type) ;
  136. DB_ESSN(2,"sbacmd %xn",cmd->sba_cmd,0) ;
  137. /*
  138.  * evaluate the ESS command
  139.  */
  140. switch (cmd->sba_cmd) {
  141. /*
  142.  * Process an ESS Allocation Request
  143.  */
  144. case REQUEST_ALLOCATION :
  145. /*
  146.  * check for an RAF Request (Allocation Request)
  147.  */
  148. if (sm->smt_type == SMT_REQUEST) {
  149. /*
  150.  * process the Allocation request only if the frame is
  151.  * local and no static allocation is used
  152.  */
  153. if (!local || smc->mib.fddiESSPayload)
  154. return(fs) ;
  155. p = (void *) sm_to_para(smc,sm,SMT_P0019)  ;
  156. for (i = 0; i < 5; i++) {
  157. if (((struct smt_p_0019 *)p)->alloc_addr.a[i]) {
  158. return(fs) ;
  159. }
  160. }
  161. /*
  162.  * Note: The Application should send a LAN_LOC_FRAME.
  163.  *  The ESS do not send the Frame to the network!
  164.  */
  165. smc->ess.alloc_trans_id = sm->smt_tid ;
  166. DB_ESS("ESS: save Alloc Req Trans ID %lxn",sm->smt_tid,0);
  167. p = (void *) sm_to_para(smc,sm,SMT_P320F) ;
  168. ((struct smt_p_320f *)p)->mib_payload =
  169. smc->mib.a[PATH0].fddiPATHSbaPayload ;
  170. p = (void *) sm_to_para(smc,sm,SMT_P3210) ;
  171. ((struct smt_p_3210 *)p)->mib_overhead =
  172. smc->mib.a[PATH0].fddiPATHSbaOverhead ;
  173. sm->smt_dest = smt_sba_da ;
  174. if (smc->ess.local_sba_active)
  175. return(fs | I_INDICATOR) ;
  176. if (!(db = smt_get_mbuf(smc)))
  177. return(fs) ;
  178. db->sm_len = mb->sm_len ;
  179. db->sm_off = mb->sm_off ;
  180. memcpy(((char *)(db->sm_data+db->sm_off)),(char *)sm,
  181. (int)db->sm_len) ;
  182. dump_smt(smc,
  183. (struct smt_header *)(db->sm_data+db->sm_off),
  184. "RAF") ;
  185. smt_send_frame(smc,db,FC_SMT_INFO,0) ;
  186. return(fs) ;
  187. }
  188. /*
  189.  * The RAF frame is an Allocation Response !
  190.  * check the parameters
  191.  */
  192. if (smt_check_para(smc,sm,plist_raf_alc_res)) {
  193. DB_ESS("ESS: RAF with para problem, ignoringn",0,0) ;
  194. return(fs) ;
  195. }
  196. /*
  197.  * VERIFY THE FRAME IS WELL BUILT:
  198.  *
  199.  * 1. path index = primary ring only
  200.  * 2. resource type = sync bw only
  201.  * 3. trans action id = alloc_trans_id
  202.  * 4. reason code = success
  203.  *
  204.  * If any are violated, discard the RAF frame
  205.  */
  206. if ((((struct smt_p_320b *)sm_to_para(smc,sm,SMT_P320B))->path_index
  207. != PRIMARY_RING) ||
  208. (msg_res_type != SYNC_BW) ||
  209. (((struct smt_p_reason *)sm_to_para(smc,sm,SMT_P0012))->rdf_reason
  210. != SMT_RDF_SUCCESS) ||
  211. (sm->smt_tid != smc->ess.alloc_trans_id)) {
  212. DB_ESS("ESS: Allocation Responce not acceptedn",0,0) ;
  213. return(fs) ;
  214. }
  215. /*
  216.  * Extract message parameters
  217.  */
  218. p = (void *) sm_to_para(smc,sm,SMT_P320F) ;
  219.                 if (!p) {
  220.                         printk(KERN_ERR "ESS: sm_to_para failed");
  221.                         return fs;
  222.                 }       
  223. payload = ((struct smt_p_320f *)p)->mib_payload ;
  224. p = (void *) sm_to_para(smc,sm,SMT_P3210) ;
  225.                 if (!p) {
  226.                         printk(KERN_ERR "ESS: sm_to_para failed");
  227.                         return fs;
  228.                 }       
  229. overhead = ((struct smt_p_3210 *)p)->mib_overhead ;
  230. DB_ESSN(2,"payload= %lx overhead= %lxn",payload,overhead) ;
  231. /*
  232.  * process the bandwidth allocation
  233.  */
  234. (void)process_bw_alloc(smc,(long)payload,(long)overhead) ;
  235. return(fs) ;
  236. /* end of Process Allocation Request */
  237. /*
  238.  * Process an ESS Change Request
  239.  */
  240. case CHANGE_ALLOCATION :
  241. /*
  242.  * except only replies
  243.  */
  244. if (sm->smt_type != SMT_REQUEST) {
  245. DB_ESS("ESS: Do not process Change Responsesn",0,0) ;
  246. return(fs) ;
  247. }
  248. /*
  249.  * check the para for the Change Request
  250.  */
  251. if (smt_check_para(smc,sm,plist_raf_chg_req)) {
  252. DB_ESS("ESS: RAF with para problem, ignoringn",0,0) ;
  253. return(fs) ;
  254. }
  255. /*
  256.  * Verify the path index and resource
  257.  * type are correct. If any of
  258.  * these are false, don't process this
  259.  * change request frame.
  260.  */
  261. if ((((struct smt_p_320b *)sm_to_para(smc,sm,SMT_P320B))->path_index
  262. != PRIMARY_RING) || (msg_res_type != SYNC_BW)) {
  263. DB_ESS("ESS: RAF frame with para problem, ignoringn",0,0) ;
  264. return(fs) ;
  265. }
  266. /*
  267.  * Extract message queue parameters
  268.  */
  269. p = (void *) sm_to_para(smc,sm,SMT_P320F) ;
  270. payload = ((struct smt_p_320f *)p)->mib_payload ;
  271. p = (void *) sm_to_para(smc,sm,SMT_P3210) ;
  272. overhead = ((struct smt_p_3210 *)p)->mib_overhead ;
  273. DB_ESSN(2,"ESS: Change Request from %sn",
  274. addr_to_string(&sm->smt_source),0) ;
  275. DB_ESSN(2,"payload= %lx overhead= %lxn",payload,overhead) ;
  276. /*
  277.  * process the bandwidth allocation
  278.  */
  279. if(!process_bw_alloc(smc,(long)payload,(long)overhead))
  280. return(fs) ;
  281. /*
  282.  * send an RAF Change Reply
  283.  */
  284. ess_send_response(smc,sm,CHANGE_ALLOCATION) ;
  285. return(fs) ;
  286. /* end of Process Change Request */
  287. /*
  288.  * Process Report Response
  289.  */
  290. case REPORT_ALLOCATION :
  291. /*
  292.  * except only requests
  293.  */
  294. if (sm->smt_type != SMT_REQUEST) {
  295. DB_ESS("ESS: Do not process a Report Replyn",0,0) ;
  296. return(fs) ;
  297. }
  298. DB_ESSN(2,"ESS: Report Request from %sn",
  299. addr_to_string(&(sm->smt_source)),0) ;
  300. /*
  301.  * verify that the resource type is sync bw only
  302.  */
  303. if (msg_res_type != SYNC_BW) {
  304. DB_ESS("ESS: ignoring RAF with para problemn",0,0) ;
  305. return(fs) ;
  306. }
  307. /*
  308.  * send an RAF Change Reply
  309.  */
  310. ess_send_response(smc,sm,REPORT_ALLOCATION) ;
  311. return(fs) ;
  312. /* end of Process Report Request */
  313. default:
  314. /*
  315.  * error in frame
  316.  */
  317. DB_ESS("ESS: ignoring RAF with bad sba_cmdn",0,0) ;
  318. break ;
  319. }
  320. return(fs) ;
  321. }
  322. /*
  323.  * determines the synchronous bandwidth, set the TSYNC register and the
  324.  * mib variables SBAPayload, SBAOverhead and fddiMACT-NEG.
  325.  */
  326. int process_bw_alloc(smc,payload,overhead)
  327. struct s_smc *smc ;
  328. long payload ;
  329. long overhead ;
  330. {
  331. /*
  332.  * determine the synchronous bandwidth (sync_bw) in bytes per T-NEG,
  333.  * if the payload is greater than zero.
  334.  * For the SBAPayload and the SBAOverhead we have the following
  335.  * unite quations
  336.    *       _   _
  337.  *      |      bytes |
  338.  * SBAPayload = | 8000 ------ |
  339.  *      | s  |
  340.  *       -   -
  341.    *        _       _
  342.  *       |  bytes |
  343.  * SBAOverhead = | ------ |
  344.  *       |  T-NEG |
  345.  *        -       -
  346.    *
  347.  * T-NEG is discribed by the equation:
  348.  *
  349.  *      (-) fddiMACT-NEG
  350.  * T-NEG =     -------------------
  351.  * 12500000 1/s
  352.  *
  353.  * The number of bytes we are able to send is the payload
  354.  * plus the overhead.
  355.  *
  356.  *   bytes    T-NEG SBAPayload 8000 bytes/s
  357.  * sync_bw =  SBAOverhead ------ + -----------------------------
  358.  *       T-NEG T-NEG
  359.  *
  360.  *
  361.  *             1
  362.  * sync_bw =  SBAOverhead + ---- (-)fddiMACT-NEG * SBAPayload
  363.  *             1562
  364.  *
  365.  */
  366. /*
  367.  * set the mib attributes fddiPATHSbaOverhead, fddiPATHSbaPayload
  368.  */
  369. /* if (smt_set_obj(smc,SMT_P320F,payload,S_SET)) {
  370. DB_ESS("ESS: SMT does not accept the payload valuen",0,0) ;
  371. return(FALSE) ;
  372. }
  373. if (smt_set_obj(smc,SMT_P3210,overhead,S_SET)) {
  374. DB_ESS("ESS: SMT does not accept the overhead valuen",0,0) ;
  375. return(FALSE) ;
  376. } */
  377. /* premliminary */
  378. if (payload > MAX_PAYLOAD || overhead > 5000) {
  379. DB_ESS("ESS: payload / overhead not acceptedn",0,0) ;
  380. return(FALSE) ;
  381. }
  382. /*
  383.  * start the iterative allocation process if the payload or the overhead
  384.  * are smaller than the parsed values
  385.  */
  386. if (smc->mib.fddiESSPayload &&
  387. ((u_long)payload != smc->mib.fddiESSPayload ||
  388. (u_long)overhead != smc->mib.fddiESSOverhead)) {
  389. smc->ess.raf_act_timer_poll = TRUE ;
  390. smc->ess.timer_count = 0 ;
  391. }
  392. /*
  393.  * evulate the Payload
  394.  */
  395. if (payload) {
  396. DB_ESSN(2,"ESS: turn SMT_ST_SYNC_SERVICE bit onn",0,0) ;
  397. smc->ess.sync_bw_available = TRUE ;
  398. smc->ess.sync_bw = overhead -
  399. (long)smc->mib.m[MAC0].fddiMACT_Neg *
  400. payload / 1562 ;
  401. }
  402. else {
  403. DB_ESSN(2,"ESS: turn SMT_ST_SYNC_SERVICE bit offn",0,0) ;
  404. smc->ess.sync_bw_available = FALSE ;
  405. smc->ess.sync_bw = 0 ;
  406. overhead = 0 ;
  407. }
  408. smc->mib.a[PATH0].fddiPATHSbaPayload = payload ;
  409. smc->mib.a[PATH0].fddiPATHSbaOverhead = overhead ;
  410. DB_ESSN(2,"tsync = %lxn",smc->ess.sync_bw,0) ;
  411. ess_config_fifo(smc) ;
  412. set_formac_tsync(smc,smc->ess.sync_bw) ;
  413. return(TRUE) ;
  414. }
  415. static void ess_send_response(smc,sm,sba_cmd)
  416. struct s_smc *smc ;
  417. struct smt_header *sm ;
  418. int sba_cmd ;
  419. {
  420. struct smt_sba_chg *chg ;
  421. SMbuf *mb ;
  422. void *p ;
  423. /*
  424.  * get and initialize the responce frame
  425.  */
  426. if (sba_cmd == CHANGE_ALLOCATION) {
  427. if (!(mb=smt_build_frame(smc,SMT_RAF,SMT_REPLY,
  428. sizeof(struct smt_sba_chg))))
  429. return ;
  430. }
  431. else {
  432. if (!(mb=smt_build_frame(smc,SMT_RAF,SMT_REPLY,
  433. sizeof(struct smt_sba_rep_res))))
  434. return ;
  435. }
  436. chg = smtod(mb,struct smt_sba_chg *) ;
  437. chg->smt.smt_tid = sm->smt_tid ;
  438. chg->smt.smt_dest = sm->smt_source ;
  439. /* set P15 */
  440. chg->s_type.para.p_type = SMT_P0015 ;
  441. chg->s_type.para.p_len = sizeof(struct smt_p_0015) - PARA_LEN ;
  442. chg->s_type.res_type = SYNC_BW ;
  443. /* set P16 */
  444. chg->cmd.para.p_type = SMT_P0016 ;
  445. chg->cmd.para.p_len = sizeof(struct smt_p_0016) - PARA_LEN ;
  446. chg->cmd.sba_cmd = sba_cmd ;
  447. /* set P320B */
  448. chg->path.para.p_type = SMT_P320B ;
  449. chg->path.para.p_len = sizeof(struct smt_p_320b) - PARA_LEN ;
  450. chg->path.mib_index = SBAPATHINDEX ;
  451. chg->path.path_pad = (u_short)NULL ;
  452. chg->path.path_index = PRIMARY_RING ;
  453. /* set P320F */
  454. chg->payload.para.p_type = SMT_P320F ;
  455. chg->payload.para.p_len = sizeof(struct smt_p_320f) - PARA_LEN ;
  456. chg->payload.mib_index = SBAPATHINDEX ;
  457. chg->payload.mib_payload = smc->mib.a[PATH0].fddiPATHSbaPayload ;
  458. /* set P3210 */
  459. chg->overhead.para.p_type = SMT_P3210 ;
  460. chg->overhead.para.p_len = sizeof(struct smt_p_3210) - PARA_LEN ;
  461. chg->overhead.mib_index = SBAPATHINDEX ;
  462. chg->overhead.mib_overhead = smc->mib.a[PATH0].fddiPATHSbaOverhead ;
  463. if (sba_cmd == CHANGE_ALLOCATION) {
  464. /* set P1A */
  465. chg->cat.para.p_type = SMT_P001A ;
  466. chg->cat.para.p_len = sizeof(struct smt_p_001a) - PARA_LEN ;
  467. p = (void *) sm_to_para(smc,sm,SMT_P001A) ;
  468. chg->cat.category = ((struct smt_p_001a *)p)->category ;
  469. }
  470. dump_smt(smc,(struct smt_header *)chg,"RAF") ;
  471. ess_send_frame(smc,mb) ;
  472. }
  473. void ess_timer_poll(smc)
  474. struct s_smc *smc ;
  475. {
  476. if (!smc->ess.raf_act_timer_poll)
  477. return ;
  478. DB_ESSN(2,"ESS: timer_polln",0,0) ;
  479. smc->ess.timer_count++ ;
  480. if (smc->ess.timer_count == 10) {
  481. smc->ess.timer_count = 0 ;
  482. ess_send_alc_req(smc) ;
  483. }
  484. }
  485. static void ess_send_alc_req(smc)
  486. struct s_smc *smc ;
  487. {
  488. struct smt_sba_alc_req *req ;
  489. SMbuf *mb ;
  490. /*
  491.  * send never allocation request where the requested payload and
  492.  * overhead is zero or deallocate bandwidht when no bandwidth is
  493.  * parsed
  494.  */
  495. if (!smc->mib.fddiESSPayload) {
  496. smc->mib.fddiESSOverhead = 0 ;
  497. }
  498. else {
  499. if (!smc->mib.fddiESSOverhead)
  500. smc->mib.fddiESSOverhead = DEFAULT_OV ;
  501. }
  502. if (smc->mib.fddiESSOverhead ==
  503. smc->mib.a[PATH0].fddiPATHSbaOverhead &&
  504. smc->mib.fddiESSPayload ==
  505. smc->mib.a[PATH0].fddiPATHSbaPayload){
  506. smc->ess.raf_act_timer_poll = FALSE ;
  507. smc->ess.timer_count = 7 ; /* next RAF alc req after 3 s */
  508. return ;
  509. }
  510. /*
  511.  * get and initialize the responce frame
  512.  */
  513. if (!(mb=smt_build_frame(smc,SMT_RAF,SMT_REQUEST,
  514. sizeof(struct smt_sba_alc_req))))
  515. return ;
  516. req = smtod(mb,struct smt_sba_alc_req *) ;
  517. req->smt.smt_tid = smc->ess.alloc_trans_id = smt_get_tid(smc) ;
  518. req->smt.smt_dest = smt_sba_da ;
  519. /* set P15 */
  520. req->s_type.para.p_type = SMT_P0015 ;
  521. req->s_type.para.p_len = sizeof(struct smt_p_0015) - PARA_LEN ;
  522. req->s_type.res_type = SYNC_BW ;
  523. /* set P16 */
  524. req->cmd.para.p_type = SMT_P0016 ;
  525. req->cmd.para.p_len = sizeof(struct smt_p_0016) - PARA_LEN ;
  526. req->cmd.sba_cmd = REQUEST_ALLOCATION ;
  527. /*
  528.  * set the parameter type and parameter lenght of all used
  529.  * parameters
  530.  */
  531. /* set P320B */
  532. req->path.para.p_type = SMT_P320B ;
  533. req->path.para.p_len = sizeof(struct smt_p_320b) - PARA_LEN ;
  534. req->path.mib_index = SBAPATHINDEX ;
  535. req->path.path_pad = (u_short)NULL ;
  536. req->path.path_index = PRIMARY_RING ;
  537. /* set P0017 */
  538. req->pl_req.para.p_type = SMT_P0017 ;
  539. req->pl_req.para.p_len = sizeof(struct smt_p_0017) - PARA_LEN ;
  540. req->pl_req.sba_pl_req = smc->mib.fddiESSPayload -
  541. smc->mib.a[PATH0].fddiPATHSbaPayload ;
  542. /* set P0018 */
  543. req->ov_req.para.p_type = SMT_P0018 ;
  544. req->ov_req.para.p_len = sizeof(struct smt_p_0018) - PARA_LEN ;
  545. req->ov_req.sba_ov_req = smc->mib.fddiESSOverhead -
  546. smc->mib.a[PATH0].fddiPATHSbaOverhead ;
  547. /* set P320F */
  548. req->payload.para.p_type = SMT_P320F ;
  549. req->payload.para.p_len = sizeof(struct smt_p_320f) - PARA_LEN ;
  550. req->payload.mib_index = SBAPATHINDEX ;
  551. req->payload.mib_payload = smc->mib.a[PATH0].fddiPATHSbaPayload ;
  552. /* set P3210 */
  553. req->overhead.para.p_type = SMT_P3210 ;
  554. req->overhead.para.p_len = sizeof(struct smt_p_3210) - PARA_LEN ;
  555. req->overhead.mib_index = SBAPATHINDEX ;
  556. req->overhead.mib_overhead = smc->mib.a[PATH0].fddiPATHSbaOverhead ;
  557. /* set P19 */
  558. req->a_addr.para.p_type = SMT_P0019 ;
  559. req->a_addr.para.p_len = sizeof(struct smt_p_0019) - PARA_LEN ;
  560. req->a_addr.sba_pad = (u_short)NULL ;
  561. req->a_addr.alloc_addr = null_addr ;
  562. /* set P1A */
  563. req->cat.para.p_type = SMT_P001A ;
  564. req->cat.para.p_len = sizeof(struct smt_p_001a) - PARA_LEN ;
  565. req->cat.category = smc->mib.fddiESSCategory ;
  566. /* set P1B */
  567. req->tneg.para.p_type = SMT_P001B ;
  568. req->tneg.para.p_len = sizeof(struct smt_p_001b) - PARA_LEN ;
  569. req->tneg.max_t_neg = smc->mib.fddiESSMaxTNeg ;
  570. /* set P1C */
  571. req->segm.para.p_type = SMT_P001C ;
  572. req->segm.para.p_len = sizeof(struct smt_p_001c) - PARA_LEN ;
  573. req->segm.min_seg_siz = smc->mib.fddiESSMinSegmentSize ;
  574. dump_smt(smc,(struct smt_header *)req,"RAF") ;
  575. ess_send_frame(smc,mb) ;
  576. }
  577. static void ess_send_frame(smc,mb)
  578. struct s_smc *smc ;
  579. SMbuf *mb ;
  580. {
  581. /*
  582.  * check if the frame must be send to the own ESS
  583.  */
  584. if (smc->ess.local_sba_active) {
  585. /*
  586.  * Send the Change Reply to the local SBA
  587.  */
  588. DB_ESS("ESS:Send to the local SBAn",0,0) ;
  589. if (!smc->ess.sba_reply_pend)
  590. smc->ess.sba_reply_pend = mb ;
  591. else {
  592. DB_ESS("Frame is lost - another frame was pendingn",0,0);
  593. smt_free_mbuf(smc,mb) ;
  594. }
  595. }
  596. else {
  597. /*
  598.  * Send the SBA RAF Change Reply to the network
  599.  */
  600. DB_ESS("ESS:Send to the networkn",0,0) ;
  601. smt_send_frame(smc,mb,FC_SMT_INFO,0) ;
  602. }
  603. }
  604. void ess_para_change(smc)
  605. struct s_smc *smc ;
  606. {
  607. (void)process_bw_alloc(smc,(long)smc->mib.a[PATH0].fddiPATHSbaPayload,
  608. (long)smc->mib.a[PATH0].fddiPATHSbaOverhead) ;
  609. }
  610. static void ess_config_fifo(smc)
  611. struct s_smc *smc ;
  612. {
  613. /*
  614.  * if nothing to do exit 
  615.  */
  616. if (smc->mib.a[PATH0].fddiPATHSbaPayload) {
  617. if (smc->hw.fp.fifo.fifo_config_mode & SYNC_TRAFFIC_ON &&
  618. (smc->hw.fp.fifo.fifo_config_mode&SEND_ASYNC_AS_SYNC) ==
  619. smc->mib.fddiESSSynchTxMode) {
  620. return ;
  621. }
  622. }
  623. else {
  624. if (!(smc->hw.fp.fifo.fifo_config_mode & SYNC_TRAFFIC_ON)) {
  625. return ;
  626. }
  627. }
  628. /*
  629.  * split up the FIFO and reinitialize the queues
  630.  */
  631. formac_reinit_tx(smc) ;
  632. }
  633. #endif /* ESS */
  634. #endif /* no SLIM_SMT */