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