URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
Compare Revisions
- This comparison shows the changes necessary to convert path
/or1k/trunk/linux/linux-2.4/net/802
- from Rev 1275 to Rev 1765
- ↔ Reverse comparison
Rev 1275 → Rev 1765
/transit/pdutr.pre
0,0 → 1,1121
COMPILE pdutr INDEX |
; |
; Transition tables for incoming pdu events. |
; translate this thing into C with |
; awk -f ./compile.awk pdu.trans > pdutr.h |
; |
TABLE ADM |
;Transition table for the ADM state: |
; |
;frame type p bit action newstate |
;received in frame |
; |
I_CMD 0 ADM5 ADM |
I_CMD 1 ADM4 ADM |
RR_CMD 0 ADM5 ADM |
RR_CMD 1 ADM4 ADM |
RNR_CMD 0 ADM5 ADM |
RNR_CMD 1 ADM4 ADM |
REJ_CMD 0 ADM5 ADM |
REJ_CMD 1 ADM4 ADM |
DISC_CMD 0 ADM3 ADM |
DISC_CMD 1 ADM3 ADM |
SABME_CMD 0 ADM2 CONN |
SABME_CMD 1 ADM2 CONN |
I_RSP 0 ADM5 ADM |
I_RSP 1 ADM5 ADM |
RR_RSP 0 ADM5 ADM |
RR_RSP 1 ADM5 ADM |
RNR_RSP 0 ADM5 ADM |
RNR_RSP 1 ADM5 ADM |
REJ_RSP 0 ADM5 ADM |
REJ_RSP 1 ADM5 ADM |
UA_RSP 0 ADM5 ADM |
UA_RSP 1 ADM5 ADM |
DM_RSP 0 ADM5 ADM |
DM_RSP 1 ADM5 ADM |
FRMR_RSP 0 ADM5 ADM |
FRMR_RSP 1 ADM5 ADM |
; |
TABLE CONN |
; |
;Transition table for the CONN state: |
; |
;frame type action newstate |
;received |
; |
I_CMD CONN5 CONN |
RR_CMD CONN5 CONN |
RNR_CMD CONN5 CONN |
REJ_CMD CONN5 CONN |
DISC_CMD CONN5 CONN |
SABME_CMD CONN3 CONN |
I_RSP CONN5 CONN |
RR_RSP CONN5 CONN |
RNR_RSP CONN5 CONN |
REJ_RSP CONN5 CONN |
UA_RSP CONN5 CONN |
DM_RSP CONN4 ADM |
FRMR_RSP CONN5 CONN |
; |
TABLE RESET_WAIT |
;Transition table for the RESET_WAIT |
; |
;frame type action newstate |
;received |
; |
I_CMD RESWAIT8 RESET_WAIT |
RR_CMD RESWAIT8 RESET_WAIT |
RNR_CMD RESWAIT8 RESET_WAIT |
REJ_CMD RESWAIT8 RESET_WAIT |
DISC_CMD RESWAIT7 RESET_WAIT |
SABME_CMD RESWAIT6 RESET_WAIT |
I_RSP RESWAIT8 RESET_WAIT |
RR_RSP RESWAIT8 RESET_WAIT |
RNR_RSP RESWAIT8 RESET_WAIT |
REJ_RSP RESWAIT8 RESET_WAIT |
UA_RSP RESWAIT8 RESET_WAIT |
DM_RSP RESWAIT5 ADM |
FRMR_RSP RESWAIT8 RESET_WAIT |
; |
; |
TABLE RESET_CHECK |
;Transition table for the RESET_CHECK state |
; |
;frame type action newstate |
;received |
; |
I_CMD RESCHK6 RESET_CHECK |
RR_CMD RESCHK6 RESET_CHECK |
RNR_CMD RESCHK6 RESET_CHECK |
REJ_CMD RESCHK6 RESET_CHECK |
DISC_CMD RESCHK5 ADM |
SABME_CMD RESCHK4 RESET_CHECK |
I_RSP RESCHK6 RESET_CHECK |
RR_RSP RESCHK6 RESET_CHECK |
RNR_RSP RESCHK6 RESET_CHECK |
REJ_RSP RESCHK6 RESET_CHECK |
UA_RSP RESCHK6 RESET_CHECK |
DM_RSP RESCHK3 ADM |
FRMR_RSP RESCHK6 RESET_CHECK |
; |
; |
TABLE SETUP |
;Transition table for the SETUP state |
; |
;frame type p flag action newstate |
;received = f |
; |
I_CMD 0 SETUP6 SETUP |
I_CMD 1 SETUP6 SETUP |
RR_CMD 0 SETUP6 SETUP |
RR_CMD 1 SETUP6 SETUP |
RNR_CMD 0 SETUP6 SETUP |
RNR_CMD 1 SETUP6 SETUP |
REJ_CMD 0 SETUP6 SETUP |
REJ_CMD 1 SETUP6 SETUP |
DISC_CMD 0 SETUP4 ADM |
DISC_CMD 1 SETUP4 ADM |
SABME_CMD 0 SETUP1 SETUP |
SABME_CMD 1 SETUP1 SETUP |
I_RSP 0 SETUP6 SETUP |
I_RSP 1 SETUP6 SETUP |
RR_RSP 0 SETUP6 SETUP |
RR_RSP 1 SETUP6 SETUP |
RNR_RSP 0 SETUP6 SETUP |
RNR_RSP 1 SETUP6 SETUP |
REJ_RSP 0 SETUP6 SETUP |
REJ_RSP 1 SETUP6 SETUP |
UA_RSP 0 SETUP6 SETUP |
UA_RSP 1 SETUP2 NORMAL |
DM_RSP 0 SETUP5 ADM |
DM_RSP 1 SETUP5 ADM |
FRMR_RSP 0 SETUP6 SETUP |
FRMR_RSP 1 SETUP6 SETUP |
; |
; |
TABLE RESET |
;Transition table for the RESET state: |
; |
;frame type p flag action newstate |
;received = f |
; |
I_CMD 0 RESET6 RESET |
I_CMD 1 RESET6 RESET |
RR_CMD 0 RESET6 RESET |
RR_CMD 1 RESET6 RESET |
RNR_CMD 0 RESET6 RESET |
RNR_CMD 1 RESET6 RESET |
REJ_CMD 0 RESET6 RESET |
REJ_CMD 1 RESET6 RESET |
DISC_CMD 0 RESET4 ADM |
DISC_CMD 1 RESET4 ADM |
SABME_CMD 0 RESET1 RESET |
SABME_CMD 1 RESET1 RESET |
I_RSP 0 RESET6 RESET |
I_RSP 1 RESET6 RESET |
RR_RSP 0 RESET6 RESET |
RR_RSP 1 RESET6 RESET |
RNR_RSP 0 RESET6 RESET |
RNR_RSP 1 RESET6 RESET |
REJ_RSP 0 RESET6 RESET |
REJ_RSP 1 RESET6 RESET |
UA_RSP 0 RESET6 RESET |
UA_RSP 1 RESET2 NORMAL |
DM_RSP 0 RESET5 ADM |
DM_RSP 1 RESET5 ADM |
FRMR_RSP 0 RESET6 RESET |
FRMR_RSP 1 RESET6 RESET |
; |
; |
TABLE D_CONN |
;Transition table for the D_CONN state: |
; |
;frame type p bit action newstate |
;received in frame |
I_CMD 0 D_CONN5 D_CONN |
I_CMD 1 D_CONN5 D_CONN |
RR_CMD 0 D_CONN5 D_CONN |
RR_CMD 1 D_CONN5 D_CONN |
RNR_CMD 0 D_CONN5 D_CONN |
RNR_CMD 1 D_CONN5 D_CONN |
REJ_CMD 0 D_CONN5 D_CONN |
REJ_CMD 1 D_CONN5 D_CONN |
DISC_CMD 0 D_CONN3 D_CONN |
DISC_CMD 1 D_CONN3 D_CONN |
SABME_CMD 0 D_CONN1 ADM |
SABME_CMD 1 D_CONN1 ADM |
I_RSP 0 D_CONN5 D_CONN |
I_RSP 1 D_CONN5 D_CONN |
RR_RSP 0 D_CONN5 D_CONN |
RR_RSP 1 D_CONN5 D_CONN |
RNR_RSP 0 D_CONN5 D_CONN |
RNR_RSP 1 D_CONN5 D_CONN |
REJ_RSP 0 D_CONN5 D_CONN |
REJ_RSP 1 D_CONN5 D_CONN |
UA_RSP 0 D_CONN5 D_CONN |
UA_RSP 1 D_CONN4 ADM |
DM_RSP 0 D_CONN4 ADM |
DM_RSP 1 D_CONN5 ADM |
FRMR_RSP 0 D_CONN5 D_CONN |
FRMR_RSP 1 D_CONN5 D_CONN |
; |
; |
TABLE ERROR |
;Transition table for the ERROR state: |
; |
;frame type action newstate |
;received |
; |
I_CMD ERR5 ERROR |
RR_CMD ERR5 ERROR |
RNR_CMD ERR5 ERROR |
REJ_CMD ERR5 ERROR |
DISC_CMD ERR2 ADM |
SABME_CMD ERR1 RESET_CHECK |
I_RSP ERR6 ERROR |
RR_RSP ERR6 ERROR |
RNR_RSP ERR6 ERROR |
REJ_RSP ERR6 ERROR |
UA_RSP ERR6 ERROR |
DM_RSP ERR3 ADM |
FRMR_RSP ERR4 RESET_WAIT |
; |
TABLE NORMAL |
;Transition table for the NORMAL state: |
; |
;frame type uexpect p bit p_flag |
;received N(S) in frame |
; |
I_CMD 0 0 0 NORMAL8B NORMAL |
I_CMD 0 0 1 NORMAL9 NORMAL |
I_CMD 0 1 0 NORMAL10 NORMAL |
I_CMD 0 1 1 NORMAL10 NORMAL |
I_CMD 1 0 0 NORMAL5 REJECT |
I_CMD 1 0 1 NORMAL6 REJECT |
I_CMD 1 1 0 NORMAL7 REJECT |
I_CMD 1 1 1 NORMAL7 REJECT |
RR_CMD 0 0 0 NORMAL11 NORMAL |
RR_CMD 0 0 1 NORMAL11 NORMAL |
RR_CMD 0 1 0 NORMAL12 NORMAL |
RR_CMD 0 1 1 NORMAL12 NORMAL |
RR_CMD 1 0 0 NORMAL11 NORMAL |
RR_CMD 1 0 1 NORMAL11 NORMAL |
RR_CMD 1 1 0 NORMAL12 NORMAL |
RR_CMD 1 1 1 NORMAL12 NORMAL |
RNR_CMD 0 0 0 NORMAL13 NORMAL |
RNR_CMD 0 0 1 NORMAL13 NORMAL |
RNR_CMD 0 1 0 NORMAL14 NORMAL |
RNR_CMD 0 1 1 NORMAL14 NORMAL |
RNR_CMD 1 0 0 NORMAL13 NORMAL |
RNR_CMD 1 0 1 NORMAL13 NORMAL |
RNR_CMD 1 1 0 NORMAL14 NORMAL |
RNR_CMD 1 1 1 NORMAL14 NORMAL |
REJ_CMD 0 0 0 NORMAL15 NORMAL |
REJ_CMD 0 0 1 NORMAL16 NORMAL |
REJ_CMD 0 1 0 NORMAL17 NORMAL |
REJ_CMD 0 1 1 NORMAL17 NORMAL |
REJ_CMD 1 0 0 NORMAL15 NORMAL |
REJ_CMD 1 0 1 NORMAL16 NORMAL |
REJ_CMD 1 1 0 NORMAL17 NORMAL |
REJ_CMD 1 1 1 NORMAL17 NORMAL |
DISC_CMD 0 0 0 SH4 ADM |
DISC_CMD 0 0 1 SH4 ADM |
DISC_CMD 0 1 0 SH4 ADM |
DISC_CMD 0 1 1 SH4 ADM |
DISC_CMD 1 0 0 SH4 ADM |
DISC_CMD 1 0 1 SH4 ADM |
DISC_CMD 1 1 0 SH4 ADM |
DISC_CMD 1 1 1 SH4 ADM |
SABME_CMD 0 0 0 SH3 RESET_CHECK |
SABME_CMD 0 0 1 SH3 RESET_CHECK |
SABME_CMD 0 1 0 SH3 RESET_CHECK |
SABME_CMD 0 1 1 SH3 RESET_CHECK |
SABME_CMD 1 0 0 SH3 RESET_CHECK |
SABME_CMD 1 0 1 SH3 RESET_CHECK |
SABME_CMD 1 1 0 SH3 RESET_CHECK |
SABME_CMD 1 1 1 SH3 RESET_CHECK |
I_RSP 0 0 0 NORMAL8B NORMAL |
I_RSP 0 0 1 NORMAL9 NORMAL |
I_RSP 0 1 0 SH10 ERROR |
I_RSP 0 1 1 NORMAL8A NORMAL |
I_RSP 1 0 0 NORMAL5 REJECT |
I_RSP 1 0 1 NORMAL6 REJECT |
I_RSP 1 1 0 SH10 ERROR |
I_RSP 1 1 1 NORMAL5 REJECT |
RR_RSP 0 0 0 NORMAL11 NORMAL |
RR_RSP 0 0 1 NORMAL11 NORMAL |
RR_RSP 0 1 0 SH10 ERROR |
RR_RSP 0 1 1 NORMAL11 NORMAL |
RR_RSP 1 0 0 NORMAL11 NORMAL |
RR_RSP 1 0 1 NORMAL11 NORMAL |
RR_RSP 1 1 0 SH10 ERROR |
RR_RSP 1 1 1 NORMAL11 NORMAL |
RNR_RSP 0 0 0 NORMAL13 NORMAL |
RNR_RSP 0 0 1 NORMAL13 NORMAL |
RNR_RSP 0 1 0 SH10 ERROR |
RNR_RSP 0 1 1 NORMAL13 NORMAL |
RNR_RSP 1 0 0 NORMAL13 NORMAL |
RNR_RSP 1 0 1 NORMAL13 NORMAL |
RNR_RSP 1 1 0 SH10 ERROR |
RNR_RSP 1 1 1 NORMAL13 NORMAL |
REJ_RSP 0 0 0 NORMAL15 NORMAL |
REJ_RSP 0 0 1 NORMAL16 NORMAL |
REJ_RSP 0 1 0 SH10 ERROR |
REJ_RSP 0 1 1 NORMAL15 NORMAL |
REJ_RSP 1 0 0 NORMAL15 NORMAL |
REJ_RSP 1 0 1 NORMAL16 NORMAL |
REJ_RSP 1 1 0 SH10 ERROR |
REJ_RSP 1 1 1 NORMAL15 NORMAL |
UA_RSP 0 0 0 SH9 ERROR |
UA_RSP 0 0 1 SH9 ERROR |
UA_RSP 0 1 0 SH9 ERROR |
UA_RSP 0 1 1 SH9 ERROR |
UA_RSP 1 0 0 SH9 ERROR |
UA_RSP 1 0 1 SH9 ERROR |
UA_RSP 1 1 0 SH9 ERROR |
UA_RSP 1 1 1 SH9 ERROR |
DM_RSP 0 0 0 SH6 ADM |
DM_RSP 0 0 1 SH6 ADM |
DM_RSP 0 1 0 SH6 ADM |
DM_RSP 0 1 1 SH6 ADM |
DM_RSP 1 0 0 SH6 ADM |
DM_RSP 1 0 1 SH6 ADM |
DM_RSP 1 1 0 SH6 ADM |
DM_RSP 1 1 1 SH6 ADM |
FRMR_RSP 0 0 0 SH5 RESET_WAIT |
FRMR_RSP 0 0 1 SH5 RESET_WAIT |
FRMR_RSP 0 1 0 SH5 RESET_WAIT |
FRMR_RSP 0 1 1 SH5 RESET_WAIT |
FRMR_RSP 1 0 0 SH5 RESET_WAIT |
FRMR_RSP 1 0 1 SH5 RESET_WAIT |
FRMR_RSP 1 1 0 SH5 RESET_WAIT |
FRMR_RSP 1 1 1 SH5 RESET_WAIT |
BAD_FRAME 0 0 0 SH7 ERROR |
BAD_FRAME 0 0 1 SH7 ERROR |
BAD_FRAME 0 1 0 SH7 ERROR |
BAD_FRAME 0 1 1 SH7 ERROR |
BAD_FRAME 1 0 0 SH7 ERROR |
BAD_FRAME 1 0 1 SH7 ERROR |
BAD_FRAME 1 1 0 SH7 ERROR |
BAD_FRAME 1 1 1 SH7 ERROR |
; |
;112 entries in table, 8 modified by tredit4 SABME_CMD x x x SH3 RESET_CHECK |
;112 entries in table, 8 modified by tredit4 DISC_CMD x x x SH4 ADM |
;112 entries in table, 8 modified by tredit4 FRMR_RSP x x x SH5 RESET_WAIT |
;112 entries in table, 8 modified by tredit4 DM_RSP x x x SH6 ADM |
;112 entries in table, 8 modified by tredit4 BAD_FRAME x x x SH7 ERROR |
;112 entries in table, 8 modified by tredit4 UA_RSP x x x SH9 ERROR |
;112 entries in table, 8 modified by tredit4 anyrsp x 1 0 SH10 ERROR |
;112 entries in table, 1 modified by tredit4 I_CMD 1 0 0 NORMAL5 REJECT |
;112 entries in table, 1 modified by tredit4 I_RSP 1 0 0 NORMAL5 REJECT |
;112 entries in table, 1 modified by tredit4 I_RSP 1 1 1 NORMAL5 REJECT |
;112 entries in table, 1 modified by tredit4 I_CMD 1 0 1 NORMAL6 REJECT |
;112 entries in table, 1 modified by tredit4 I_RSP 1 0 1 NORMAL6 REJECT |
;112 entries in table, 2 modified by tredit4 I_CMD 1 1 x NORMAL7 REJECT |
;112 entries in table, 1 modified by tredit4 I_RSP x 1 1 NORMAL8A NORMAL |
;112 entries in table, 1 modified by tredit4 I_RSP x 0 0 NORMAL8B NORMAL |
;112 entries in table, 1 modified by tredit4 I_CMD x 0 0 NORMAL8B NORMAL |
;112 entries in table, 1 modified by tredit4 I_RSP x 0 1 NORMAL9 NORMAL |
;112 entries in table, 1 modified by tredit4 I_CMD x 0 1 NORMAL9 NORMAL |
;112 entries in table, 2 modified by tredit4 I_CMD x 1 x NORMAL10 NORMAL |
;112 entries in table, 4 modified by tredit4 RR_CMD x 0 x NORMAL11 NORMAL |
;112 entries in table, 4 modified by tredit4 RR_RSP x 0 x NORMAL11 NORMAL |
;112 entries in table, 2 modified by tredit4 RR_RSP x 1 1 NORMAL11 NORMAL |
;112 entries in table, 4 modified by tredit4 RR_CMD x 1 x NORMAL12 NORMAL |
;112 entries in table, 4 modified by tredit4 RNR_CMD x 0 x NORMAL13 NORMAL |
;112 entries in table, 4 modified by tredit4 RNR_RSP x 0 x NORMAL13 NORMAL |
;112 entries in table, 2 modified by tredit4 RNR_RSP x 1 1 NORMAL13 NORMAL |
;112 entries in table, 4 modified by tredit4 RNR_CMD x 1 x NORMAL14 NORMAL |
;112 entries in table, 2 modified by tredit4 REJ_CMD x 0 0 NORMAL15 NORMAL |
;112 entries in table, 2 modified by tredit4 REJ_RSP x 1 1 NORMAL15 NORMAL |
;112 entries in table, 2 modified by tredit4 REJ_RSP x 0 0 NORMAL15 NORMAL |
;112 entries in table, 2 modified by tredit4 REJ_CMD x 0 1 NORMAL16 NORMAL |
;112 entries in table, 2 modified by tredit4 REJ_RSP x 0 1 NORMAL16 NORMAL |
;112 entries in table, 4 modified by tredit4 REJ_CMD x 1 x NORMAL17 NORMAL |
; |
TABLE BUSY |
;Transition table for the BUSY state: |
; |
;frame type uexpect p bit p_flag |
;received N(S) in frame |
; |
I_CMD 0 0 0 BUSY13 BUSY |
I_CMD 0 0 1 BUSY14 BUSY |
I_CMD 0 1 0 BUSY12 BUSY |
I_CMD 0 1 1 BUSY12 BUSY |
I_CMD 1 0 0 BUSY9 BUSY |
I_CMD 1 0 1 BUSY10 BUSY |
I_CMD 1 1 0 BUSY11 BUSY |
I_CMD 1 1 1 BUSY11 BUSY |
RR_CMD 0 0 0 BUSY15 BUSY |
RR_CMD 0 0 1 BUSY15 BUSY |
RR_CMD 0 1 0 BUSY16 BUSY |
RR_CMD 0 1 1 BUSY16 BUSY |
RR_CMD 1 0 0 BUSY15 BUSY |
RR_CMD 1 0 1 BUSY15 BUSY |
RR_CMD 1 1 0 BUSY16 BUSY |
RR_CMD 1 1 1 BUSY16 BUSY |
RNR_CMD 0 0 0 BUSY17 BUSY |
RNR_CMD 0 0 1 BUSY17 BUSY |
RNR_CMD 0 1 0 BUSY18 BUSY |
RNR_CMD 0 1 1 BUSY18 BUSY |
RNR_CMD 1 0 0 BUSY17 BUSY |
RNR_CMD 1 0 1 BUSY17 BUSY |
RNR_CMD 1 1 0 BUSY18 BUSY |
RNR_CMD 1 1 1 BUSY18 BUSY |
REJ_CMD 0 0 0 BUSY19 BUSY |
REJ_CMD 0 0 1 BUSY20 BUSY |
REJ_CMD 0 1 0 BUSY21 BUSY |
REJ_CMD 0 1 1 BUSY21 BUSY |
REJ_CMD 1 0 0 BUSY19 BUSY |
REJ_CMD 1 0 1 BUSY20 BUSY |
REJ_CMD 1 1 0 BUSY21 BUSY |
REJ_CMD 1 1 1 BUSY21 BUSY |
DISC_CMD 0 0 0 SH4 ADM |
DISC_CMD 0 0 1 SH4 ADM |
DISC_CMD 0 1 0 SH4 ADM |
DISC_CMD 0 1 1 SH4 ADM |
DISC_CMD 1 0 0 SH4 ADM |
DISC_CMD 1 0 1 SH4 ADM |
DISC_CMD 1 1 0 SH4 ADM |
DISC_CMD 1 1 1 SH4 ADM |
SABME_CMD 0 0 0 SH3 RESET_CHECK |
SABME_CMD 0 0 1 SH3 RESET_CHECK |
SABME_CMD 0 1 0 SH3 RESET_CHECK |
SABME_CMD 0 1 1 SH3 RESET_CHECK |
SABME_CMD 1 0 0 SH3 RESET_CHECK |
SABME_CMD 1 0 1 SH3 RESET_CHECK |
SABME_CMD 1 1 0 SH3 RESET_CHECK |
SABME_CMD 1 1 1 SH3 RESET_CHECK |
I_RSP 0 0 0 BUSY13 BUSY |
I_RSP 0 0 1 BUSY14 BUSY |
I_RSP 0 1 0 SH10 ERROR |
I_RSP 0 1 1 BUSY13 BUSY |
I_RSP 1 0 0 BUSY9 BUSY |
I_RSP 1 0 1 BUSY10 BUSY |
I_RSP 1 1 0 SH10 ERROR |
I_RSP 1 1 1 BUSY9 BUSY |
RR_RSP 0 0 0 BUSY15 BUSY |
RR_RSP 0 0 1 BUSY15 BUSY |
RR_RSP 0 1 0 SH10 ERROR |
RR_RSP 0 1 1 BUSY15 BUSY |
RR_RSP 1 0 0 BUSY15 BUSY |
RR_RSP 1 0 1 BUSY15 BUSY |
RR_RSP 1 1 0 SH10 ERROR |
RR_RSP 1 1 1 BUSY15 BUSY |
RNR_RSP 0 0 0 BUSY17 BUSY |
RNR_RSP 0 0 1 BUSY17 BUSY |
RNR_RSP 0 1 0 SH10 ERROR |
RNR_RSP 0 1 1 BUSY17 BUSY |
RNR_RSP 1 0 0 BUSY17 BUSY |
RNR_RSP 1 0 1 BUSY17 BUSY |
RNR_RSP 1 1 0 SH10 ERROR |
RNR_RSP 1 1 1 BUSY17 BUSY |
REJ_RSP 0 0 0 BUSY19 BUSY |
REJ_RSP 0 0 1 BUSY20 BUSY |
REJ_RSP 0 1 0 SH10 ERROR |
REJ_RSP 0 1 1 BUSY19 BUSY |
REJ_RSP 1 0 0 BUSY19 BUSY |
REJ_RSP 1 0 1 BUSY20 BUSY |
REJ_RSP 1 1 0 SH10 ERROR |
REJ_RSP 1 1 1 BUSY19 BUSY |
UA_RSP 0 0 0 SH9 ERROR |
UA_RSP 0 0 1 SH9 ERROR |
UA_RSP 0 1 0 SH9 ERROR |
UA_RSP 0 1 1 SH9 ERROR |
UA_RSP 1 0 0 SH9 ERROR |
UA_RSP 1 0 1 SH9 ERROR |
UA_RSP 1 1 0 SH9 ERROR |
UA_RSP 1 1 1 SH9 ERROR |
DM_RSP 0 0 0 SH6 ADM |
DM_RSP 0 0 1 SH6 ADM |
DM_RSP 0 1 0 SH6 ADM |
DM_RSP 0 1 1 SH6 ADM |
DM_RSP 1 0 0 SH6 ADM |
DM_RSP 1 0 1 SH6 ADM |
DM_RSP 1 1 0 SH6 ADM |
DM_RSP 1 1 1 SH6 ADM |
FRMR_RSP 0 0 0 SH5 RESET_WAIT |
FRMR_RSP 0 0 1 SH5 RESET_WAIT |
FRMR_RSP 0 1 0 SH5 RESET_WAIT |
FRMR_RSP 0 1 1 SH5 RESET_WAIT |
FRMR_RSP 1 0 0 SH5 RESET_WAIT |
FRMR_RSP 1 0 1 SH5 RESET_WAIT |
FRMR_RSP 1 1 0 SH5 RESET_WAIT |
FRMR_RSP 1 1 1 SH5 RESET_WAIT |
BAD_FRAME 0 0 0 SH7 ERROR |
BAD_FRAME 0 0 1 SH7 ERROR |
BAD_FRAME 0 1 0 SH7 ERROR |
BAD_FRAME 0 1 1 SH7 ERROR |
BAD_FRAME 1 0 0 SH7 ERROR |
BAD_FRAME 1 0 1 SH7 ERROR |
BAD_FRAME 1 1 0 SH7 ERROR |
BAD_FRAME 1 1 1 SH7 ERROR |
; |
;112 entries in table, 8 modified by tredit4 SABME_CMD x x x SH3 RESET_CHECK |
;112 entries in table, 8 modified by tredit4 DISC_CMD x x x SH4 ADM |
;112 entries in table, 8 modified by tredit4 FRMR_RSP x x x SH5 RESET_WAIT |
;112 entries in table, 8 modified by tredit4 DM_RSP x x x SH6 ADM |
;112 entries in table, 8 modified by tredit4 BAD_FRAME x x x SH7 ERROR |
;112 entries in table, 8 modified by tredit4 UA_RSP x x x SH9 ERROR |
;112 entries in table, 8 modified by tredit4 anyrsp x 1 0 SH10 ERROR |
;112 entries in table, 1 modified by tredit4 I_RSP 1 0 0 BUSY9 BUSY |
;112 entries in table, 1 modified by tredit4 I_RSP 1 1 1 BUSY9 BUSY |
;112 entries in table, 1 modified by tredit4 I_CMD 1 0 0 BUSY9 BUSY |
;112 entries in table, 1 modified by tredit4 I_RSP 1 0 1 BUSY10 BUSY |
;112 entries in table, 1 modified by tredit4 I_CMD 1 0 1 BUSY10 BUSY |
;112 entries in table, 2 modified by tredit4 I_CMD 1 1 x BUSY11 BUSY |
;112 entries in table, 2 modified by tredit4 I_CMD x 1 x BUSY12 BUSY |
;112 entries in table, 1 modified by tredit4 I_RSP x 0 0 BUSY13 BUSY |
;112 entries in table, 1 modified by tredit4 I_RSP x 1 1 BUSY13 BUSY |
;112 entries in table, 1 modified by tredit4 I_CMD x 0 0 BUSY13 BUSY |
;112 entries in table, 1 modified by tredit4 I_RSP x 0 1 BUSY14 BUSY |
;112 entries in table, 1 modified by tredit4 I_CMD x 0 1 BUSY14 BUSY |
;112 entries in table, 4 modified by tredit4 RR_CMD x 0 x BUSY15 BUSY |
;112 entries in table, 4 modified by tredit4 RR_RSP x 0 x BUSY15 BUSY |
;112 entries in table, 2 modified by tredit4 RR_RSP x 1 1 BUSY15 BUSY |
;112 entries in table, 4 modified by tredit4 RR_CMD x 1 x BUSY16 BUSY |
;112 entries in table, 4 modified by tredit4 RNR_CMD x 0 x BUSY17 BUSY |
;112 entries in table, 4 modified by tredit4 RNR_RSP x 0 x BUSY17 BUSY |
;112 entries in table, 2 modified by tredit4 RNR_RSP x 1 1 BUSY17 BUSY |
;112 entries in table, 4 modified by tredit4 RNR_CMD x 1 x BUSY18 BUSY |
;112 entries in table, 2 modified by tredit4 REJ_CMD x 0 0 BUSY19 BUSY |
;112 entries in table, 2 modified by tredit4 REJ_RSP x 0 0 BUSY19 BUSY |
;112 entries in table, 2 modified by tredit4 REJ_RSP x 1 1 BUSY19 BUSY |
;112 entries in table, 2 modified by tredit4 REJ_CMD x 0 1 BUSY20 BUSY |
;112 entries in table, 2 modified by tredit4 REJ_RSP x 0 1 BUSY20 BUSY |
;112 entries in table, 4 modified by tredit4 REJ_CMD x 1 x BUSY21 BUSY |
; |
TABLE REJECT |
;Transition table for the REJECT state: |
; |
;frame type uexpect p bit p_flag |
;received N(S) in frame |
; |
I_CMD 0 0 0 REJECT7 REJECT |
I_CMD 0 0 1 REJECT8 REJECT |
I_CMD 0 1 0 REJECT9 REJECT |
I_CMD 0 1 1 REJECT9 REJECT |
I_CMD 1 0 0 REJECT5 REJECT |
I_CMD 1 0 1 REJECT5 REJECT |
I_CMD 1 1 0 REJECT6 REJECT |
I_CMD 1 1 1 REJECT6 REJECT |
RR_CMD 0 0 0 REJECT10 REJECT |
RR_CMD 0 0 1 REJECT10 REJECT |
RR_CMD 0 1 0 REJECT11 REJECT |
RR_CMD 0 1 1 REJECT11 REJECT |
RR_CMD 1 0 0 REJECT10 REJECT |
RR_CMD 1 0 1 REJECT10 REJECT |
RR_CMD 1 1 0 REJECT11 REJECT |
RR_CMD 1 1 1 REJECT11 REJECT |
RNR_CMD 0 0 0 REJECT12 REJECT |
RNR_CMD 0 0 1 REJECT12 REJECT |
RNR_CMD 0 1 0 REJECT13 REJECT |
RNR_CMD 0 1 1 REJECT13 REJECT |
RNR_CMD 1 0 0 REJECT12 REJECT |
RNR_CMD 1 0 1 REJECT12 REJECT |
RNR_CMD 1 1 0 REJECT13 REJECT |
RNR_CMD 1 1 1 REJECT13 REJECT |
REJ_CMD 0 0 0 REJECT14 REJECT |
REJ_CMD 0 0 1 REJECT15 REJECT |
REJ_CMD 0 1 0 REJECT16 REJECT |
REJ_CMD 0 1 1 REJECT16 REJECT |
REJ_CMD 1 0 0 REJECT14 REJECT |
REJ_CMD 1 0 1 REJECT15 REJECT |
REJ_CMD 1 1 0 REJECT16 REJECT |
REJ_CMD 1 1 1 REJECT16 REJECT |
DISC_CMD 0 0 0 SH4 ADM |
DISC_CMD 0 0 1 SH4 ADM |
DISC_CMD 0 1 0 SH4 ADM |
DISC_CMD 0 1 1 SH4 ADM |
DISC_CMD 1 0 0 SH4 ADM |
DISC_CMD 1 0 1 SH4 ADM |
DISC_CMD 1 1 0 SH4 ADM |
DISC_CMD 1 1 1 SH4 ADM |
SABME_CMD 0 0 0 SH3 RESET_CHECK |
SABME_CMD 0 0 1 SH3 RESET_CHECK |
SABME_CMD 0 1 0 SH3 RESET_CHECK |
SABME_CMD 0 1 1 SH3 RESET_CHECK |
SABME_CMD 1 0 0 SH3 RESET_CHECK |
SABME_CMD 1 0 1 SH3 RESET_CHECK |
SABME_CMD 1 1 0 SH3 RESET_CHECK |
SABME_CMD 1 1 1 SH3 RESET_CHECK |
I_RSP 0 0 0 REJECT7 REJECT |
I_RSP 0 0 1 REJECT8 REJECT |
I_RSP 0 1 0 SH10 ERROR |
I_RSP 0 1 1 REJECT7 REJECT |
I_RSP 1 0 0 REJECT5 REJECT |
I_RSP 1 0 1 REJECT5 REJECT |
I_RSP 1 1 0 SH10 ERROR |
I_RSP 1 1 1 REJECT5 REJECT |
RR_RSP 0 0 0 REJECT10 REJECT |
RR_RSP 0 0 1 REJECT10 REJECT |
RR_RSP 0 1 0 SH10 ERROR |
RR_RSP 0 1 1 REJECT10 REJECT |
RR_RSP 1 0 0 REJECT10 REJECT |
RR_RSP 1 0 1 REJECT10 REJECT |
RR_RSP 1 1 0 SH10 ERROR |
RR_RSP 1 1 1 REJECT10 REJECT |
RNR_RSP 0 0 0 REJECT12 REJECT |
RNR_RSP 0 0 1 REJECT12 REJECT |
RNR_RSP 0 1 0 SH10 ERROR |
RNR_RSP 0 1 1 REJECT12 REJECT |
RNR_RSP 1 0 0 REJECT12 REJECT |
RNR_RSP 1 0 1 REJECT12 REJECT |
RNR_RSP 1 1 0 SH10 ERROR |
RNR_RSP 1 1 1 REJECT12 REJECT |
REJ_RSP 0 0 0 REJECT14 REJECT |
REJ_RSP 0 0 1 REJECT15 REJECT |
REJ_RSP 0 1 0 SH10 ERROR |
REJ_RSP 0 1 1 REJECT14 REJECT |
REJ_RSP 1 0 0 REJECT14 REJECT |
REJ_RSP 1 0 1 REJECT15 REJECT |
REJ_RSP 1 1 0 SH10 ERROR |
REJ_RSP 1 1 1 REJECT14 REJECT |
UA_RSP 0 0 0 SH9 ERROR |
UA_RSP 0 0 1 SH9 ERROR |
UA_RSP 0 1 0 SH9 ERROR |
UA_RSP 0 1 1 SH9 ERROR |
UA_RSP 1 0 0 SH9 ERROR |
UA_RSP 1 0 1 SH9 ERROR |
UA_RSP 1 1 0 SH9 ERROR |
UA_RSP 1 1 1 SH9 ERROR |
DM_RSP 0 0 0 SH6 ADM |
DM_RSP 0 0 1 SH6 ADM |
DM_RSP 0 1 0 SH6 ADM |
DM_RSP 0 1 1 SH6 ADM |
DM_RSP 1 0 0 SH6 ADM |
DM_RSP 1 0 1 SH6 ADM |
DM_RSP 1 1 0 SH6 ADM |
DM_RSP 1 1 1 SH6 ADM |
FRMR_RSP 0 0 0 SH5 RESET_WAIT |
FRMR_RSP 0 0 1 SH5 RESET_WAIT |
FRMR_RSP 0 1 0 SH5 RESET_WAIT |
FRMR_RSP 0 1 1 SH5 RESET_WAIT |
FRMR_RSP 1 0 0 SH5 RESET_WAIT |
FRMR_RSP 1 0 1 SH5 RESET_WAIT |
FRMR_RSP 1 1 0 SH5 RESET_WAIT |
FRMR_RSP 1 1 1 SH5 RESET_WAIT |
BAD_FRAME 0 0 0 SH7 ERROR |
BAD_FRAME 0 0 1 SH7 ERROR |
BAD_FRAME 0 1 0 SH7 ERROR |
BAD_FRAME 0 1 1 SH7 ERROR |
BAD_FRAME 1 0 0 SH7 ERROR |
BAD_FRAME 1 0 1 SH7 ERROR |
BAD_FRAME 1 1 0 SH7 ERROR |
BAD_FRAME 1 1 1 SH7 ERROR |
; |
;112 entries in table, 8 modified by tredit4 SABME_CMD x x x SH3 RESET_CHECK |
;112 entries in table, 8 modified by tredit4 DISC_CMD x x x SH4 ADM |
;112 entries in table, 8 modified by tredit4 FRMR_RSP x x x SH5 RESET_WAIT |
;112 entries in table, 8 modified by tredit4 DM_RSP x x x SH6 ADM |
;112 entries in table, 8 modified by tredit4 BAD_FRAME x x x SH7 ERROR |
;112 entries in table, 8 modified by tredit4 UA_RSP x x x SH9 ERROR |
;112 entries in table, 8 modified by tredit4 anyrsp x 1 0 SH10 ERROR |
;112 entries in table, 2 modified by tredit4 I_CMD 1 0 x REJECT5 REJECT |
;112 entries in table, 2 modified by tredit4 I_RSP 1 0 x REJECT5 REJECT |
;112 entries in table, 1 modified by tredit4 I_RSP 1 1 1 REJECT5 REJECT |
;112 entries in table, 2 modified by tredit4 I_CMD 1 1 x REJECT6 REJECT |
;112 entries in table, 1 modified by tredit4 I_RSP x 1 1 REJECT7 REJECT |
;112 entries in table, 1 modified by tredit4 I_RSP x 0 0 REJECT7 REJECT |
;112 entries in table, 1 modified by tredit4 I_CMD x 0 0 REJECT7 REJECT |
;112 entries in table, 1 modified by tredit4 I_RSP x 0 1 REJECT8 REJECT |
;112 entries in table, 1 modified by tredit4 I_CMD x 0 1 REJECT8 REJECT |
;112 entries in table, 2 modified by tredit4 I_CMD x 1 x REJECT9 REJECT |
;112 entries in table, 4 modified by tredit4 RR_CMD x 0 x REJECT10 REJECT |
;112 entries in table, 4 modified by tredit4 RR_RSP x 0 x REJECT10 REJECT |
;112 entries in table, 2 modified by tredit4 RR_RSP x 1 1 REJECT10 REJECT |
;112 entries in table, 4 modified by tredit4 RR_CMD x 1 x REJECT11 REJECT |
;112 entries in table, 4 modified by tredit4 RNR_CMD x 0 x REJECT12 REJECT |
;112 entries in table, 4 modified by tredit4 RNR_RSP x 0 x REJECT12 REJECT |
;112 entries in table, 2 modified by tredit4 RNR_RSP x 1 1 REJECT12 REJECT |
;112 entries in table, 4 modified by tredit4 RNR_CMD x 1 x REJECT13 REJECT |
;112 entries in table, 2 modified by tredit4 REJ_CMD x 0 0 REJECT14 REJECT |
;112 entries in table, 2 modified by tredit4 REJ_RSP x 0 0 REJECT14 REJECT |
;112 entries in table, 2 modified by tredit4 REJ_RSP x 1 1 REJECT14 REJECT |
;112 entries in table, 2 modified by tredit4 REJ_CMD x 0 1 REJECT15 REJECT |
;112 entries in table, 2 modified by tredit4 REJ_RSP x 0 1 REJECT15 REJECT |
;112 entries in table, 4 modified by tredit4 REJ_CMD x 1 x REJECT16 REJECT |
; |
TABLE AWAIT |
;Transition table for the AWAIT state: |
; |
;frame type uexpect p bit p_flag |
;received N(S) in frame |
; |
I_CMD 0 0 0 AWAIT6 AWAIT |
I_CMD 0 0 1 AWAIT6 AWAIT |
I_CMD 0 1 0 AWAIT7 AWAIT |
I_CMD 0 1 1 AWAIT7 AWAIT |
I_CMD 1 0 0 AWAIT3 AWAIT_REJECT |
I_CMD 1 0 1 AWAIT3 AWAIT_REJECT |
I_CMD 1 1 0 AWAIT4 AWAIT_REJECT |
I_CMD 1 1 1 AWAIT4 AWAIT_REJECT |
RR_CMD 0 0 0 AWAIT9 AWAIT |
RR_CMD 0 0 1 AWAIT9 AWAIT |
RR_CMD 0 1 0 AWAIT10 AWAIT |
RR_CMD 0 1 1 AWAIT10 AWAIT |
RR_CMD 1 0 0 AWAIT9 AWAIT |
RR_CMD 1 0 1 AWAIT9 AWAIT |
RR_CMD 1 1 0 AWAIT10 AWAIT |
RR_CMD 1 1 1 AWAIT10 AWAIT |
RNR_CMD 0 0 0 AWAIT12 AWAIT |
RNR_CMD 0 0 1 AWAIT12 AWAIT |
RNR_CMD 0 1 0 AWAIT13 AWAIT |
RNR_CMD 0 1 1 AWAIT13 AWAIT |
RNR_CMD 1 0 0 AWAIT12 AWAIT |
RNR_CMD 1 0 1 AWAIT12 AWAIT |
RNR_CMD 1 1 0 AWAIT13 AWAIT |
RNR_CMD 1 1 1 AWAIT13 AWAIT |
REJ_CMD 0 0 0 AWAIT9 AWAIT |
REJ_CMD 0 0 1 AWAIT9 AWAIT |
REJ_CMD 0 1 0 AWAIT10 AWAIT |
REJ_CMD 0 1 1 AWAIT10 AWAIT |
REJ_CMD 1 0 0 AWAIT9 AWAIT |
REJ_CMD 1 0 1 AWAIT9 AWAIT |
REJ_CMD 1 1 0 AWAIT10 AWAIT |
REJ_CMD 1 1 1 AWAIT10 AWAIT |
DISC_CMD 0 0 0 SH4 ADM |
DISC_CMD 0 0 1 SH4 ADM |
DISC_CMD 0 1 0 SH4 ADM |
DISC_CMD 0 1 1 SH4 ADM |
DISC_CMD 1 0 0 SH4 ADM |
DISC_CMD 1 0 1 SH4 ADM |
DISC_CMD 1 1 0 SH4 ADM |
DISC_CMD 1 1 1 SH4 ADM |
SABME_CMD 0 0 0 SH3 RESET_CHECK |
SABME_CMD 0 0 1 SH3 RESET_CHECK |
SABME_CMD 0 1 0 SH3 RESET_CHECK |
SABME_CMD 0 1 1 SH3 RESET_CHECK |
SABME_CMD 1 0 0 SH3 RESET_CHECK |
SABME_CMD 1 0 1 SH3 RESET_CHECK |
SABME_CMD 1 1 0 SH3 RESET_CHECK |
SABME_CMD 1 1 1 SH3 RESET_CHECK |
I_RSP 0 0 0 AWAIT6 AWAIT |
I_RSP 0 0 1 AWAIT6 AWAIT |
I_RSP 0 1 0 SH10 ERROR |
I_RSP 0 1 1 AWAIT5 NORMAL |
I_RSP 1 0 0 AWAIT3 AWAIT_REJECT |
I_RSP 1 0 1 AWAIT3 AWAIT_REJECT |
I_RSP 1 1 0 SH10 ERROR |
I_RSP 1 1 1 AWAIT2 REJECT |
RR_RSP 0 0 0 AWAIT9 AWAIT |
RR_RSP 0 0 1 AWAIT9 AWAIT |
RR_RSP 0 1 0 SH10 ERROR |
RR_RSP 0 1 1 AWAIT8 AWAIT |
RR_RSP 1 0 0 AWAIT9 AWAIT |
RR_RSP 1 0 1 AWAIT9 AWAIT |
RR_RSP 1 1 0 SH10 ERROR |
RR_RSP 1 1 1 AWAIT8 AWAIT |
RNR_RSP 0 0 0 AWAIT12 AWAIT |
RNR_RSP 0 0 1 AWAIT12 AWAIT |
RNR_RSP 0 1 0 SH10 ERROR |
RNR_RSP 0 1 1 AWAIT11 AWAIT |
RNR_RSP 1 0 0 AWAIT12 AWAIT |
RNR_RSP 1 0 1 AWAIT12 AWAIT |
RNR_RSP 1 1 0 SH10 ERROR |
RNR_RSP 1 1 1 AWAIT11 AWAIT |
REJ_RSP 0 0 0 AWAIT9 AWAIT |
REJ_RSP 0 0 1 AWAIT9 AWAIT |
REJ_RSP 0 1 0 SH10 ERROR |
REJ_RSP 0 1 1 AWAIT8 AWAIT |
REJ_RSP 1 0 0 AWAIT9 AWAIT |
REJ_RSP 1 0 1 AWAIT9 AWAIT |
REJ_RSP 1 1 0 SH10 ERROR |
REJ_RSP 1 1 1 AWAIT8 AWAIT |
UA_RSP 0 0 0 SH9 ERROR |
UA_RSP 0 0 1 SH9 ERROR |
UA_RSP 0 1 0 SH9 ERROR |
UA_RSP 0 1 1 SH9 ERROR |
UA_RSP 1 0 0 SH9 ERROR |
UA_RSP 1 0 1 SH9 ERROR |
UA_RSP 1 1 0 SH9 ERROR |
UA_RSP 1 1 1 SH9 ERROR |
DM_RSP 0 0 0 SH6 ADM |
DM_RSP 0 0 1 SH6 ADM |
DM_RSP 0 1 0 SH6 ADM |
DM_RSP 0 1 1 SH6 ADM |
DM_RSP 1 0 0 SH6 ADM |
DM_RSP 1 0 1 SH6 ADM |
DM_RSP 1 1 0 SH6 ADM |
DM_RSP 1 1 1 SH6 ADM |
FRMR_RSP 0 0 0 SH5 RESET_WAIT |
FRMR_RSP 0 0 1 SH5 RESET_WAIT |
FRMR_RSP 0 1 0 SH5 RESET_WAIT |
FRMR_RSP 0 1 1 SH5 RESET_WAIT |
FRMR_RSP 1 0 0 SH5 RESET_WAIT |
FRMR_RSP 1 0 1 SH5 RESET_WAIT |
FRMR_RSP 1 1 0 SH5 RESET_WAIT |
FRMR_RSP 1 1 1 SH5 RESET_WAIT |
BAD_FRAME 0 0 0 SH7 ERROR |
BAD_FRAME 0 0 1 SH7 ERROR |
BAD_FRAME 0 1 0 SH7 ERROR |
BAD_FRAME 0 1 1 SH7 ERROR |
BAD_FRAME 1 0 0 SH7 ERROR |
BAD_FRAME 1 0 1 SH7 ERROR |
BAD_FRAME 1 1 0 SH7 ERROR |
BAD_FRAME 1 1 1 SH7 ERROR |
; |
;112 entries in table, 8 modified by tredit4 SABME_CMD x x x SH3 RESET_CHECK |
;112 entries in table, 8 modified by tredit4 DISC_CMD x x x SH4 ADM |
;112 entries in table, 8 modified by tredit4 FRMR_RSP x x x SH5 RESET_WAIT |
;112 entries in table, 8 modified by tredit4 DM_RSP x x x SH6 ADM |
;112 entries in table, 8 modified by tredit4 BAD_FRAME x x x SH7 ERROR |
;112 entries in table, 8 modified by tredit4 UA_RSP x x x SH9 ERROR |
;112 entries in table, 8 modified by tredit4 anyrsp x 1 0 SH10 ERROR |
;112 entries in table, 1 modified by tredit4 I_RSP 1 1 x AWAIT2 REJECT |
;112 entries in table, 2 modified by tredit4 I_CMD 1 0 x AWAIT3 AWAIT_REJECT |
;112 entries in table, 2 modified by tredit4 I_RSP 1 0 x AWAIT3 AWAIT_REJECT |
;112 entries in table, 2 modified by tredit4 I_CMD 1 1 x AWAIT4 AWAIT_REJECT |
;112 entries in table, 1 modified by tredit4 I_RSP x 1 x AWAIT5 NORMAL |
;112 entries in table, 2 modified by tredit4 I_RSP x 0 x AWAIT6 AWAIT |
;112 entries in table, 2 modified by tredit4 I_CMD x 0 x AWAIT6 AWAIT |
;112 entries in table, 2 modified by tredit4 I_CMD x 1 x AWAIT7 AWAIT |
;112 entries in table, 2 modified by tredit4 RR_RSP x 1 x AWAIT8 AWAIT |
;112 entries in table, 2 modified by tredit4 REJ_RSP x 1 x AWAIT8 AWAIT |
;112 entries in table, 4 modified by tredit4 RR_CMD x 0 x AWAIT9 AWAIT |
;112 entries in table, 4 modified by tredit4 RR_RSP x 0 x AWAIT9 AWAIT |
;112 entries in table, 4 modified by tredit4 REJ_CMD x 0 x AWAIT9 AWAIT |
;112 entries in table, 4 modified by tredit4 REJ_RSP x 0 x AWAIT9 AWAIT |
;112 entries in table, 4 modified by tredit4 RR_CMD x 1 x AWAIT10 AWAIT |
;112 entries in table, 4 modified by tredit4 REJ_CMD x 1 x AWAIT10 AWAIT |
;112 entries in table, 2 modified by tredit4 RNR_RSP x 1 x AWAIT11 AWAIT |
;112 entries in table, 4 modified by tredit4 RNR_CMD x 0 x AWAIT12 AWAIT |
;112 entries in table, 4 modified by tredit4 RNR_RSP x 0 x AWAIT12 AWAIT |
;112 entries in table, 4 modified by tredit4 RNR_CMD x 1 x AWAIT13 AWAIT |
; |
TABLE AWAIT_BUSY |
;Transition table for the AWAIT_BUSY state: |
; |
;frame type uexpect p bit p_flag |
;received N(S) in frame |
; |
I_CMD 0 0 0 AWAIT_BUSY8 AWAIT_BUSY |
I_CMD 0 0 1 AWAIT_BUSY8 AWAIT_BUSY |
I_CMD 0 1 0 AWAIT_BUSY9 AWAIT_BUSY |
I_CMD 0 1 1 AWAIT_BUSY9 AWAIT_BUSY |
I_CMD 1 0 0 AWAIT_BUSY5 AWAIT_BUSY |
I_CMD 1 0 1 AWAIT_BUSY5 AWAIT_BUSY |
I_CMD 1 1 0 AWAIT_BUSY6 AWAIT_BUSY |
I_CMD 1 1 1 AWAIT_BUSY6 AWAIT_BUSY |
RR_CMD 0 0 0 AWAIT_BUSY11 AWAIT_BUSY |
RR_CMD 0 0 1 AWAIT_BUSY11 AWAIT_BUSY |
RR_CMD 0 1 0 AWAIT_BUSY12 AWAIT_BUSY |
RR_CMD 0 1 1 AWAIT_BUSY12 AWAIT_BUSY |
RR_CMD 1 0 0 AWAIT_BUSY11 AWAIT_BUSY |
RR_CMD 1 0 1 AWAIT_BUSY11 AWAIT_BUSY |
RR_CMD 1 1 0 AWAIT_BUSY12 AWAIT_BUSY |
RR_CMD 1 1 1 AWAIT_BUSY12 AWAIT_BUSY |
RNR_CMD 0 0 0 AWAIT_BUSY14 AWAIT_BUSY |
RNR_CMD 0 0 1 AWAIT_BUSY14 AWAIT_BUSY |
RNR_CMD 0 1 0 AWAIT_BUSY15 AWAIT_BUSY |
RNR_CMD 0 1 1 AWAIT_BUSY15 AWAIT_BUSY |
RNR_CMD 1 0 0 AWAIT_BUSY14 AWAIT_BUSY |
RNR_CMD 1 0 1 AWAIT_BUSY14 AWAIT_BUSY |
RNR_CMD 1 1 0 AWAIT_BUSY15 AWAIT_BUSY |
RNR_CMD 1 1 1 AWAIT_BUSY15 AWAIT_BUSY |
REJ_CMD 0 0 0 AWAIT_BUSY11 AWAIT_BUSY |
REJ_CMD 0 0 1 AWAIT_BUSY11 AWAIT_BUSY |
REJ_CMD 0 1 0 AWAIT_BUSY12 AWAIT_BUSY |
REJ_CMD 0 1 1 AWAIT_BUSY12 AWAIT_BUSY |
REJ_CMD 1 0 0 AWAIT_BUSY11 AWAIT_BUSY |
REJ_CMD 1 0 1 AWAIT_BUSY11 AWAIT_BUSY |
REJ_CMD 1 1 0 AWAIT_BUSY12 AWAIT_BUSY |
REJ_CMD 1 1 1 AWAIT_BUSY12 AWAIT_BUSY |
DISC_CMD 0 0 0 SH4 ADM |
DISC_CMD 0 0 1 SH4 ADM |
DISC_CMD 0 1 0 SH4 ADM |
DISC_CMD 0 1 1 SH4 ADM |
DISC_CMD 1 0 0 SH4 ADM |
DISC_CMD 1 0 1 SH4 ADM |
DISC_CMD 1 1 0 SH4 ADM |
DISC_CMD 1 1 1 SH4 ADM |
SABME_CMD 0 0 0 SH3 RESET_CHECK |
SABME_CMD 0 0 1 SH3 RESET_CHECK |
SABME_CMD 0 1 0 SH3 RESET_CHECK |
SABME_CMD 0 1 1 SH3 RESET_CHECK |
SABME_CMD 1 0 0 SH3 RESET_CHECK |
SABME_CMD 1 0 1 SH3 RESET_CHECK |
SABME_CMD 1 1 0 SH3 RESET_CHECK |
SABME_CMD 1 1 1 SH3 RESET_CHECK |
I_RSP 0 0 0 AWAIT_BUSY8 AWAIT_BUSY |
I_RSP 0 0 1 AWAIT_BUSY8 AWAIT_BUSY |
I_RSP 0 1 0 SH10 ERROR |
I_RSP 0 1 1 AWAIT_BUSY7 BUSY |
I_RSP 1 0 0 AWAIT_BUSY5 AWAIT_BUSY |
I_RSP 1 0 1 AWAIT_BUSY5 AWAIT_BUSY |
I_RSP 1 1 0 SH10 ERROR |
I_RSP 1 1 1 AWAIT_BUSY4 BUSY |
RR_RSP 0 0 0 AWAIT_BUSY11 AWAIT_BUSY |
RR_RSP 0 0 1 AWAIT_BUSY11 AWAIT_BUSY |
RR_RSP 0 1 0 SH10 ERROR |
RR_RSP 0 1 1 AWAIT_BUSY10 BUSY |
RR_RSP 1 0 0 AWAIT_BUSY11 AWAIT_BUSY |
RR_RSP 1 0 1 AWAIT_BUSY11 AWAIT_BUSY |
RR_RSP 1 1 0 SH10 ERROR |
RR_RSP 1 1 1 AWAIT_BUSY10 BUSY |
RNR_RSP 0 0 0 AWAIT_BUSY14 AWAIT_BUSY |
RNR_RSP 0 0 1 AWAIT_BUSY14 AWAIT_BUSY |
RNR_RSP 0 1 0 SH10 ERROR |
RNR_RSP 0 1 1 AWAIT_BUSY13 BUSY |
RNR_RSP 1 0 0 AWAIT_BUSY14 AWAIT_BUSY |
RNR_RSP 1 0 1 AWAIT_BUSY14 AWAIT_BUSY |
RNR_RSP 1 1 0 SH10 ERROR |
RNR_RSP 1 1 1 AWAIT_BUSY13 BUSY |
REJ_RSP 0 0 0 AWAIT_BUSY11 AWAIT_BUSY |
REJ_RSP 0 0 1 AWAIT_BUSY11 AWAIT_BUSY |
REJ_RSP 0 1 0 SH10 ERROR |
REJ_RSP 0 1 1 AWAIT_BUSY10 BUSY |
REJ_RSP 1 0 0 AWAIT_BUSY11 AWAIT_BUSY |
REJ_RSP 1 0 1 AWAIT_BUSY11 AWAIT_BUSY |
REJ_RSP 1 1 0 SH10 ERROR |
REJ_RSP 1 1 1 AWAIT_BUSY10 BUSY |
UA_RSP 0 0 0 SH9 ERROR |
UA_RSP 0 0 1 SH9 ERROR |
UA_RSP 0 1 0 SH9 ERROR |
UA_RSP 0 1 1 SH9 ERROR |
UA_RSP 1 0 0 SH9 ERROR |
UA_RSP 1 0 1 SH9 ERROR |
UA_RSP 1 1 0 SH9 ERROR |
UA_RSP 1 1 1 SH9 ERROR |
DM_RSP 0 0 0 SH6 ADM |
DM_RSP 0 0 1 SH6 ADM |
DM_RSP 0 1 0 SH6 ADM |
DM_RSP 0 1 1 SH6 ADM |
DM_RSP 1 0 0 SH6 ADM |
DM_RSP 1 0 1 SH6 ADM |
DM_RSP 1 1 0 SH6 ADM |
DM_RSP 1 1 1 SH6 ADM |
FRMR_RSP 0 0 0 SH5 RESET_WAIT |
FRMR_RSP 0 0 1 SH5 RESET_WAIT |
FRMR_RSP 0 1 0 SH5 RESET_WAIT |
FRMR_RSP 0 1 1 SH5 RESET_WAIT |
FRMR_RSP 1 0 0 SH5 RESET_WAIT |
FRMR_RSP 1 0 1 SH5 RESET_WAIT |
FRMR_RSP 1 1 0 SH5 RESET_WAIT |
FRMR_RSP 1 1 1 SH5 RESET_WAIT |
BAD_FRAME 0 0 0 SH7 ERROR |
BAD_FRAME 0 0 1 SH7 ERROR |
BAD_FRAME 0 1 0 SH7 ERROR |
BAD_FRAME 0 1 1 SH7 ERROR |
BAD_FRAME 1 0 0 SH7 ERROR |
BAD_FRAME 1 0 1 SH7 ERROR |
BAD_FRAME 1 1 0 SH7 ERROR |
BAD_FRAME 1 1 1 SH7 ERROR |
; |
;112 entries in table, 8 modified by tredit4 SABME_CMD x x x SH3 RESET_CHECK |
;112 entries in table, 8 modified by tredit4 DISC_CMD x x x SH4 ADM |
;112 entries in table, 8 modified by tredit4 FRMR_RSP x x x SH5 RESET_WAIT |
;112 entries in table, 8 modified by tredit4 DM_RSP x x x SH6 ADM |
;112 entries in table, 8 modified by tredit4 BAD_FRAME x x x SH7 ERROR |
;112 entries in table, 8 modified by tredit4 UA_RSP x x x SH9 ERROR |
;112 entries in table, 8 modified by tredit4 anyrsp x 1 0 SH10 ERROR |
;112 entries in table, 1 modified by tredit4 I_RSP 1 1 x AWAIT_BUSY4 BUSY |
;112 entries in table, 2 modified by tredit4 I_CMD 1 0 x AWAIT_BUSY5 AWAIT_BUSY |
;112 entries in table, 2 modified by tredit4 I_RSP 1 0 x AWAIT_BUSY5 AWAIT_BUSY |
;112 entries in table, 2 modified by tredit4 I_CMD 1 1 x AWAIT_BUSY6 AWAIT_BUSY |
;112 entries in table, 1 modified by tredit4 I_RSP x 1 x AWAIT_BUSY7 BUSY |
;112 entries in table, 2 modified by tredit4 I_RSP x 0 x AWAIT_BUSY8 AWAIT_BUSY |
;112 entries in table, 2 modified by tredit4 I_CMD x 0 x AWAIT_BUSY8 AWAIT_BUSY |
;112 entries in table, 2 modified by tredit4 I_CMD x 1 x AWAIT_BUSY9 AWAIT_BUSY |
;112 entries in table, 2 modified by tredit4 RR_RSP x 1 x AWAIT_BUSY10 BUSY |
;112 entries in table, 2 modified by tredit4 REJ_RSP x 1 x AWAIT_BUSY10 BUSY |
;112 entries in table, 4 modified by tredit4 RR_CMD x 0 x AWAIT_BUSY11 AWAIT_BUSY |
;112 entries in table, 4 modified by tredit4 RR_RSP x 0 x AWAIT_BUSY11 AWAIT_BUSY |
;112 entries in table, 4 modified by tredit4 REJ_CMD x 0 x AWAIT_BUSY11 AWAIT_BUSY |
;112 entries in table, 4 modified by tredit4 REJ_RSP x 0 x AWAIT_BUSY11 AWAIT_BUSY |
;112 entries in table, 4 modified by tredit4 RR_CMD x 1 x AWAIT_BUSY12 AWAIT_BUSY |
;112 entries in table, 4 modified by tredit4 REJ_CMD x 1 x AWAIT_BUSY12 AWAIT_BUSY |
;112 entries in table, 2 modified by tredit4 RNR_RSP x 1 x AWAIT_BUSY13 BUSY |
;112 entries in table, 4 modified by tredit4 RNR_CMD x 0 x AWAIT_BUSY14 AWAIT_BUSY |
;112 entries in table, 4 modified by tredit4 RNR_RSP x 0 x AWAIT_BUSY14 AWAIT_BUSY |
;112 entries in table, 4 modified by tredit4 RNR_CMD x 1 x AWAIT_BUSY15 AWAIT_BUSY |
; |
TABLE AWAIT_REJECT |
;Transition table for the AWAIT_REJECT state: |
; |
;frame type uexpect p bit p_flag |
;received N(S) in frame |
; |
I_CMD 0 0 0 AWAIT_REJECT5 AWAIT |
I_CMD 0 0 1 AWAIT_REJECT5 AWAIT |
I_CMD 0 1 0 AWAIT_REJECT6 AWAIT |
I_CMD 0 1 1 AWAIT_REJECT6 AWAIT |
I_CMD 1 0 0 AWAIT_REJECT2 AWAIT_REJECT |
I_CMD 1 0 1 AWAIT_REJECT2 AWAIT_REJECT |
I_CMD 1 1 0 AWAIT_REJECT3 AWAIT_REJECT |
I_CMD 1 1 1 AWAIT_REJECT3 AWAIT_REJECT |
RR_CMD 0 0 0 AWAIT_REJECT8 AWAIT_REJECT |
RR_CMD 0 0 1 AWAIT_REJECT8 AWAIT_REJECT |
RR_CMD 0 1 0 AWAIT_REJECT9 AWAIT_REJECT |
RR_CMD 0 1 1 AWAIT_REJECT9 AWAIT_REJECT |
RR_CMD 1 0 0 AWAIT_REJECT8 AWAIT_REJECT |
RR_CMD 1 0 1 AWAIT_REJECT8 AWAIT_REJECT |
RR_CMD 1 1 0 AWAIT_REJECT9 AWAIT_REJECT |
RR_CMD 1 1 1 AWAIT_REJECT9 AWAIT_REJECT |
RNR_CMD 0 0 0 AWAIT_REJECT11 AWAIT_REJECT |
RNR_CMD 0 0 1 AWAIT_REJECT11 AWAIT_REJECT |
RNR_CMD 0 1 0 AWAIT_REJECT12 AWAIT_REJECT |
RNR_CMD 0 1 1 AWAIT_REJECT12 AWAIT_REJECT |
RNR_CMD 1 0 0 AWAIT_REJECT11 AWAIT_REJECT |
RNR_CMD 1 0 1 AWAIT_REJECT11 AWAIT_REJECT |
RNR_CMD 1 1 0 AWAIT_REJECT12 AWAIT_REJECT |
RNR_CMD 1 1 1 AWAIT_REJECT12 AWAIT_REJECT |
REJ_CMD 0 0 0 AWAIT_REJECT8 AWAIT_REJECT |
REJ_CMD 0 0 1 AWAIT_REJECT8 AWAIT_REJECT |
REJ_CMD 0 1 0 AWAIT_REJECT9 AWAIT_REJECT |
REJ_CMD 0 1 1 AWAIT_REJECT9 AWAIT_REJECT |
REJ_CMD 1 0 0 AWAIT_REJECT8 AWAIT_REJECT |
REJ_CMD 1 0 1 AWAIT_REJECT8 AWAIT_REJECT |
REJ_CMD 1 1 0 AWAIT_REJECT9 AWAIT_REJECT |
REJ_CMD 1 1 1 AWAIT_REJECT9 AWAIT_REJECT |
DISC_CMD 0 0 0 SH4 ADM |
DISC_CMD 0 0 1 SH4 ADM |
DISC_CMD 0 1 0 SH4 ADM |
DISC_CMD 0 1 1 SH4 ADM |
DISC_CMD 1 0 0 SH4 ADM |
DISC_CMD 1 0 1 SH4 ADM |
DISC_CMD 1 1 0 SH4 ADM |
DISC_CMD 1 1 1 SH4 ADM |
SABME_CMD 0 0 0 SH3 RESET_CHECK |
SABME_CMD 0 0 1 SH3 RESET_CHECK |
SABME_CMD 0 1 0 SH3 RESET_CHECK |
SABME_CMD 0 1 1 SH3 RESET_CHECK |
SABME_CMD 1 0 0 SH3 RESET_CHECK |
SABME_CMD 1 0 1 SH3 RESET_CHECK |
SABME_CMD 1 1 0 SH3 RESET_CHECK |
SABME_CMD 1 1 1 SH3 RESET_CHECK |
I_RSP 0 0 0 AWAIT_REJECT5 AWAIT |
I_RSP 0 0 1 AWAIT_REJECT5 AWAIT |
I_RSP 0 1 0 SH10 ERROR |
I_RSP 0 1 1 AWAIT_REJECT4 NORMAL |
I_RSP 1 0 0 AWAIT_REJECT2 AWAIT_REJECT |
I_RSP 1 0 1 AWAIT_REJECT2 AWAIT_REJECT |
I_RSP 1 1 0 SH10 ERROR |
I_RSP 1 1 1 AWAIT_REJECT4 NORMAL |
RR_RSP 0 0 0 AWAIT_REJECT8 AWAIT_REJECT |
RR_RSP 0 0 1 AWAIT_REJECT8 AWAIT_REJECT |
RR_RSP 0 1 0 SH10 ERROR |
RR_RSP 0 1 1 AWAIT_REJECT7 REJECT |
RR_RSP 1 0 0 AWAIT_REJECT8 AWAIT_REJECT |
RR_RSP 1 0 1 AWAIT_REJECT8 AWAIT_REJECT |
RR_RSP 1 1 0 SH10 ERROR |
RR_RSP 1 1 1 AWAIT_REJECT7 REJECT |
RNR_RSP 0 0 0 AWAIT_REJECT11 AWAIT_REJECT |
RNR_RSP 0 0 1 AWAIT_REJECT11 AWAIT_REJECT |
RNR_RSP 0 1 0 SH10 ERROR |
RNR_RSP 0 1 1 AWAIT_REJECT10 REJECT |
RNR_RSP 1 0 0 AWAIT_REJECT11 AWAIT_REJECT |
RNR_RSP 1 0 1 AWAIT_REJECT11 AWAIT_REJECT |
RNR_RSP 1 1 0 SH10 ERROR |
RNR_RSP 1 1 1 AWAIT_REJECT10 REJECT |
REJ_RSP 0 0 0 AWAIT_REJECT8 AWAIT_REJECT |
REJ_RSP 0 0 1 AWAIT_REJECT8 AWAIT_REJECT |
REJ_RSP 0 1 0 SH10 ERROR |
REJ_RSP 0 1 1 AWAIT_REJECT7 REJECT |
REJ_RSP 1 0 0 AWAIT_REJECT8 AWAIT_REJECT |
REJ_RSP 1 0 1 AWAIT_REJECT8 AWAIT_REJECT |
REJ_RSP 1 1 0 SH10 ERROR |
REJ_RSP 1 1 1 AWAIT_REJECT7 REJECT |
UA_RSP 0 0 0 SH9 ERROR |
UA_RSP 0 0 1 SH9 ERROR |
UA_RSP 0 1 0 SH9 ERROR |
UA_RSP 0 1 1 SH9 ERROR |
UA_RSP 1 0 0 SH9 ERROR |
UA_RSP 1 0 1 SH9 ERROR |
UA_RSP 1 1 0 SH9 ERROR |
UA_RSP 1 1 1 SH9 ERROR |
DM_RSP 0 0 0 SH6 ADM |
DM_RSP 0 0 1 SH6 ADM |
DM_RSP 0 1 0 SH6 ADM |
DM_RSP 0 1 1 SH6 ADM |
DM_RSP 1 0 0 SH6 ADM |
DM_RSP 1 0 1 SH6 ADM |
DM_RSP 1 1 0 SH6 ADM |
DM_RSP 1 1 1 SH6 ADM |
FRMR_RSP 0 0 0 SH5 RESET_WAIT |
FRMR_RSP 0 0 1 SH5 RESET_WAIT |
FRMR_RSP 0 1 0 SH5 RESET_WAIT |
FRMR_RSP 0 1 1 SH5 RESET_WAIT |
FRMR_RSP 1 0 0 SH5 RESET_WAIT |
FRMR_RSP 1 0 1 SH5 RESET_WAIT |
FRMR_RSP 1 1 0 SH5 RESET_WAIT |
FRMR_RSP 1 1 1 SH5 RESET_WAIT |
BAD_FRAME 0 0 0 SH7 ERROR |
BAD_FRAME 0 0 1 SH7 ERROR |
BAD_FRAME 0 1 0 SH7 ERROR |
BAD_FRAME 0 1 1 SH7 ERROR |
BAD_FRAME 1 0 0 SH7 ERROR |
BAD_FRAME 1 0 1 SH7 ERROR |
BAD_FRAME 1 1 0 SH7 ERROR |
BAD_FRAME 1 1 1 SH7 ERROR |
; |
;112 entries in table, 8 modified by tredit4 SABME_CMD x x x SH3 RESET_CHECK |
;112 entries in table, 8 modified by tredit4 DISC_CMD x x x SH4 ADM |
;112 entries in table, 8 modified by tredit4 FRMR_RSP x x x SH5 RESET_WAIT |
;112 entries in table, 8 modified by tredit4 DM_RSP x x x SH6 ADM |
;112 entries in table, 8 modified by tredit4 BAD_FRAME x x x SH7 ERROR |
;112 entries in table, 8 modified by tredit4 UA_RSP x x x SH9 ERROR |
;112 entries in table, 8 modified by tredit4 anyrsp x 1 0 SH10 ERROR |
;112 entries in table, 2 modified by tredit4 I_CMD 1 0 x AWAIT_REJECT2 AWAIT_REJECT |
;112 entries in table, 2 modified by tredit4 I_RSP 1 0 x AWAIT_REJECT2 AWAIT_REJECT |
;112 entries in table, 2 modified by tredit4 I_CMD 1 1 x AWAIT_REJECT3 AWAIT_REJECT |
;112 entries in table, 2 modified by tredit4 I_RSP x 1 x AWAIT_REJECT4 NORMAL |
;112 entries in table, 2 modified by tredit4 I_RSP x 0 x AWAIT_REJECT5 AWAIT |
;112 entries in table, 2 modified by tredit4 I_CMD x 0 x AWAIT_REJECT5 AWAIT |
;112 entries in table, 2 modified by tredit4 I_CMD x 1 x AWAIT_REJECT6 AWAIT |
;112 entries in table, 2 modified by tredit4 RR_RSP x 1 x AWAIT_REJECT7 REJECT |
;112 entries in table, 2 modified by tredit4 REJ_RSP x 1 x AWAIT_REJECT7 REJECT |
;112 entries in table, 0 modified by tredit4 I_RSP 1 1 x AWAIT_REJECT7 REJECT |
;112 entries in table, 4 modified by tredit4 RR_CMD x 0 x AWAIT_REJECT8 AWAIT_REJECT |
;112 entries in table, 4 modified by tredit4 RR_RSP x 0 x AWAIT_REJECT8 AWAIT_REJECT |
;112 entries in table, 4 modified by tredit4 REJ_CMD x 0 x AWAIT_REJECT8 AWAIT_REJECT |
;112 entries in table, 4 modified by tredit4 REJ_RSP x 0 x AWAIT_REJECT8 AWAIT_REJECT |
;112 entries in table, 4 modified by tredit4 RR_CMD x 1 x AWAIT_REJECT9 AWAIT_REJECT |
;112 entries in table, 4 modified by tredit4 REJ_CMD x 1 x AWAIT_REJECT9 AWAIT_REJECT |
;112 entries in table, 2 modified by tredit4 RNR_RSP x 1 x AWAIT_REJECT10 REJECT |
;112 entries in table, 4 modified by tredit4 RNR_CMD x 0 x AWAIT_REJECT11 AWAIT_REJECT |
;112 entries in table, 4 modified by tredit4 RNR_RSP x 0 x AWAIT_REJECT11 AWAIT_REJECT |
;112 entries in table, 4 modified by tredit4 RNR_CMD x 1 x AWAIT_REJECT12 AWAIT_REJECT |
;112 entries in table, 0 modified by tredit4 RNR_CMD x 1 x AWAIT_REJECT15 AWAIT_BUSY |
/transit/pdutr.h
0,0 → 1,309
|
/* this file was generated on Thu Jan 8 00:21:19 GMT 1998 */ |
|
/* index name #defines: */ |
|
#define ADM 0 |
#define CONN 1 |
#define RESET_WAIT 2 |
#define RESET_CHECK 3 |
#define SETUP 4 |
#define RESET 5 |
#define D_CONN 6 |
#define ERROR 7 |
#define NORMAL 8 |
#define BUSY 9 |
#define REJECT 10 |
#define AWAIT 11 |
#define AWAIT_BUSY 12 |
#define AWAIT_REJECT 13 |
|
|
/* size of transition table is 1684 bytes */ |
|
static short int pdutr_offset [ ] ={ |
0, 54, 82, 110, 138, 192, 246, 300, 328, 554, |
780, 1006, 1232, 1458 }; |
|
static char pdutr_entry [ ] = { |
ADM5 , ADM , ADM4 , ADM , ADM5 , ADM , |
ADM4 , ADM , ADM5 , ADM , ADM4 , ADM , |
ADM5 , ADM , ADM4 , ADM , ADM3 , ADM , |
ADM3 , ADM , ADM2 , CONN , ADM2 , CONN , |
ADM5 , ADM , ADM5 , ADM , ADM5 , ADM , |
ADM5 , ADM , ADM5 , ADM , ADM5 , ADM , |
ADM5 , ADM , ADM5 , ADM , ADM5 , ADM , |
ADM5 , ADM , ADM5 , ADM , ADM5 , ADM , |
ADM5 , ADM , ADM5 , ADM , ADM5 , ADM , |
CONN5 , CONN , CONN5 , CONN , CONN5 , CONN , |
CONN5 , CONN , CONN5 , CONN , CONN3 , CONN , |
CONN5 , CONN , CONN5 , CONN , CONN5 , CONN , |
CONN5 , CONN , CONN5 , CONN , CONN4 , ADM , |
CONN5 , CONN , CONN5 , CONN , RESWAIT8 , RESET_WAIT , |
RESWAIT8 , RESET_WAIT , RESWAIT8 , RESET_WAIT , RESWAIT8 , RESET_WAIT , |
RESWAIT7 , RESET_WAIT , RESWAIT6 , RESET_WAIT , RESWAIT8 , RESET_WAIT , |
RESWAIT8 , RESET_WAIT , RESWAIT8 , RESET_WAIT , RESWAIT8 , RESET_WAIT , |
RESWAIT8 , RESET_WAIT , RESWAIT5 , ADM , RESWAIT8 , RESET_WAIT , |
RESWAIT8 , RESET_WAIT , RESCHK6 , RESET_CHECK , RESCHK6 , RESET_CHECK , |
RESCHK6 , RESET_CHECK , RESCHK6 , RESET_CHECK , RESCHK5 , ADM , |
RESCHK4 , RESET_CHECK , RESCHK6 , RESET_CHECK , RESCHK6 , RESET_CHECK , |
RESCHK6 , RESET_CHECK , RESCHK6 , RESET_CHECK , RESCHK6 , RESET_CHECK , |
RESCHK3 , ADM , RESCHK6 , RESET_CHECK , RESCHK6 , RESET_CHECK , |
SETUP6 , SETUP , SETUP6 , SETUP , SETUP6 , SETUP , |
SETUP6 , SETUP , SETUP6 , SETUP , SETUP6 , SETUP , |
SETUP6 , SETUP , SETUP6 , SETUP , SETUP4 , ADM , |
SETUP4 , ADM , SETUP1 , SETUP , SETUP1 , SETUP , |
SETUP6 , SETUP , SETUP6 , SETUP , SETUP6 , SETUP , |
SETUP6 , SETUP , SETUP6 , SETUP , SETUP6 , SETUP , |
SETUP6 , SETUP , SETUP6 , SETUP , SETUP6 , SETUP , |
SETUP2 , NORMAL , SETUP5 , ADM , SETUP5 , ADM , |
SETUP6 , SETUP , SETUP6 , SETUP , SETUP6 , SETUP , |
RESET6 , RESET , RESET6 , RESET , RESET6 , RESET , |
RESET6 , RESET , RESET6 , RESET , RESET6 , RESET , |
RESET6 , RESET , RESET6 , RESET , RESET4 , ADM , |
RESET4 , ADM , RESET1 , RESET , RESET1 , RESET , |
RESET6 , RESET , RESET6 , RESET , RESET6 , RESET , |
RESET6 , RESET , RESET6 , RESET , RESET6 , RESET , |
RESET6 , RESET , RESET6 , RESET , RESET6 , RESET , |
RESET2 , NORMAL , RESET5 , ADM , RESET5 , ADM , |
RESET6 , RESET , RESET6 , RESET , RESET6 , RESET , |
D_CONN5 , D_CONN , D_CONN5 , D_CONN , D_CONN5 , D_CONN , |
D_CONN5 , D_CONN , D_CONN5 , D_CONN , D_CONN5 , D_CONN , |
D_CONN5 , D_CONN , D_CONN5 , D_CONN , D_CONN3 , D_CONN , |
D_CONN3 , D_CONN , D_CONN1 , ADM , D_CONN1 , ADM , |
D_CONN5 , D_CONN , D_CONN5 , D_CONN , D_CONN5 , D_CONN , |
D_CONN5 , D_CONN , D_CONN5 , D_CONN , D_CONN5 , D_CONN , |
D_CONN5 , D_CONN , D_CONN5 , D_CONN , D_CONN5 , D_CONN , |
D_CONN4 , ADM , D_CONN4 , ADM , D_CONN5 , ADM , |
D_CONN5 , D_CONN , D_CONN5 , D_CONN , D_CONN5 , D_CONN , |
ERR5 , ERROR , ERR5 , ERROR , ERR5 , ERROR , |
ERR5 , ERROR , ERR2 , ADM , ERR1 , RESET_CHECK , |
ERR6 , ERROR , ERR6 , ERROR , ERR6 , ERROR , |
ERR6 , ERROR , ERR6 , ERROR , ERR3 , ADM , |
ERR4 , RESET_WAIT , ERR4 , RESET_WAIT , NORMAL8B , NORMAL , |
NORMAL9 , NORMAL , NORMAL10 , NORMAL , NORMAL10 , NORMAL , |
NORMAL5 , REJECT , NORMAL6 , REJECT , NORMAL7 , REJECT , |
NORMAL7 , REJECT , NORMAL11 , NORMAL , NORMAL11 , NORMAL , |
NORMAL12 , NORMAL , NORMAL12 , NORMAL , NORMAL11 , NORMAL , |
NORMAL11 , NORMAL , NORMAL12 , NORMAL , NORMAL12 , NORMAL , |
NORMAL13 , NORMAL , NORMAL13 , NORMAL , NORMAL14 , NORMAL , |
NORMAL14 , NORMAL , NORMAL13 , NORMAL , NORMAL13 , NORMAL , |
NORMAL14 , NORMAL , NORMAL14 , NORMAL , NORMAL15 , NORMAL , |
NORMAL16 , NORMAL , NORMAL17 , NORMAL , NORMAL17 , NORMAL , |
NORMAL15 , NORMAL , NORMAL16 , NORMAL , NORMAL17 , NORMAL , |
NORMAL17 , NORMAL , SH4 , ADM , SH4 , ADM , |
SH4 , ADM , SH4 , ADM , SH4 , ADM , |
SH4 , ADM , SH4 , ADM , SH4 , ADM , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , NORMAL8B , NORMAL , |
NORMAL9 , NORMAL , SH10 , ERROR , NORMAL8A , NORMAL , |
NORMAL5 , REJECT , NORMAL6 , REJECT , SH10 , ERROR , |
NORMAL5 , REJECT , NORMAL11 , NORMAL , NORMAL11 , NORMAL , |
SH10 , ERROR , NORMAL11 , NORMAL , NORMAL11 , NORMAL , |
NORMAL11 , NORMAL , SH10 , ERROR , NORMAL11 , NORMAL , |
NORMAL13 , NORMAL , NORMAL13 , NORMAL , SH10 , ERROR , |
NORMAL13 , NORMAL , NORMAL13 , NORMAL , NORMAL13 , NORMAL , |
SH10 , ERROR , NORMAL13 , NORMAL , NORMAL15 , NORMAL , |
NORMAL16 , NORMAL , SH10 , ERROR , NORMAL15 , NORMAL , |
NORMAL15 , NORMAL , NORMAL16 , NORMAL , SH10 , ERROR , |
NORMAL15 , NORMAL , SH9 , ERROR , SH9 , ERROR , |
SH9 , ERROR , SH9 , ERROR , SH9 , ERROR , |
SH9 , ERROR , SH9 , ERROR , SH9 , ERROR , |
SH6 , ADM , SH6 , ADM , SH6 , ADM , |
SH6 , ADM , SH6 , ADM , SH6 , ADM , |
SH6 , ADM , SH6 , ADM , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , BUSY13 , BUSY , BUSY14 , BUSY , |
BUSY12 , BUSY , BUSY12 , BUSY , BUSY9 , BUSY , |
BUSY10 , BUSY , BUSY11 , BUSY , BUSY11 , BUSY , |
BUSY15 , BUSY , BUSY15 , BUSY , BUSY16 , BUSY , |
BUSY16 , BUSY , BUSY15 , BUSY , BUSY15 , BUSY , |
BUSY16 , BUSY , BUSY16 , BUSY , BUSY17 , BUSY , |
BUSY17 , BUSY , BUSY18 , BUSY , BUSY18 , BUSY , |
BUSY17 , BUSY , BUSY17 , BUSY , BUSY18 , BUSY , |
BUSY18 , BUSY , BUSY19 , BUSY , BUSY20 , BUSY , |
BUSY21 , BUSY , BUSY21 , BUSY , BUSY19 , BUSY , |
BUSY20 , BUSY , BUSY21 , BUSY , BUSY21 , BUSY , |
SH4 , ADM , SH4 , ADM , SH4 , ADM , |
SH4 , ADM , SH4 , ADM , SH4 , ADM , |
SH4 , ADM , SH4 , ADM , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , BUSY13 , BUSY , BUSY14 , BUSY , |
SH10 , ERROR , BUSY13 , BUSY , BUSY9 , BUSY , |
BUSY10 , BUSY , SH10 , ERROR , BUSY9 , BUSY , |
BUSY15 , BUSY , BUSY15 , BUSY , SH10 , ERROR , |
BUSY15 , BUSY , BUSY15 , BUSY , BUSY15 , BUSY , |
SH10 , ERROR , BUSY15 , BUSY , BUSY17 , BUSY , |
BUSY17 , BUSY , SH10 , ERROR , BUSY17 , BUSY , |
BUSY17 , BUSY , BUSY17 , BUSY , SH10 , ERROR , |
BUSY17 , BUSY , BUSY19 , BUSY , BUSY20 , BUSY , |
SH10 , ERROR , BUSY19 , BUSY , BUSY19 , BUSY , |
BUSY20 , BUSY , SH10 , ERROR , BUSY19 , BUSY , |
SH9 , ERROR , SH9 , ERROR , SH9 , ERROR , |
SH9 , ERROR , SH9 , ERROR , SH9 , ERROR , |
SH9 , ERROR , SH9 , ERROR , SH6 , ADM , |
SH6 , ADM , SH6 , ADM , SH6 , ADM , |
SH6 , ADM , SH6 , ADM , SH6 , ADM , |
SH6 , ADM , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
REJECT7 , REJECT , REJECT8 , REJECT , REJECT9 , REJECT , |
REJECT9 , REJECT , REJECT5 , REJECT , REJECT5 , REJECT , |
REJECT6 , REJECT , REJECT6 , REJECT , REJECT10 , REJECT , |
REJECT10 , REJECT , REJECT11 , REJECT , REJECT11 , REJECT , |
REJECT10 , REJECT , REJECT10 , REJECT , REJECT11 , REJECT , |
REJECT11 , REJECT , REJECT12 , REJECT , REJECT12 , REJECT , |
REJECT13 , REJECT , REJECT13 , REJECT , REJECT12 , REJECT , |
REJECT12 , REJECT , REJECT13 , REJECT , REJECT13 , REJECT , |
REJECT14 , REJECT , REJECT15 , REJECT , REJECT16 , REJECT , |
REJECT16 , REJECT , REJECT14 , REJECT , REJECT15 , REJECT , |
REJECT16 , REJECT , REJECT16 , REJECT , SH4 , ADM , |
SH4 , ADM , SH4 , ADM , SH4 , ADM , |
SH4 , ADM , SH4 , ADM , SH4 , ADM , |
SH4 , ADM , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
REJECT7 , REJECT , REJECT8 , REJECT , SH10 , ERROR , |
REJECT7 , REJECT , REJECT5 , REJECT , REJECT5 , REJECT , |
SH10 , ERROR , REJECT5 , REJECT , REJECT10 , REJECT , |
REJECT10 , REJECT , SH10 , ERROR , REJECT10 , REJECT , |
REJECT10 , REJECT , REJECT10 , REJECT , SH10 , ERROR , |
REJECT10 , REJECT , REJECT12 , REJECT , REJECT12 , REJECT , |
SH10 , ERROR , REJECT12 , REJECT , REJECT12 , REJECT , |
REJECT12 , REJECT , SH10 , ERROR , REJECT12 , REJECT , |
REJECT14 , REJECT , REJECT15 , REJECT , SH10 , ERROR , |
REJECT14 , REJECT , REJECT14 , REJECT , REJECT15 , REJECT , |
SH10 , ERROR , REJECT14 , REJECT , SH9 , ERROR , |
SH9 , ERROR , SH9 , ERROR , SH9 , ERROR , |
SH9 , ERROR , SH9 , ERROR , SH9 , ERROR , |
SH9 , ERROR , SH6 , ADM , SH6 , ADM , |
SH6 , ADM , SH6 , ADM , SH6 , ADM , |
SH6 , ADM , SH6 , ADM , SH6 , ADM , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR , AWAIT6 , AWAIT , |
AWAIT6 , AWAIT , AWAIT7 , AWAIT , AWAIT7 , AWAIT , |
AWAIT3 , AWAIT_REJECT , AWAIT3 , AWAIT_REJECT , AWAIT4 , AWAIT_REJECT , |
AWAIT4 , AWAIT_REJECT , AWAIT9 , AWAIT , AWAIT9 , AWAIT , |
AWAIT10 , AWAIT , AWAIT10 , AWAIT , AWAIT9 , AWAIT , |
AWAIT9 , AWAIT , AWAIT10 , AWAIT , AWAIT10 , AWAIT , |
AWAIT12 , AWAIT , AWAIT12 , AWAIT , AWAIT13 , AWAIT , |
AWAIT13 , AWAIT , AWAIT12 , AWAIT , AWAIT12 , AWAIT , |
AWAIT13 , AWAIT , AWAIT13 , AWAIT , AWAIT9 , AWAIT , |
AWAIT9 , AWAIT , AWAIT10 , AWAIT , AWAIT10 , AWAIT , |
AWAIT9 , AWAIT , AWAIT9 , AWAIT , AWAIT10 , AWAIT , |
AWAIT10 , AWAIT , SH4 , ADM , SH4 , ADM , |
SH4 , ADM , SH4 , ADM , SH4 , ADM , |
SH4 , ADM , SH4 , ADM , SH4 , ADM , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , AWAIT6 , AWAIT , |
AWAIT6 , AWAIT , SH10 , ERROR , AWAIT5 , NORMAL , |
AWAIT3 , AWAIT_REJECT , AWAIT3 , AWAIT_REJECT , SH10 , ERROR , |
AWAIT2 , REJECT , AWAIT9 , AWAIT , AWAIT9 , AWAIT , |
SH10 , ERROR , AWAIT8 , AWAIT , AWAIT9 , AWAIT , |
AWAIT9 , AWAIT , SH10 , ERROR , AWAIT8 , AWAIT , |
AWAIT12 , AWAIT , AWAIT12 , AWAIT , SH10 , ERROR , |
AWAIT11 , AWAIT , AWAIT12 , AWAIT , AWAIT12 , AWAIT , |
SH10 , ERROR , AWAIT11 , AWAIT , AWAIT9 , AWAIT , |
AWAIT9 , AWAIT , SH10 , ERROR , AWAIT8 , AWAIT , |
AWAIT9 , AWAIT , AWAIT9 , AWAIT , SH10 , ERROR , |
AWAIT8 , AWAIT , SH9 , ERROR , SH9 , ERROR , |
SH9 , ERROR , SH9 , ERROR , SH9 , ERROR , |
SH9 , ERROR , SH9 , ERROR , SH9 , ERROR , |
SH6 , ADM , SH6 , ADM , SH6 , ADM , |
SH6 , ADM , SH6 , ADM , SH6 , ADM , |
SH6 , ADM , SH6 , ADM , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , AWAIT_BUSY8 , AWAIT_BUSY , AWAIT_BUSY8 , AWAIT_BUSY , |
AWAIT_BUSY9 , AWAIT_BUSY , AWAIT_BUSY9 , AWAIT_BUSY , AWAIT_BUSY5 , AWAIT_BUSY , |
AWAIT_BUSY5 , AWAIT_BUSY , AWAIT_BUSY6 , AWAIT_BUSY , AWAIT_BUSY6 , AWAIT_BUSY , |
AWAIT_BUSY11 , AWAIT_BUSY , AWAIT_BUSY11 , AWAIT_BUSY , AWAIT_BUSY12 , AWAIT_BUSY , |
AWAIT_BUSY12 , AWAIT_BUSY , AWAIT_BUSY11 , AWAIT_BUSY , AWAIT_BUSY11 , AWAIT_BUSY , |
AWAIT_BUSY12 , AWAIT_BUSY , AWAIT_BUSY12 , AWAIT_BUSY , AWAIT_BUSY14 , AWAIT_BUSY , |
AWAIT_BUSY14 , AWAIT_BUSY , AWAIT_BUSY15 , AWAIT_BUSY , AWAIT_BUSY15 , AWAIT_BUSY , |
AWAIT_BUSY14 , AWAIT_BUSY , AWAIT_BUSY14 , AWAIT_BUSY , AWAIT_BUSY15 , AWAIT_BUSY , |
AWAIT_BUSY15 , AWAIT_BUSY , AWAIT_BUSY11 , AWAIT_BUSY , AWAIT_BUSY11 , AWAIT_BUSY , |
AWAIT_BUSY12 , AWAIT_BUSY , AWAIT_BUSY12 , AWAIT_BUSY , AWAIT_BUSY11 , AWAIT_BUSY , |
AWAIT_BUSY11 , AWAIT_BUSY , AWAIT_BUSY12 , AWAIT_BUSY , AWAIT_BUSY12 , AWAIT_BUSY , |
SH4 , ADM , SH4 , ADM , SH4 , ADM , |
SH4 , ADM , SH4 , ADM , SH4 , ADM , |
SH4 , ADM , SH4 , ADM , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , AWAIT_BUSY8 , AWAIT_BUSY , AWAIT_BUSY8 , AWAIT_BUSY , |
SH10 , ERROR , AWAIT_BUSY7 , BUSY , AWAIT_BUSY5 , AWAIT_BUSY , |
AWAIT_BUSY5 , AWAIT_BUSY , SH10 , ERROR , AWAIT_BUSY4 , BUSY , |
AWAIT_BUSY11 , AWAIT_BUSY , AWAIT_BUSY11 , AWAIT_BUSY , SH10 , ERROR , |
AWAIT_BUSY10 , BUSY , AWAIT_BUSY11 , AWAIT_BUSY , AWAIT_BUSY11 , AWAIT_BUSY , |
SH10 , ERROR , AWAIT_BUSY10 , BUSY , AWAIT_BUSY14 , AWAIT_BUSY , |
AWAIT_BUSY14 , AWAIT_BUSY , SH10 , ERROR , AWAIT_BUSY13 , BUSY , |
AWAIT_BUSY14 , AWAIT_BUSY , AWAIT_BUSY14 , AWAIT_BUSY , SH10 , ERROR , |
AWAIT_BUSY13 , BUSY , AWAIT_BUSY11 , AWAIT_BUSY , AWAIT_BUSY11 , AWAIT_BUSY , |
SH10 , ERROR , AWAIT_BUSY10 , BUSY , AWAIT_BUSY11 , AWAIT_BUSY , |
AWAIT_BUSY11 , AWAIT_BUSY , SH10 , ERROR , AWAIT_BUSY10 , BUSY , |
SH9 , ERROR , SH9 , ERROR , SH9 , ERROR , |
SH9 , ERROR , SH9 , ERROR , SH9 , ERROR , |
SH9 , ERROR , SH9 , ERROR , SH6 , ADM , |
SH6 , ADM , SH6 , ADM , SH6 , ADM , |
SH6 , ADM , SH6 , ADM , SH6 , ADM , |
SH6 , ADM , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
AWAIT_REJECT5 , AWAIT , AWAIT_REJECT5 , AWAIT , AWAIT_REJECT6 , AWAIT , |
AWAIT_REJECT6 , AWAIT , AWAIT_REJECT2 , AWAIT_REJECT , AWAIT_REJECT2 , AWAIT_REJECT , |
AWAIT_REJECT3 , AWAIT_REJECT , AWAIT_REJECT3 , AWAIT_REJECT , AWAIT_REJECT8 , AWAIT_REJECT , |
AWAIT_REJECT8 , AWAIT_REJECT , AWAIT_REJECT9 , AWAIT_REJECT , AWAIT_REJECT9 , AWAIT_REJECT , |
AWAIT_REJECT8 , AWAIT_REJECT , AWAIT_REJECT8 , AWAIT_REJECT , AWAIT_REJECT9 , AWAIT_REJECT , |
AWAIT_REJECT9 , AWAIT_REJECT , AWAIT_REJECT11, AWAIT_REJECT , AWAIT_REJECT11, AWAIT_REJECT , |
AWAIT_REJECT12, AWAIT_REJECT , AWAIT_REJECT12, AWAIT_REJECT , AWAIT_REJECT11, AWAIT_REJECT , |
AWAIT_REJECT11, AWAIT_REJECT , AWAIT_REJECT12, AWAIT_REJECT , AWAIT_REJECT12, AWAIT_REJECT , |
AWAIT_REJECT8 , AWAIT_REJECT , AWAIT_REJECT8 , AWAIT_REJECT , AWAIT_REJECT9 , AWAIT_REJECT , |
AWAIT_REJECT9 , AWAIT_REJECT , AWAIT_REJECT8 , AWAIT_REJECT , AWAIT_REJECT8 , AWAIT_REJECT , |
AWAIT_REJECT9 , AWAIT_REJECT , AWAIT_REJECT9 , AWAIT_REJECT , SH4 , ADM , |
SH4 , ADM , SH4 , ADM , SH4 , ADM , |
SH4 , ADM , SH4 , ADM , SH4 , ADM , |
SH4 , ADM , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
SH3 , RESET_CHECK , SH3 , RESET_CHECK , SH3 , RESET_CHECK , |
AWAIT_REJECT5 , AWAIT , AWAIT_REJECT5 , AWAIT , SH10 , ERROR , |
AWAIT_REJECT4 , NORMAL , AWAIT_REJECT2 , AWAIT_REJECT , AWAIT_REJECT2 , AWAIT_REJECT , |
SH10 , ERROR , AWAIT_REJECT4 , NORMAL , AWAIT_REJECT8 , AWAIT_REJECT , |
AWAIT_REJECT8 , AWAIT_REJECT , SH10 , ERROR , AWAIT_REJECT7 , REJECT , |
AWAIT_REJECT8 , AWAIT_REJECT , AWAIT_REJECT8 , AWAIT_REJECT , SH10 , ERROR , |
AWAIT_REJECT7 , REJECT , AWAIT_REJECT11, AWAIT_REJECT , AWAIT_REJECT11, AWAIT_REJECT , |
SH10 , ERROR , AWAIT_REJECT10, REJECT , AWAIT_REJECT11, AWAIT_REJECT , |
AWAIT_REJECT11, AWAIT_REJECT , SH10 , ERROR , AWAIT_REJECT10, REJECT , |
AWAIT_REJECT8 , AWAIT_REJECT , AWAIT_REJECT8 , AWAIT_REJECT , SH10 , ERROR , |
AWAIT_REJECT7 , REJECT , AWAIT_REJECT8 , AWAIT_REJECT , AWAIT_REJECT8 , AWAIT_REJECT , |
SH10 , ERROR , AWAIT_REJECT7 , REJECT , SH9 , ERROR , |
SH9 , ERROR , SH9 , ERROR , SH9 , ERROR , |
SH9 , ERROR , SH9 , ERROR , SH9 , ERROR , |
SH9 , ERROR , SH6 , ADM , SH6 , ADM , |
SH6 , ADM , SH6 , ADM , SH6 , ADM , |
SH6 , ADM , SH6 , ADM , SH6 , ADM , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH5 , RESET_WAIT , |
SH5 , RESET_WAIT , SH5 , RESET_WAIT , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR , SH7 , ERROR , |
SH7 , ERROR , SH7 , ERROR }; |
/transit/compile.awk
0,0 → 1,81
# to run: awk -f transit.awk transit.p0 |
# |
BEGIN { "date" | getline |
enable_index = 1 |
today = $0 |
printf("\n/* this file was generated on %s */\n", today ) |
not_firstone = 0 # flag to avoid empty entry in 1st table |
fpe = 0 # entry tbl array fill pointer |
fpeo = 0 # entry tbl offset list fill pointer |
fpdef = 0 # define list fill pointer |
} |
|
### /^;/ { } # line starting with a semicolon is comment |
|
/^[A-Z]/ { # table name |
if ( $1 == "TABLE" ) { |
tbl = $2 # get table name |
newtbl( tbl ) |
} |
else if ( $1 == "COMPILE" ) { |
array_name = $2 |
if ( $3 == "NOINDEX" ) { enable_index = 0 } |
} |
else { # table entry |
ec = ec +1 |
n = split( $0, fld, " " ) |
action = fld[ n-1 ] |
newstate = fld[ n ] |
store( action, newstate ) |
ecct = ecct +1 |
} |
} |
|
END { store( action, newstate ) |
|
if ( enable_index ) { |
printf( "\n/* index name #defines: */\n\n", |
ec, ecct ) |
|
for( ii = 1; ii <= fpeo; ii++ ){ |
printf( "#define %-12s %3d\n", define[ ii ], ii -1 ) |
} |
} |
|
printf( "\n\n/* size of transition table is %d bytes */\n", |
fpe ) |
|
if ( enable_index ) { |
printf( "\nstatic short int %s_offset [ ] ={", array_name ) |
for( ii = 1; ii <= fpeo; ii++ ){ |
if ( (ii % 10) == 1 ) printf("\n ") |
printf( " %4d", entry_offset[ ii ] ) |
if ( ii < fpeo ) printf( "," ) |
} |
printf(" };\n") |
} |
|
printf( "\nstatic char %s_entry [ ] = {", array_name ) |
for( ii = 1; ii <= fpe; ii++ ){ |
if ( (ii % 6) == 1 ) printf("\n ") |
printf( " %-14s", entry[ ii ] ) |
if ( ii < fpe ) printf( "," ) |
} |
printf(" };\n") |
|
} |
|
function store( act, ns ){ |
# printf( "%s %s\n", act, ns ) |
entry[ ++fpe ] = act |
entry[ ++fpe ] = ns |
} |
|
function newtbl( tbl ){ |
if ( not_firstone ) { |
store( action, newstate ) |
} |
not_firstone = 1 |
entry_offset[ ++fpeo ] = fpe # entry tbl offset list |
define[ ++fpdef ] = tbl # state name to define |
} |
/transit/timertr.pre
0,0 → 1,527
COMPILE timertr NOINDEX |
TABLE XXX |
; |
;Transition table for expiring timers: |
; |
;llc state timer retry_c s_flag p_flag action newstate |
; expired >= N2 |
; |
ADM ACK_TIMER 0 0 0 NOP ADM |
ADM ACK_TIMER 0 0 1 NOP ADM |
ADM ACK_TIMER 0 1 0 NOP ADM |
ADM ACK_TIMER 0 1 1 NOP ADM |
ADM ACK_TIMER 1 0 0 NOP ADM |
ADM ACK_TIMER 1 0 1 NOP ADM |
ADM ACK_TIMER 1 1 0 NOP ADM |
ADM ACK_TIMER 1 1 1 NOP ADM |
;; |
ADM P_TIMER 0 0 0 NOP ADM |
ADM P_TIMER 0 0 1 NOP ADM |
ADM P_TIMER 0 1 0 NOP ADM |
ADM P_TIMER 0 1 1 NOP ADM |
ADM P_TIMER 1 0 0 NOP ADM |
ADM P_TIMER 1 0 1 NOP ADM |
ADM P_TIMER 1 1 0 NOP ADM |
ADM P_TIMER 1 1 1 NOP ADM |
;; |
ADM REJ_TIMER 0 0 0 NOP ADM |
ADM REJ_TIMER 0 0 1 NOP ADM |
ADM REJ_TIMER 0 1 0 NOP ADM |
ADM REJ_TIMER 0 1 1 NOP ADM |
ADM REJ_TIMER 1 0 0 NOP ADM |
ADM REJ_TIMER 1 0 1 NOP ADM |
ADM REJ_TIMER 1 1 0 NOP ADM |
ADM REJ_TIMER 1 1 1 NOP ADM |
;; |
ADM BUSY_TIMER 0 0 0 NOP ADM |
ADM BUSY_TIMER 0 0 1 NOP ADM |
ADM BUSY_TIMER 0 1 0 NOP ADM |
ADM BUSY_TIMER 0 1 1 NOP ADM |
ADM BUSY_TIMER 1 0 0 NOP ADM |
ADM BUSY_TIMER 1 0 1 NOP ADM |
ADM BUSY_TIMER 1 1 0 NOP ADM |
ADM BUSY_TIMER 1 1 1 NOP ADM |
;; |
;; |
CONN ACK_TIMER 0 0 0 NOP CONN |
CONN ACK_TIMER 0 0 1 NOP CONN |
CONN ACK_TIMER 0 1 0 NOP CONN |
CONN ACK_TIMER 0 1 1 NOP CONN |
CONN ACK_TIMER 1 0 0 NOP CONN |
CONN ACK_TIMER 1 0 1 NOP CONN |
CONN ACK_TIMER 1 1 0 NOP CONN |
CONN ACK_TIMER 1 1 1 NOP CONN |
;; |
CONN P_TIMER 0 0 0 NOP CONN |
CONN P_TIMER 0 0 1 NOP CONN |
CONN P_TIMER 0 1 0 NOP CONN |
CONN P_TIMER 0 1 1 NOP CONN |
CONN P_TIMER 1 0 0 NOP CONN |
CONN P_TIMER 1 0 1 NOP CONN |
CONN P_TIMER 1 1 0 NOP CONN |
CONN P_TIMER 1 1 1 NOP CONN |
;; |
CONN REJ_TIMER 0 0 0 NOP CONN |
CONN REJ_TIMER 0 0 1 NOP CONN |
CONN REJ_TIMER 0 1 0 NOP CONN |
CONN REJ_TIMER 0 1 1 NOP CONN |
CONN REJ_TIMER 1 0 0 NOP CONN |
CONN REJ_TIMER 1 0 1 NOP CONN |
CONN REJ_TIMER 1 1 0 NOP CONN |
CONN REJ_TIMER 1 1 1 NOP CONN |
;; |
CONN BUSY_TIMER 0 0 0 NOP CONN |
CONN BUSY_TIMER 0 0 1 NOP CONN |
CONN BUSY_TIMER 0 1 0 NOP CONN |
CONN BUSY_TIMER 0 1 1 NOP CONN |
CONN BUSY_TIMER 1 0 0 NOP CONN |
CONN BUSY_TIMER 1 0 1 NOP CONN |
CONN BUSY_TIMER 1 1 0 NOP CONN |
CONN BUSY_TIMER 1 1 1 NOP CONN |
;; |
;; |
RESET_WAIT ACK_TIMER 0 0 0 NOP RESET_WAIT |
RESET_WAIT ACK_TIMER 0 0 1 NOP RESET_WAIT |
RESET_WAIT ACK_TIMER 0 1 0 NOP RESET_WAIT |
RESET_WAIT ACK_TIMER 0 1 1 NOP RESET_WAIT |
RESET_WAIT ACK_TIMER 1 0 0 NOP RESET_WAIT |
RESET_WAIT ACK_TIMER 1 0 1 NOP RESET_WAIT |
RESET_WAIT ACK_TIMER 1 1 0 NOP RESET_WAIT |
RESET_WAIT ACK_TIMER 1 1 1 NOP RESET_WAIT |
;; |
RESET_WAIT P_TIMER 0 0 0 NOP RESET_WAIT |
RESET_WAIT P_TIMER 0 0 1 NOP RESET_WAIT |
RESET_WAIT P_TIMER 0 1 0 NOP RESET_WAIT |
RESET_WAIT P_TIMER 0 1 1 NOP RESET_WAIT |
RESET_WAIT P_TIMER 1 0 0 NOP RESET_WAIT |
RESET_WAIT P_TIMER 1 0 1 NOP RESET_WAIT |
RESET_WAIT P_TIMER 1 1 0 NOP RESET_WAIT |
RESET_WAIT P_TIMER 1 1 1 NOP RESET_WAIT |
;; |
RESET_WAIT REJ_TIMER 0 0 0 NOP RESET_WAIT |
RESET_WAIT REJ_TIMER 0 0 1 NOP RESET_WAIT |
RESET_WAIT REJ_TIMER 0 1 0 NOP RESET_WAIT |
RESET_WAIT REJ_TIMER 0 1 1 NOP RESET_WAIT |
RESET_WAIT REJ_TIMER 1 0 0 NOP RESET_WAIT |
RESET_WAIT REJ_TIMER 1 0 1 NOP RESET_WAIT |
RESET_WAIT REJ_TIMER 1 1 0 NOP RESET_WAIT |
RESET_WAIT REJ_TIMER 1 1 1 NOP RESET_WAIT |
;; |
RESET_WAIT BUSY_TIMER 0 0 0 NOP RESET_WAIT |
RESET_WAIT BUSY_TIMER 0 0 1 NOP RESET_WAIT |
RESET_WAIT BUSY_TIMER 0 1 0 NOP RESET_WAIT |
RESET_WAIT BUSY_TIMER 0 1 1 NOP RESET_WAIT |
RESET_WAIT BUSY_TIMER 1 0 0 NOP RESET_WAIT |
RESET_WAIT BUSY_TIMER 1 0 1 NOP RESET_WAIT |
RESET_WAIT BUSY_TIMER 1 1 0 NOP RESET_WAIT |
RESET_WAIT BUSY_TIMER 1 1 1 NOP RESET_WAIT |
;; |
;; |
RESET_CHECK ACK_TIMER 0 0 0 NOP RESET_CHECK |
RESET_CHECK ACK_TIMER 0 0 1 NOP RESET_CHECK |
RESET_CHECK ACK_TIMER 0 1 0 NOP RESET_CHECK |
RESET_CHECK ACK_TIMER 0 1 1 NOP RESET_CHECK |
RESET_CHECK ACK_TIMER 1 0 0 NOP RESET_CHECK |
RESET_CHECK ACK_TIMER 1 0 1 NOP RESET_CHECK |
RESET_CHECK ACK_TIMER 1 1 0 NOP RESET_CHECK |
RESET_CHECK ACK_TIMER 1 1 1 NOP RESET_CHECK |
;; |
RESET_CHECK P_TIMER 0 0 0 NOP RESET_CHECK |
RESET_CHECK P_TIMER 0 0 1 NOP RESET_CHECK |
RESET_CHECK P_TIMER 0 1 0 NOP RESET_CHECK |
RESET_CHECK P_TIMER 0 1 1 NOP RESET_CHECK |
RESET_CHECK P_TIMER 1 0 0 NOP RESET_CHECK |
RESET_CHECK P_TIMER 1 0 1 NOP RESET_CHECK |
RESET_CHECK P_TIMER 1 1 0 NOP RESET_CHECK |
RESET_CHECK P_TIMER 1 1 1 NOP RESET_CHECK |
;; |
RESET_CHECK REJ_TIMER 0 0 0 NOP RESET_CHECK |
RESET_CHECK REJ_TIMER 0 0 1 NOP RESET_CHECK |
RESET_CHECK REJ_TIMER 0 1 0 NOP RESET_CHECK |
RESET_CHECK REJ_TIMER 0 1 1 NOP RESET_CHECK |
RESET_CHECK REJ_TIMER 1 0 0 NOP RESET_CHECK |
RESET_CHECK REJ_TIMER 1 0 1 NOP RESET_CHECK |
RESET_CHECK REJ_TIMER 1 1 0 NOP RESET_CHECK |
RESET_CHECK REJ_TIMER 1 1 1 NOP RESET_CHECK |
;; |
RESET_CHECK BUSY_TIMER 0 0 0 NOP RESET_CHECK |
RESET_CHECK BUSY_TIMER 0 0 1 NOP RESET_CHECK |
RESET_CHECK BUSY_TIMER 0 1 0 NOP RESET_CHECK |
RESET_CHECK BUSY_TIMER 0 1 1 NOP RESET_CHECK |
RESET_CHECK BUSY_TIMER 1 0 0 NOP RESET_CHECK |
RESET_CHECK BUSY_TIMER 1 0 1 NOP RESET_CHECK |
RESET_CHECK BUSY_TIMER 1 1 0 NOP RESET_CHECK |
RESET_CHECK BUSY_TIMER 1 1 1 NOP RESET_CHECK |
;; |
;; |
;; |
SETUP ACK_TIMER 0 0 0 SETUP7 SETUP |
SETUP ACK_TIMER 0 0 1 SETUP7 SETUP |
SETUP ACK_TIMER 0 1 0 SETUP3 NORMAL |
SETUP ACK_TIMER 0 1 1 SETUP3 NORMAL |
SETUP ACK_TIMER 1 0 0 SETUP8 ADM |
SETUP ACK_TIMER 1 0 1 SETUP8 ADM |
SETUP ACK_TIMER 1 1 0 SETUP3 NORMAL |
SETUP ACK_TIMER 1 1 1 SETUP3 NORMAL |
;; |
SETUP P_TIMER 0 0 0 NOP SETUP |
SETUP P_TIMER 0 0 1 NOP SETUP |
SETUP P_TIMER 0 1 0 NOP SETUP |
SETUP P_TIMER 0 1 1 NOP SETUP |
SETUP P_TIMER 1 0 0 NOP SETUP |
SETUP P_TIMER 1 0 1 NOP SETUP |
SETUP P_TIMER 1 1 0 NOP SETUP |
SETUP P_TIMER 1 1 1 NOP SETUP |
;; |
SETUP REJ_TIMER 0 0 0 NOP SETUP |
SETUP REJ_TIMER 0 0 1 NOP SETUP |
SETUP REJ_TIMER 0 1 0 NOP SETUP |
SETUP REJ_TIMER 0 1 1 NOP SETUP |
SETUP REJ_TIMER 1 0 0 NOP SETUP |
SETUP REJ_TIMER 1 0 1 NOP SETUP |
SETUP REJ_TIMER 1 1 0 NOP SETUP |
SETUP REJ_TIMER 1 1 1 NOP SETUP |
;; |
SETUP BUSY_TIMER 0 0 0 NOP SETUP |
SETUP BUSY_TIMER 0 0 1 NOP SETUP |
SETUP BUSY_TIMER 0 1 0 NOP SETUP |
SETUP BUSY_TIMER 0 1 1 NOP SETUP |
SETUP BUSY_TIMER 1 0 0 NOP SETUP |
SETUP BUSY_TIMER 1 0 1 NOP SETUP |
SETUP BUSY_TIMER 1 1 0 NOP SETUP |
SETUP BUSY_TIMER 1 1 1 NOP SETUP |
;; |
;; |
;; |
RESET ACK_TIMER 0 0 0 RESET7 RESET |
RESET ACK_TIMER 0 0 1 RESET7 RESET |
RESET ACK_TIMER 0 1 0 RESET3 NORMAL |
RESET ACK_TIMER 0 1 1 RESET3 NORMAL |
RESET ACK_TIMER 1 0 0 RESET8 ADM |
RESET ACK_TIMER 1 0 1 RESET8 ADM |
RESET ACK_TIMER 1 1 0 RESET3 NORMAL |
RESET ACK_TIMER 1 1 1 RESET3 NORMAL |
;; |
RESET P_TIMER 0 0 0 NOP RESET |
RESET P_TIMER 0 0 1 NOP RESET |
RESET P_TIMER 0 1 0 NOP RESET |
RESET P_TIMER 0 1 1 NOP RESET |
RESET P_TIMER 1 0 0 NOP RESET |
RESET P_TIMER 1 0 1 NOP RESET |
RESET P_TIMER 1 1 0 NOP RESET |
RESET P_TIMER 1 1 1 NOP RESET |
;; |
RESET REJ_TIMER 0 0 0 NOP RESET |
RESET REJ_TIMER 0 0 1 NOP RESET |
RESET REJ_TIMER 0 1 0 NOP RESET |
RESET REJ_TIMER 0 1 1 NOP RESET |
RESET REJ_TIMER 1 0 0 NOP RESET |
RESET REJ_TIMER 1 0 1 NOP RESET |
RESET REJ_TIMER 1 1 0 NOP RESET |
RESET REJ_TIMER 1 1 1 NOP RESET |
;; |
RESET BUSY_TIMER 0 0 0 NOP RESET |
RESET BUSY_TIMER 0 0 1 NOP RESET |
RESET BUSY_TIMER 0 1 0 NOP RESET |
RESET BUSY_TIMER 0 1 1 NOP RESET |
RESET BUSY_TIMER 1 0 0 NOP RESET |
RESET BUSY_TIMER 1 0 1 NOP RESET |
RESET BUSY_TIMER 1 1 0 NOP RESET |
RESET BUSY_TIMER 1 1 1 NOP RESET |
;; |
;; |
D_CONN ACK_TIMER 0 0 0 D_CONN6 D_CONN |
D_CONN ACK_TIMER 0 0 1 D_CONN6 D_CONN |
D_CONN ACK_TIMER 0 1 0 D_CONN6 D_CONN |
D_CONN ACK_TIMER 0 1 1 D_CONN6 D_CONN |
D_CONN ACK_TIMER 1 0 0 D_CONN7 ADM |
D_CONN ACK_TIMER 1 0 1 D_CONN7 ADM |
D_CONN ACK_TIMER 1 1 0 D_CONN7 ADM |
D_CONN ACK_TIMER 1 1 1 D_CONN7 ADM |
;; |
D_CONN P_TIMER 0 0 0 NOP D_CONN |
D_CONN P_TIMER 0 0 1 NOP D_CONN |
D_CONN P_TIMER 0 1 0 NOP D_CONN |
D_CONN P_TIMER 0 1 1 NOP D_CONN |
D_CONN P_TIMER 1 0 0 NOP D_CONN |
D_CONN P_TIMER 1 0 1 NOP D_CONN |
D_CONN P_TIMER 1 1 0 NOP D_CONN |
D_CONN P_TIMER 1 1 1 NOP D_CONN |
;; |
D_CONN REJ_TIMER 0 0 0 NOP D_CONN |
D_CONN REJ_TIMER 0 0 1 NOP D_CONN |
D_CONN REJ_TIMER 0 1 0 NOP D_CONN |
D_CONN REJ_TIMER 0 1 1 NOP D_CONN |
D_CONN REJ_TIMER 1 0 0 NOP D_CONN |
D_CONN REJ_TIMER 1 0 1 NOP D_CONN |
D_CONN REJ_TIMER 1 1 0 NOP D_CONN |
D_CONN REJ_TIMER 1 1 1 NOP D_CONN |
;; |
D_CONN BUSY_TIMER 0 0 0 NOP D_CONN |
D_CONN BUSY_TIMER 0 0 1 NOP D_CONN |
D_CONN BUSY_TIMER 0 1 0 NOP D_CONN |
D_CONN BUSY_TIMER 0 1 1 NOP D_CONN |
D_CONN BUSY_TIMER 1 0 0 NOP D_CONN |
D_CONN BUSY_TIMER 1 0 1 NOP D_CONN |
D_CONN BUSY_TIMER 1 1 0 NOP D_CONN |
D_CONN BUSY_TIMER 1 1 1 NOP D_CONN |
;; |
;; |
ERROR ACK_TIMER 0 0 0 ERR7 ERROR |
ERROR ACK_TIMER 0 0 1 ERR7 ERROR |
ERROR ACK_TIMER 0 1 0 ERR7 ERROR |
ERROR ACK_TIMER 0 1 1 ERR7 ERROR |
ERROR ACK_TIMER 1 0 0 ERR8 RESET_WAIT |
ERROR ACK_TIMER 1 0 1 ERR8 RESET_WAIT |
ERROR ACK_TIMER 1 1 0 ERR8 RESET_WAIT |
ERROR ACK_TIMER 1 1 1 ERR8 RESET_WAIT |
;; |
ERROR P_TIMER 0 0 0 NOP ERROR |
ERROR P_TIMER 0 0 1 NOP ERROR |
ERROR P_TIMER 0 1 0 NOP ERROR |
ERROR P_TIMER 0 1 1 NOP ERROR |
ERROR P_TIMER 1 0 0 NOP ERROR |
ERROR P_TIMER 1 0 1 NOP ERROR |
ERROR P_TIMER 1 1 0 NOP ERROR |
ERROR P_TIMER 1 1 1 NOP ERROR |
;; |
ERROR REJ_TIMER 0 0 0 NOP ERROR |
ERROR REJ_TIMER 0 0 1 NOP ERROR |
ERROR REJ_TIMER 0 1 0 NOP ERROR |
ERROR REJ_TIMER 0 1 1 NOP ERROR |
ERROR REJ_TIMER 1 0 0 NOP ERROR |
ERROR REJ_TIMER 1 0 1 NOP ERROR |
ERROR REJ_TIMER 1 1 0 NOP ERROR |
ERROR REJ_TIMER 1 1 1 NOP ERROR |
;; |
ERROR BUSY_TIMER 0 0 0 NOP ERROR |
ERROR BUSY_TIMER 0 0 1 NOP ERROR |
ERROR BUSY_TIMER 0 1 0 NOP ERROR |
ERROR BUSY_TIMER 0 1 1 NOP ERROR |
ERROR BUSY_TIMER 1 0 0 NOP ERROR |
ERROR BUSY_TIMER 1 0 1 NOP ERROR |
ERROR BUSY_TIMER 1 1 0 NOP ERROR |
ERROR BUSY_TIMER 1 1 1 NOP ERROR |
;; |
;; |
NORMAL ACK_TIMER 0 0 0 NORMAL20 AWAIT |
NORMAL ACK_TIMER 0 0 1 NOP NORMAL |
NORMAL ACK_TIMER 0 1 0 NORMAL20 AWAIT |
NORMAL ACK_TIMER 0 1 1 NOP NORMAL |
NORMAL ACK_TIMER 1 0 0 SH11 RESET_WAIT |
NORMAL ACK_TIMER 1 0 1 SH11 RESET_WAIT |
NORMAL ACK_TIMER 1 1 0 SH11 RESET_WAIT |
NORMAL ACK_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
NORMAL P_TIMER 0 0 0 NORMAL19 NORMAL |
NORMAL P_TIMER 0 0 1 NORMAL19 NORMAL |
NORMAL P_TIMER 0 1 0 NORMAL19 NORMAL |
NORMAL P_TIMER 0 1 1 NORMAL19 NORMAL |
NORMAL P_TIMER 1 0 0 SH11 RESET_WAIT |
NORMAL P_TIMER 1 0 1 SH11 RESET_WAIT |
NORMAL P_TIMER 1 1 0 SH11 RESET_WAIT |
NORMAL P_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
NORMAL REJ_TIMER 0 0 0 NOP NORMAL |
NORMAL REJ_TIMER 0 0 1 NOP NORMAL |
NORMAL REJ_TIMER 0 1 0 NOP NORMAL |
NORMAL REJ_TIMER 0 1 1 NOP NORMAL |
NORMAL REJ_TIMER 1 0 0 SH11 RESET_WAIT |
NORMAL REJ_TIMER 1 0 1 SH11 RESET_WAIT |
NORMAL REJ_TIMER 1 1 0 SH11 RESET_WAIT |
NORMAL REJ_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
NORMAL BUSY_TIMER 0 0 0 NORMAL20 AWAIT |
NORMAL BUSY_TIMER 0 0 1 NOP NORMAL |
NORMAL BUSY_TIMER 0 1 0 NORMAL20 AWAIT |
NORMAL BUSY_TIMER 0 1 1 NOP NORMAL |
NORMAL BUSY_TIMER 1 0 0 SH11 RESET_WAIT |
NORMAL BUSY_TIMER 1 0 1 SH11 RESET_WAIT |
NORMAL BUSY_TIMER 1 1 0 SH11 RESET_WAIT |
NORMAL BUSY_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
;; |
BUSY ACK_TIMER 0 0 0 BUSY24 AWAIT_BUSY |
BUSY ACK_TIMER 0 0 1 NOP BUSY |
BUSY ACK_TIMER 0 1 0 BUSY24 AWAIT_BUSY |
BUSY ACK_TIMER 0 1 1 NOP BUSY |
BUSY ACK_TIMER 1 0 0 SH11 RESET_WAIT |
BUSY ACK_TIMER 1 0 1 SH11 RESET_WAIT |
BUSY ACK_TIMER 1 1 0 SH11 RESET_WAIT |
BUSY ACK_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
BUSY P_TIMER 0 0 0 BUSY23 BUSY |
BUSY P_TIMER 0 0 1 BUSY23 BUSY |
BUSY P_TIMER 0 1 0 BUSY23 BUSY |
BUSY P_TIMER 0 1 1 BUSY23 BUSY |
BUSY P_TIMER 1 0 0 SH11 RESET_WAIT |
BUSY P_TIMER 1 0 1 SH11 RESET_WAIT |
BUSY P_TIMER 1 1 0 SH11 RESET_WAIT |
BUSY P_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
BUSY REJ_TIMER 0 0 0 BUSY25 BUSY |
BUSY REJ_TIMER 0 0 1 BUSY26 BUSY |
BUSY REJ_TIMER 0 1 0 BUSY25 BUSY |
BUSY REJ_TIMER 0 1 1 BUSY26 BUSY |
BUSY REJ_TIMER 1 0 0 SH11 RESET_WAIT |
BUSY REJ_TIMER 1 0 1 SH11 RESET_WAIT |
BUSY REJ_TIMER 1 1 0 SH11 RESET_WAIT |
BUSY REJ_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
BUSY BUSY_TIMER 0 0 0 NOP BUSY |
BUSY BUSY_TIMER 0 0 1 NOP BUSY |
BUSY BUSY_TIMER 0 1 0 NOP BUSY |
BUSY BUSY_TIMER 0 1 1 NOP BUSY |
BUSY BUSY_TIMER 1 0 0 SH11 RESET_WAIT |
BUSY BUSY_TIMER 1 0 1 SH11 RESET_WAIT |
BUSY BUSY_TIMER 1 1 0 SH11 RESET_WAIT |
BUSY BUSY_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
;; |
REJECT ACK_TIMER 0 0 0 NOP REJECT |
REJECT ACK_TIMER 0 0 1 NOP REJECT |
REJECT ACK_TIMER 0 1 0 NOP REJECT |
REJECT ACK_TIMER 0 1 1 NOP REJECT |
REJECT ACK_TIMER 1 0 0 SH11 RESET_WAIT |
REJECT ACK_TIMER 1 0 1 SH11 RESET_WAIT |
REJECT ACK_TIMER 1 1 0 SH11 RESET_WAIT |
REJECT ACK_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
REJECT P_TIMER 0 0 0 NOP REJECT |
REJECT P_TIMER 0 0 1 NOP REJECT |
REJECT P_TIMER 0 1 0 NOP REJECT |
REJECT P_TIMER 0 1 1 NOP REJECT |
REJECT P_TIMER 1 0 0 SH11 RESET_WAIT |
REJECT P_TIMER 1 0 1 SH11 RESET_WAIT |
REJECT P_TIMER 1 1 0 SH11 RESET_WAIT |
REJECT P_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
REJECT REJ_TIMER 0 0 0 NOP REJECT |
REJECT REJ_TIMER 0 0 1 NOP REJECT |
REJECT REJ_TIMER 0 1 0 NOP REJECT |
REJECT REJ_TIMER 0 1 1 NOP REJECT |
REJECT REJ_TIMER 1 0 0 SH11 RESET_WAIT |
REJECT REJ_TIMER 1 0 1 SH11 RESET_WAIT |
REJECT REJ_TIMER 1 1 0 SH11 RESET_WAIT |
REJECT REJ_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
REJECT BUSY_TIMER 0 0 0 NOP REJECT |
REJECT BUSY_TIMER 0 0 1 NOP REJECT |
REJECT BUSY_TIMER 0 1 0 NOP REJECT |
REJECT BUSY_TIMER 0 1 1 NOP REJECT |
REJECT BUSY_TIMER 1 0 0 SH11 RESET_WAIT |
REJECT BUSY_TIMER 1 0 1 SH11 RESET_WAIT |
REJECT BUSY_TIMER 1 1 0 SH11 RESET_WAIT |
REJECT BUSY_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
;; |
AWAIT ACK_TIMER 0 0 0 NOP AWAIT |
AWAIT ACK_TIMER 0 0 1 NOP AWAIT |
AWAIT ACK_TIMER 0 1 0 NOP AWAIT |
AWAIT ACK_TIMER 0 1 1 NOP AWAIT |
AWAIT ACK_TIMER 1 0 0 SH11 RESET_WAIT |
AWAIT ACK_TIMER 1 0 1 SH11 RESET_WAIT |
AWAIT ACK_TIMER 1 1 0 SH11 RESET_WAIT |
AWAIT ACK_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
AWAIT P_TIMER 0 0 0 NOP AWAIT |
AWAIT P_TIMER 0 0 1 NOP AWAIT |
AWAIT P_TIMER 0 1 0 NOP AWAIT |
AWAIT P_TIMER 0 1 1 NOP AWAIT |
AWAIT P_TIMER 1 0 0 SH11 RESET_WAIT |
AWAIT P_TIMER 1 0 1 SH11 RESET_WAIT |
AWAIT P_TIMER 1 1 0 SH11 RESET_WAIT |
AWAIT P_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
AWAIT REJ_TIMER 0 0 0 NOP AWAIT |
AWAIT REJ_TIMER 0 0 1 NOP AWAIT |
AWAIT REJ_TIMER 0 1 0 NOP AWAIT |
AWAIT REJ_TIMER 0 1 1 NOP AWAIT |
AWAIT REJ_TIMER 1 0 0 SH11 RESET_WAIT |
AWAIT REJ_TIMER 1 0 1 SH11 RESET_WAIT |
AWAIT REJ_TIMER 1 1 0 SH11 RESET_WAIT |
AWAIT REJ_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
AWAIT BUSY_TIMER 0 0 0 NOP AWAIT |
AWAIT BUSY_TIMER 0 0 1 NOP AWAIT |
AWAIT BUSY_TIMER 0 1 0 NOP AWAIT |
AWAIT BUSY_TIMER 0 1 1 NOP AWAIT |
AWAIT BUSY_TIMER 1 0 0 SH11 RESET_WAIT |
AWAIT BUSY_TIMER 1 0 1 SH11 RESET_WAIT |
AWAIT BUSY_TIMER 1 1 0 SH11 RESET_WAIT |
AWAIT BUSY_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
;; |
AWAIT_BUSY ACK_TIMER 0 0 0 NOP AWAIT_BUSY |
AWAIT_BUSY ACK_TIMER 0 0 1 NOP AWAIT_BUSY |
AWAIT_BUSY ACK_TIMER 0 1 0 NOP AWAIT_BUSY |
AWAIT_BUSY ACK_TIMER 0 1 1 NOP AWAIT_BUSY |
AWAIT_BUSY ACK_TIMER 1 0 0 SH11 RESET_WAIT |
AWAIT_BUSY ACK_TIMER 1 0 1 SH11 RESET_WAIT |
AWAIT_BUSY ACK_TIMER 1 1 0 SH11 RESET_WAIT |
AWAIT_BUSY ACK_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
AWAIT_BUSY P_TIMER 0 0 0 NOP AWAIT_BUSY |
AWAIT_BUSY P_TIMER 0 0 1 NOP AWAIT_BUSY |
AWAIT_BUSY P_TIMER 0 1 0 NOP AWAIT_BUSY |
AWAIT_BUSY P_TIMER 0 1 1 NOP AWAIT_BUSY |
AWAIT_BUSY P_TIMER 1 0 0 SH11 RESET_WAIT |
AWAIT_BUSY P_TIMER 1 0 1 SH11 RESET_WAIT |
AWAIT_BUSY P_TIMER 1 1 0 SH11 RESET_WAIT |
AWAIT_BUSY P_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
AWAIT_BUSY REJ_TIMER 0 0 0 NOP AWAIT_BUSY |
AWAIT_BUSY REJ_TIMER 0 0 1 NOP AWAIT_BUSY |
AWAIT_BUSY REJ_TIMER 0 1 0 NOP AWAIT_BUSY |
AWAIT_BUSY REJ_TIMER 0 1 1 NOP AWAIT_BUSY |
AWAIT_BUSY REJ_TIMER 1 0 0 SH11 RESET_WAIT |
AWAIT_BUSY REJ_TIMER 1 0 1 SH11 RESET_WAIT |
AWAIT_BUSY REJ_TIMER 1 1 0 SH11 RESET_WAIT |
AWAIT_BUSY REJ_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
AWAIT_BUSY BUSY_TIMER 0 0 0 NOP AWAIT_BUSY |
AWAIT_BUSY BUSY_TIMER 0 0 1 NOP AWAIT_BUSY |
AWAIT_BUSY BUSY_TIMER 0 1 0 NOP AWAIT_BUSY |
AWAIT_BUSY BUSY_TIMER 0 1 1 NOP AWAIT_BUSY |
AWAIT_BUSY BUSY_TIMER 1 0 0 SH11 RESET_WAIT |
AWAIT_BUSY BUSY_TIMER 1 0 1 SH11 RESET_WAIT |
AWAIT_BUSY BUSY_TIMER 1 1 0 SH11 RESET_WAIT |
AWAIT_BUSY BUSY_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
;; |
AWAIT_REJECT ACK_TIMER 0 0 0 NOP AWAIT_REJECT |
AWAIT_REJECT ACK_TIMER 0 0 1 NOP AWAIT_REJECT |
AWAIT_REJECT ACK_TIMER 0 1 0 NOP AWAIT_REJECT |
AWAIT_REJECT ACK_TIMER 0 1 1 NOP AWAIT_REJECT |
AWAIT_REJECT ACK_TIMER 1 0 0 SH11 RESET_WAIT |
AWAIT_REJECT ACK_TIMER 1 0 1 SH11 RESET_WAIT |
AWAIT_REJECT ACK_TIMER 1 1 0 SH11 RESET_WAIT |
AWAIT_REJECT ACK_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
AWAIT_REJECT P_TIMER 0 0 0 NOP AWAIT_REJECT |
AWAIT_REJECT P_TIMER 0 0 1 NOP AWAIT_REJECT |
AWAIT_REJECT P_TIMER 0 1 0 NOP AWAIT_REJECT |
AWAIT_REJECT P_TIMER 0 1 1 NOP AWAIT_REJECT |
AWAIT_REJECT P_TIMER 1 0 0 SH11 RESET_WAIT |
AWAIT_REJECT P_TIMER 1 0 1 SH11 RESET_WAIT |
AWAIT_REJECT P_TIMER 1 1 0 SH11 RESET_WAIT |
AWAIT_REJECT P_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
AWAIT_REJECT REJ_TIMER 0 0 0 NOP AWAIT_REJECT |
AWAIT_REJECT REJ_TIMER 0 0 1 NOP AWAIT_REJECT |
AWAIT_REJECT REJ_TIMER 0 1 0 NOP AWAIT_REJECT |
AWAIT_REJECT REJ_TIMER 0 1 1 NOP AWAIT_REJECT |
AWAIT_REJECT REJ_TIMER 1 0 0 SH11 RESET_WAIT |
AWAIT_REJECT REJ_TIMER 1 0 1 SH11 RESET_WAIT |
AWAIT_REJECT REJ_TIMER 1 1 0 SH11 RESET_WAIT |
AWAIT_REJECT REJ_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
AWAIT_REJECT BUSY_TIMER 0 0 0 NOP AWAIT_REJECT |
AWAIT_REJECT BUSY_TIMER 0 0 1 NOP AWAIT_REJECT |
AWAIT_REJECT BUSY_TIMER 0 1 0 NOP AWAIT_REJECT |
AWAIT_REJECT BUSY_TIMER 0 1 1 NOP AWAIT_REJECT |
AWAIT_REJECT BUSY_TIMER 1 0 0 SH11 RESET_WAIT |
AWAIT_REJECT BUSY_TIMER 1 0 1 SH11 RESET_WAIT |
AWAIT_REJECT BUSY_TIMER 1 1 0 SH11 RESET_WAIT |
AWAIT_REJECT BUSY_TIMER 1 1 1 SH11 RESET_WAIT |
;; |
/transit/timertr.h
0,0 → 1,157
|
/* this file was generated on Thu Jan 8 00:21:21 GMT 1998 */ |
|
|
/* size of transition table is 898 bytes */ |
|
static char timertr_entry [ ] = { |
NOP , ADM , NOP , ADM , NOP , ADM , |
NOP , ADM , NOP , ADM , NOP , ADM , |
NOP , ADM , NOP , ADM , NOP , ADM , |
NOP , ADM , NOP , ADM , NOP , ADM , |
NOP , ADM , NOP , ADM , NOP , ADM , |
NOP , ADM , NOP , ADM , NOP , ADM , |
NOP , ADM , NOP , ADM , NOP , ADM , |
NOP , ADM , NOP , ADM , NOP , ADM , |
NOP , ADM , NOP , ADM , NOP , ADM , |
NOP , ADM , NOP , ADM , NOP , ADM , |
NOP , ADM , NOP , ADM , NOP , CONN , |
NOP , CONN , NOP , CONN , NOP , CONN , |
NOP , CONN , NOP , CONN , NOP , CONN , |
NOP , CONN , NOP , CONN , NOP , CONN , |
NOP , CONN , NOP , CONN , NOP , CONN , |
NOP , CONN , NOP , CONN , NOP , CONN , |
NOP , CONN , NOP , CONN , NOP , CONN , |
NOP , CONN , NOP , CONN , NOP , CONN , |
NOP , CONN , NOP , CONN , NOP , CONN , |
NOP , CONN , NOP , CONN , NOP , CONN , |
NOP , CONN , NOP , CONN , NOP , CONN , |
NOP , CONN , NOP , RESET_WAIT , NOP , RESET_WAIT , |
NOP , RESET_WAIT , NOP , RESET_WAIT , NOP , RESET_WAIT , |
NOP , RESET_WAIT , NOP , RESET_WAIT , NOP , RESET_WAIT , |
NOP , RESET_WAIT , NOP , RESET_WAIT , NOP , RESET_WAIT , |
NOP , RESET_WAIT , NOP , RESET_WAIT , NOP , RESET_WAIT , |
NOP , RESET_WAIT , NOP , RESET_WAIT , NOP , RESET_WAIT , |
NOP , RESET_WAIT , NOP , RESET_WAIT , NOP , RESET_WAIT , |
NOP , RESET_WAIT , NOP , RESET_WAIT , NOP , RESET_WAIT , |
NOP , RESET_WAIT , NOP , RESET_WAIT , NOP , RESET_WAIT , |
NOP , RESET_WAIT , NOP , RESET_WAIT , NOP , RESET_WAIT , |
NOP , RESET_WAIT , NOP , RESET_WAIT , NOP , RESET_WAIT , |
NOP , RESET_CHECK , NOP , RESET_CHECK , NOP , RESET_CHECK , |
NOP , RESET_CHECK , NOP , RESET_CHECK , NOP , RESET_CHECK , |
NOP , RESET_CHECK , NOP , RESET_CHECK , NOP , RESET_CHECK , |
NOP , RESET_CHECK , NOP , RESET_CHECK , NOP , RESET_CHECK , |
NOP , RESET_CHECK , NOP , RESET_CHECK , NOP , RESET_CHECK , |
NOP , RESET_CHECK , NOP , RESET_CHECK , NOP , RESET_CHECK , |
NOP , RESET_CHECK , NOP , RESET_CHECK , NOP , RESET_CHECK , |
NOP , RESET_CHECK , NOP , RESET_CHECK , NOP , RESET_CHECK , |
NOP , RESET_CHECK , NOP , RESET_CHECK , NOP , RESET_CHECK , |
NOP , RESET_CHECK , NOP , RESET_CHECK , NOP , RESET_CHECK , |
NOP , RESET_CHECK , NOP , RESET_CHECK , SETUP7 , SETUP , |
SETUP7 , SETUP , SETUP3 , NORMAL , SETUP3 , NORMAL , |
SETUP8 , ADM , SETUP8 , ADM , SETUP3 , NORMAL , |
SETUP3 , NORMAL , NOP , SETUP , NOP , SETUP , |
NOP , SETUP , NOP , SETUP , NOP , SETUP , |
NOP , SETUP , NOP , SETUP , NOP , SETUP , |
NOP , SETUP , NOP , SETUP , NOP , SETUP , |
NOP , SETUP , NOP , SETUP , NOP , SETUP , |
NOP , SETUP , NOP , SETUP , NOP , SETUP , |
NOP , SETUP , NOP , SETUP , NOP , SETUP , |
NOP , SETUP , NOP , SETUP , NOP , SETUP , |
NOP , SETUP , RESET7 , RESET , RESET7 , RESET , |
RESET3 , NORMAL , RESET3 , NORMAL , RESET8 , ADM , |
RESET8 , ADM , RESET3 , NORMAL , RESET3 , NORMAL , |
NOP , RESET , NOP , RESET , NOP , RESET , |
NOP , RESET , NOP , RESET , NOP , RESET , |
NOP , RESET , NOP , RESET , NOP , RESET , |
NOP , RESET , NOP , RESET , NOP , RESET , |
NOP , RESET , NOP , RESET , NOP , RESET , |
NOP , RESET , NOP , RESET , NOP , RESET , |
NOP , RESET , NOP , RESET , NOP , RESET , |
NOP , RESET , NOP , RESET , NOP , RESET , |
D_CONN6 , D_CONN , D_CONN6 , D_CONN , D_CONN6 , D_CONN , |
D_CONN6 , D_CONN , D_CONN7 , ADM , D_CONN7 , ADM , |
D_CONN7 , ADM , D_CONN7 , ADM , NOP , D_CONN , |
NOP , D_CONN , NOP , D_CONN , NOP , D_CONN , |
NOP , D_CONN , NOP , D_CONN , NOP , D_CONN , |
NOP , D_CONN , NOP , D_CONN , NOP , D_CONN , |
NOP , D_CONN , NOP , D_CONN , NOP , D_CONN , |
NOP , D_CONN , NOP , D_CONN , NOP , D_CONN , |
NOP , D_CONN , NOP , D_CONN , NOP , D_CONN , |
NOP , D_CONN , NOP , D_CONN , NOP , D_CONN , |
NOP , D_CONN , NOP , D_CONN , ERR7 , ERROR , |
ERR7 , ERROR , ERR7 , ERROR , ERR7 , ERROR , |
ERR8 , RESET_WAIT , ERR8 , RESET_WAIT , ERR8 , RESET_WAIT , |
ERR8 , RESET_WAIT , NOP , ERROR , NOP , ERROR , |
NOP , ERROR , NOP , ERROR , NOP , ERROR , |
NOP , ERROR , NOP , ERROR , NOP , ERROR , |
NOP , ERROR , NOP , ERROR , NOP , ERROR , |
NOP , ERROR , NOP , ERROR , NOP , ERROR , |
NOP , ERROR , NOP , ERROR , NOP , ERROR , |
NOP , ERROR , NOP , ERROR , NOP , ERROR , |
NOP , ERROR , NOP , ERROR , NOP , ERROR , |
NOP , ERROR , NORMAL20 , AWAIT , NOP , NORMAL , |
NORMAL20 , AWAIT , NOP , NORMAL , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
NORMAL19 , NORMAL , NORMAL19 , NORMAL , NORMAL19 , NORMAL , |
NORMAL19 , NORMAL , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , NOP , NORMAL , |
NOP , NORMAL , NOP , NORMAL , NOP , NORMAL , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , NORMAL20 , AWAIT , NOP , NORMAL , |
NORMAL20 , AWAIT , NOP , NORMAL , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
BUSY24 , AWAIT_BUSY , NOP , BUSY , BUSY24 , AWAIT_BUSY , |
NOP , BUSY , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , BUSY23 , BUSY , |
BUSY23 , BUSY , BUSY23 , BUSY , BUSY23 , BUSY , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , BUSY25 , BUSY , BUSY26 , BUSY , |
BUSY25 , BUSY , BUSY26 , BUSY , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
NOP , BUSY , NOP , BUSY , NOP , BUSY , |
NOP , BUSY , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , NOP , REJECT , |
NOP , REJECT , NOP , REJECT , NOP , REJECT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , NOP , REJECT , NOP , REJECT , |
NOP , REJECT , NOP , REJECT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
NOP , REJECT , NOP , REJECT , NOP , REJECT , |
NOP , REJECT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , NOP , REJECT , |
NOP , REJECT , NOP , REJECT , NOP , REJECT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , NOP , AWAIT , NOP , AWAIT , |
NOP , AWAIT , NOP , AWAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
NOP , AWAIT , NOP , AWAIT , NOP , AWAIT , |
NOP , AWAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , NOP , AWAIT , |
NOP , AWAIT , NOP , AWAIT , NOP , AWAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , NOP , AWAIT , NOP , AWAIT , |
NOP , AWAIT , NOP , AWAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
NOP , AWAIT_BUSY , NOP , AWAIT_BUSY , NOP , AWAIT_BUSY , |
NOP , AWAIT_BUSY , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , NOP , AWAIT_BUSY , |
NOP , AWAIT_BUSY , NOP , AWAIT_BUSY , NOP , AWAIT_BUSY , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , NOP , AWAIT_BUSY , NOP , AWAIT_BUSY , |
NOP , AWAIT_BUSY , NOP , AWAIT_BUSY , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
NOP , AWAIT_BUSY , NOP , AWAIT_BUSY , NOP , AWAIT_BUSY , |
NOP , AWAIT_BUSY , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , NOP , AWAIT_REJECT , |
NOP , AWAIT_REJECT , NOP , AWAIT_REJECT , NOP , AWAIT_REJECT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , NOP , AWAIT_REJECT , NOP , AWAIT_REJECT , |
NOP , AWAIT_REJECT , NOP , AWAIT_REJECT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
NOP , AWAIT_REJECT , NOP , AWAIT_REJECT , NOP , AWAIT_REJECT , |
NOP , AWAIT_REJECT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , NOP , AWAIT_REJECT , |
NOP , AWAIT_REJECT , NOP , AWAIT_REJECT , NOP , AWAIT_REJECT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT , SH11 , RESET_WAIT , |
SH11 , RESET_WAIT , SH11 , RESET_WAIT }; |
/transit/Makefile
0,0 → 1,13
include $(TOPDIR)/Rules.make |
|
all: pdutr.h timertr.h |
|
pdutr.h: pdutr.pre compile.awk |
awk -f ./compile.awk pdutr.pre > pdutr.h |
|
timertr.h: timertr.pre compile.awk |
awk -f ./compile.awk timertr.pre > timertr.h |
|
clean: |
touch pdutr.h timertr.h |
rm pdutr.h timertr.h |
/fddi.c
0,0 → 1,166
/* |
* INET An implementation of the TCP/IP protocol suite for the LINUX |
* operating system. INET is implemented using the BSD Socket |
* interface as the means of communication with the user level. |
* |
* FDDI-type device handling. |
* |
* Version: @(#)fddi.c 1.0.0 08/12/96 |
* |
* Authors: Lawrence V. Stefani, <stefani@lkg.dec.com> |
* |
* fddi.c is based on previous eth.c and tr.c work by |
* Ross Biro, <bir7@leland.Stanford.Edu> |
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> |
* Mark Evans, <evansmp@uhura.aston.ac.uk> |
* Florian La Roche, <rzsfl@rz.uni-sb.de> |
* Alan Cox, <gw4pts@gw4pts.ampr.org> |
* |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU General Public License |
* as published by the Free Software Foundation; either version |
* 2 of the License, or (at your option) any later version. |
* |
* Changes |
* Alan Cox : New arp/rebuild header |
* Maciej W. Rozycki : IPv6 support |
*/ |
|
#include <linux/config.h> |
#include <asm/segment.h> |
#include <asm/system.h> |
#include <linux/types.h> |
#include <linux/kernel.h> |
#include <linux/sched.h> |
#include <linux/string.h> |
#include <linux/mm.h> |
#include <linux/socket.h> |
#include <linux/in.h> |
#include <linux/inet.h> |
#include <linux/netdevice.h> |
#include <linux/fddidevice.h> |
#include <linux/if_ether.h> |
#include <linux/skbuff.h> |
#include <linux/errno.h> |
#include <net/arp.h> |
#include <net/sock.h> |
|
/* |
* Create the FDDI MAC header for an arbitrary protocol layer |
* |
* saddr=NULL means use device source address |
* daddr=NULL means leave destination address (eg unresolved arp) |
*/ |
|
int fddi_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, |
void *daddr, void *saddr, unsigned len) |
{ |
int hl = FDDI_K_SNAP_HLEN; |
struct fddihdr *fddi; |
|
if(type != ETH_P_IP && type != ETH_P_IPV6 && type != ETH_P_ARP) |
hl=FDDI_K_8022_HLEN-3; |
fddi = (struct fddihdr *)skb_push(skb, hl); |
fddi->fc = FDDI_FC_K_ASYNC_LLC_DEF; |
if(type == ETH_P_IP || type == ETH_P_IPV6 || type == ETH_P_ARP) |
{ |
fddi->hdr.llc_snap.dsap = FDDI_EXTENDED_SAP; |
fddi->hdr.llc_snap.ssap = FDDI_EXTENDED_SAP; |
fddi->hdr.llc_snap.ctrl = FDDI_UI_CMD; |
fddi->hdr.llc_snap.oui[0] = 0x00; |
fddi->hdr.llc_snap.oui[1] = 0x00; |
fddi->hdr.llc_snap.oui[2] = 0x00; |
fddi->hdr.llc_snap.ethertype = htons(type); |
} |
|
/* Set the source and destination hardware addresses */ |
|
if (saddr != NULL) |
memcpy(fddi->saddr, saddr, dev->addr_len); |
else |
memcpy(fddi->saddr, dev->dev_addr, dev->addr_len); |
|
if (daddr != NULL) |
{ |
memcpy(fddi->daddr, daddr, dev->addr_len); |
return(hl); |
} |
|
return(-hl); |
} |
|
|
/* |
* Rebuild the FDDI MAC header. This is called after an ARP |
* (or in future other address resolution) has completed on |
* this sk_buff. We now let ARP fill in the other fields. |
*/ |
|
int fddi_rebuild_header(struct sk_buff *skb) |
{ |
struct fddihdr *fddi = (struct fddihdr *)skb->data; |
|
#ifdef CONFIG_INET |
if (fddi->hdr.llc_snap.ethertype == __constant_htons(ETH_P_IP)) |
/* Try to get ARP to resolve the header and fill destination address */ |
return arp_find(fddi->daddr, skb); |
else |
#endif |
{ |
printk("%s: Don't know how to resolve type %02X addresses.\n", |
skb->dev->name, htons(fddi->hdr.llc_snap.ethertype)); |
return(0); |
} |
} |
|
|
/* |
* Determine the packet's protocol ID and fill in skb fields. |
* This routine is called before an incoming packet is passed |
* up. It's used to fill in specific skb fields and to set |
* the proper pointer to the start of packet data (skb->data). |
*/ |
|
unsigned short fddi_type_trans(struct sk_buff *skb, struct net_device *dev) |
{ |
struct fddihdr *fddi = (struct fddihdr *)skb->data; |
unsigned short type; |
|
/* |
* Set mac.raw field to point to FC byte, set data field to point |
* to start of packet data. Assume 802.2 SNAP frames for now. |
*/ |
|
skb->mac.raw = skb->data; /* point to frame control (FC) */ |
|
if(fddi->hdr.llc_8022_1.dsap==0xe0) |
{ |
skb_pull(skb, FDDI_K_8022_HLEN-3); |
type = __constant_htons(ETH_P_802_2); |
} |
else |
{ |
skb_pull(skb, FDDI_K_SNAP_HLEN); /* adjust for 21 byte header */ |
type=fddi->hdr.llc_snap.ethertype; |
} |
|
/* Set packet type based on destination address and flag settings */ |
|
if (*fddi->daddr & 0x01) |
{ |
if (memcmp(fddi->daddr, dev->broadcast, FDDI_K_ALEN) == 0) |
skb->pkt_type = PACKET_BROADCAST; |
else |
skb->pkt_type = PACKET_MULTICAST; |
} |
|
else if (dev->flags & IFF_PROMISC) |
{ |
if (memcmp(fddi->daddr, dev->dev_addr, FDDI_K_ALEN)) |
skb->pkt_type = PACKET_OTHERHOST; |
} |
|
/* Assume 802.2 SNAP frames, for now */ |
|
return(type); |
} |
/hippi.c
0,0 → 1,154
/* |
* INET An implementation of the TCP/IP protocol suite for the LINUX |
* operating system. INET is implemented using the BSD Socket |
* interface as the means of communication with the user level. |
* |
* HIPPI-type device handling. |
* |
* Version: @(#)hippi.c 1.0.0 05/29/97 |
* |
* Authors: Ross Biro, <bir7@leland.Stanford.Edu> |
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> |
* Mark Evans, <evansmp@uhura.aston.ac.uk> |
* Florian La Roche, <rzsfl@rz.uni-sb.de> |
* Alan Cox, <gw4pts@gw4pts.ampr.org> |
* Jes Sorensen, <Jes.Sorensen@cern.ch> |
* |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU General Public License |
* as published by the Free Software Foundation; either version |
* 2 of the License, or (at your option) any later version. |
*/ |
|
#include <linux/types.h> |
#include <linux/kernel.h> |
#include <linux/sched.h> |
#include <linux/string.h> |
#include <linux/mm.h> |
#include <linux/socket.h> |
#include <linux/in.h> |
#include <linux/inet.h> |
#include <linux/netdevice.h> |
#include <linux/hippidevice.h> |
#include <linux/skbuff.h> |
#include <linux/errno.h> |
#include <net/arp.h> |
#include <net/sock.h> |
#include <asm/uaccess.h> |
#include <asm/checksum.h> |
#include <asm/segment.h> |
#include <asm/system.h> |
|
/* |
* hippi_net_init() |
* |
* Do nothing, this is just to pursuade the stupid linker to behave. |
*/ |
|
void hippi_net_init(void) |
{ |
return; |
} |
|
/* |
* Create the HIPPI MAC header for an arbitrary protocol layer |
* |
* saddr=NULL means use device source address |
* daddr=NULL means leave destination address (eg unresolved arp) |
*/ |
|
int hippi_header(struct sk_buff *skb, struct net_device *dev, |
unsigned short type, void *daddr, void *saddr, |
unsigned len) |
{ |
struct hippi_hdr *hip = (struct hippi_hdr *)skb_push(skb, HIPPI_HLEN); |
|
if (!len){ |
len = skb->len - HIPPI_HLEN; |
printk("hippi_header(): length not supplied\n"); |
} |
|
/* |
* Due to the stupidity of the little endian byte-order we |
* have to set the fp field this way. |
*/ |
hip->fp.fixed = __constant_htonl(0x04800018); |
hip->fp.d2_size = htonl(len + 8); |
hip->le.fc = 0; |
hip->le.double_wide = 0; /* only HIPPI 800 for the time being */ |
hip->le.message_type = 0; /* Data PDU */ |
|
hip->le.dest_addr_type = 2; /* 12 bit SC address */ |
hip->le.src_addr_type = 2; /* 12 bit SC address */ |
|
memcpy(hip->le.src_switch_addr, dev->dev_addr + 3, 3); |
memset(&hip->le.reserved, 0, 16); |
|
hip->snap.dsap = HIPPI_EXTENDED_SAP; |
hip->snap.ssap = HIPPI_EXTENDED_SAP; |
hip->snap.ctrl = HIPPI_UI_CMD; |
hip->snap.oui[0] = 0x00; |
hip->snap.oui[1] = 0x00; |
hip->snap.oui[2] = 0x00; |
hip->snap.ethertype = htons(type); |
|
if (daddr) |
{ |
memcpy(hip->le.dest_switch_addr, daddr + 3, 3); |
memcpy(&skb->private.ifield, daddr + 2, 4); |
return HIPPI_HLEN; |
} |
return -((int)HIPPI_HLEN); |
} |
|
|
/* |
* Rebuild the HIPPI MAC header. This is called after an ARP has |
* completed on this sk_buff. We now let ARP fill in the other fields. |
*/ |
|
int hippi_rebuild_header(struct sk_buff *skb) |
{ |
struct hippi_hdr *hip = (struct hippi_hdr *)skb->data; |
|
/* |
* Only IP is currently supported |
*/ |
|
if(hip->snap.ethertype != __constant_htons(ETH_P_IP)) |
{ |
printk(KERN_DEBUG "%s: unable to resolve type %X addresses.\n",skb->dev->name,ntohs(hip->snap.ethertype)); |
return 0; |
} |
|
/* |
* We don't support dynamic ARP on HIPPI, but we use the ARP |
* static ARP tables to hold the I-FIELDs. |
*/ |
return arp_find(hip->le.daddr, skb); |
} |
|
|
/* |
* Determine the packet's protocol ID. |
*/ |
|
unsigned short hippi_type_trans(struct sk_buff *skb, struct net_device *dev) |
{ |
struct hippi_hdr *hip; |
|
hip = (struct hippi_hdr *) skb->data; |
|
/* |
* This is actually wrong ... question is if we really should |
* set the raw address here. |
*/ |
skb->mac.raw = skb->data; |
skb_pull(skb, HIPPI_HLEN); |
|
/* |
* No fancy promisc stuff here now. |
*/ |
|
return hip->snap.ethertype; |
} |
/cl2llc.c
0,0 → 1,615
/* |
* NET An implementation of the IEEE 802.2 LLC protocol for the |
* LINUX operating system. LLC is implemented as a set of |
* state machines and callbacks for higher networking layers. |
* |
* Class 2 llc algorithm. |
* Pseudocode interpreter, transition table lookup, |
* data_request & indicate primitives... |
* |
* Code for initialization, termination, registration and |
* MAC layer glue. |
* |
* Copyright Tim Alpaerts, |
* <Tim_Alpaerts@toyota-motor-europe.com> |
* |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU General Public License |
* as published by the Free Software Foundation; either version |
* 2 of the License, or (at your option) any later version. |
* |
* Changes |
* Alan Cox : Chainsawed into Linux format |
* Modified to use llc_ names |
* Changed callbacks |
* |
* This file must be processed by sed before it can be compiled. |
*/ |
|
#include <linux/types.h> |
#include <linux/kernel.h> |
#include <linux/slab.h> |
#include <linux/netdevice.h> |
#include <linux/skbuff.h> |
#include <net/p8022.h> |
#include <linux/proc_fs.h> |
#include <linux/stat.h> |
#include <asm/byteorder.h> |
|
#include "pseudo/pseudocode.h" |
#include "transit/pdutr.h" |
#include "transit/timertr.h" |
#include <net/llc_frame.h> |
#include <net/llc.h> |
|
/* |
* Data_request() is called by the client to present a data unit |
* to the llc for transmission. |
* In the future this function should also check if the transmit window |
* allows the sending of another pdu, and if not put the skb on the atq |
* for deferred sending. |
*/ |
|
int llc_data_request(llcptr lp, struct sk_buff *skb) |
{ |
if (skb_headroom(skb) < (lp->dev->hard_header_len +4)){ |
printk("cl2llc: data_request() not enough headroom in skb\n"); |
return -1; |
}; |
|
skb_push(skb, 4); |
|
if ((lp->state != NORMAL) && (lp->state != BUSY) && (lp->state != REJECT)) |
{ |
printk("cl2llc: data_request() while no llc connection\n"); |
return -1; |
} |
|
if (lp->remote_busy) |
{ /* if the remote llc is BUSY, */ |
ADD_TO_ATQ(skb); /* save skb in the await transmit queue */ |
return 0; |
} |
else |
{ |
/* |
* Else proceed with xmit |
*/ |
|
switch(lp->state) |
{ |
case NORMAL: |
if(lp->p_flag) |
llc_interpret_pseudo_code(lp, NORMAL2, skb, NO_FRAME); |
else |
llc_interpret_pseudo_code(lp, NORMAL1, skb, NO_FRAME); |
break; |
case BUSY: |
if (lp->p_flag) |
llc_interpret_pseudo_code(lp, BUSY2, skb, NO_FRAME); |
else |
llc_interpret_pseudo_code(lp, BUSY1, skb, NO_FRAME); |
break; |
case REJECT: |
if (lp->p_flag) |
llc_interpret_pseudo_code(lp, REJECT2, skb, NO_FRAME); |
else |
llc_interpret_pseudo_code(lp, REJECT1, skb, NO_FRAME); |
break; |
default:; |
} |
if(lp->llc_callbacks) |
{ |
lp->llc_event(lp); |
lp->llc_callbacks=0; |
} |
return 0; |
} |
} |
|
|
|
/* |
* Disconnect_request() requests that the llc to terminate a connection |
*/ |
|
void disconnect_request(llcptr lp) |
{ |
if ((lp->state == NORMAL) || |
(lp->state == BUSY) || |
(lp->state == REJECT) || |
(lp->state == AWAIT) || |
(lp->state == AWAIT_BUSY) || |
(lp->state == AWAIT_REJECT)) |
{ |
lp->state = D_CONN; |
llc_interpret_pseudo_code(lp, SH1, NULL, NO_FRAME); |
if(lp->llc_callbacks) |
{ |
lp->llc_event(lp); |
lp->llc_callbacks=0; |
} |
/* |
* lp may be invalid after the callback |
*/ |
} |
} |
|
|
/* |
* Connect_request() requests that the llc to start a connection |
*/ |
|
void connect_request(llcptr lp) |
{ |
if (lp->state == ADM) |
{ |
lp->state = SETUP; |
llc_interpret_pseudo_code(lp, ADM1, NULL, NO_FRAME); |
if(lp->llc_callbacks) |
{ |
lp->llc_event(lp); |
lp->llc_callbacks=0; |
} |
/* |
* lp may be invalid after the callback |
*/ |
} |
} |
|
|
/* |
* Interpret_pseudo_code() executes the actions in the connection component |
* state transition table. Table 4 in document on p88. |
* |
* If this function is called to handle an incoming pdu, skb will point |
* to the buffer with the pdu and type will contain the decoded pdu type. |
* |
* If called by data_request skb points to an skb that was skb_alloc-ed by |
* the llc client to hold the information unit to be transmitted, there is |
* no valid type in this case. |
* |
* If called because a timer expired no skb is passed, and there is no |
* type. |
*/ |
|
void llc_interpret_pseudo_code(llcptr lp, int pc_label, struct sk_buff *skb, |
char type) |
{ |
short int pc; /* program counter in pseudo code array */ |
char p_flag_received; |
frameptr fr; |
int resend_count; /* number of pdus resend by llc_resend_ipdu() */ |
int ack_count; /* number of pdus acknowledged */ |
struct sk_buff *skb2; |
|
if (skb != NULL) |
{ |
fr = (frameptr) skb->data; |
} |
else |
fr = NULL; |
|
pc = pseudo_code_idx[pc_label]; |
while(pseudo_code[pc]) |
{ |
switch(pseudo_code[pc]) |
{ |
case 9: |
if ((type != I_CMD) || (fr->i_hdr.i_pflag == 0)) |
break; |
case 1: |
lp->remote_busy = 0; |
llc_stop_timer(lp, BUSY_TIMER); |
if ((lp->state == NORMAL) || |
(lp->state == REJECT) || |
(lp->state == BUSY)) |
{ |
skb2 = llc_pull_from_atq(lp); |
if (skb2 != NULL) |
llc_start_timer(lp, ACK_TIMER); |
while (skb2 != NULL) |
{ |
llc_sendipdu( lp, I_CMD, 0, skb2); |
skb2 = llc_pull_from_atq(lp); |
} |
} |
break; |
case 2: |
lp->state = NORMAL; /* needed to eliminate connect_response() */ |
lp->llc_mode = MODE_ABM; |
lp->llc_callbacks|=LLC_CONN_INDICATION; |
break; |
case 3: |
lp->llc_mode = MODE_ABM; |
lp->llc_callbacks|=LLC_CONN_CONFIRM; |
break; |
case 4: |
skb_pull(skb, 4); |
lp->inc_skb=skb; |
lp->llc_callbacks|=LLC_DATA_INDIC; |
break; |
case 5: |
lp->llc_mode = MODE_ADM; |
lp->llc_callbacks|=LLC_DISC_INDICATION; |
break; |
case 70: |
lp->llc_callbacks|=LLC_RESET_INDIC_LOC; |
break; |
case 71: |
lp->llc_callbacks|=LLC_RESET_INDIC_REM; |
break; |
case 7: |
lp->llc_callbacks|=LLC_RST_CONFIRM; |
break; |
case 66: |
lp->llc_callbacks|=LLC_FRMR_RECV; |
break; |
case 67: |
lp->llc_callbacks|=LLC_FRMR_SENT; |
break; |
case 68: |
lp->llc_callbacks|=LLC_REMOTE_BUSY; |
break; |
case 69: |
lp->llc_callbacks|=LLC_REMOTE_NOTBUSY; |
break; |
case 11: |
llc_sendpdu(lp, DISC_CMD, lp->f_flag, 0, NULL); |
break; |
case 12: |
llc_sendpdu(lp, DM_RSP, 0, 0, NULL); |
break; |
case 13: |
lp->frmr_info_fld.cntl1 = fr->pdu_cntl.byte1; |
lp->frmr_info_fld.cntl2 = fr->pdu_cntl.byte2; |
lp->frmr_info_fld.vs = lp->vs; |
lp->frmr_info_fld.vr_cr = lp->vr; |
llc_sendpdu(lp, FRMR_RSP, 0, 5, (char *) &lp->frmr_info_fld); |
break; |
case 14: |
llc_sendpdu(lp, FRMR_RSP, 0, 5, (char *) &lp->frmr_info_fld); |
break; |
case 15: |
llc_sendpdu(lp, FRMR_RSP, lp->p_flag, |
5, (char *) &lp->frmr_info_fld); |
break; |
case 16: |
llc_sendipdu(lp, I_CMD, 1, skb); |
break; |
case 17: |
resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 1); |
break; |
case 18: |
resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 1); |
if (resend_count == 0) |
{ |
llc_sendpdu(lp, RR_CMD, 1, 0, NULL); |
} |
break; |
case 19: |
llc_sendipdu(lp, I_CMD, 0, skb); |
break; |
case 20: |
resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 0); |
break; |
case 21: |
resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 0); |
if (resend_count == 0) |
{ |
llc_sendpdu(lp, RR_CMD, 0, 0, NULL); |
} |
break; |
case 22: |
resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_RSP, 1); |
break; |
case 23: |
llc_sendpdu(lp, REJ_CMD, 1, 0, NULL); |
break; |
case 24: |
llc_sendpdu(lp, REJ_RSP, 1, 0, NULL); |
break; |
case 25: |
if (IS_RSP(fr)) |
llc_sendpdu(lp, REJ_CMD, 0, 0, NULL); |
else |
llc_sendpdu(lp, REJ_RSP, 0, 0, NULL); |
break; |
case 26: |
llc_sendpdu(lp, RNR_CMD, 1, 0, NULL); |
break; |
case 27: |
llc_sendpdu(lp, RNR_RSP, 1, 0, NULL); |
break; |
case 28: |
if (IS_RSP(fr)) |
llc_sendpdu(lp, RNR_CMD, 0, 0, NULL); |
else |
llc_sendpdu(lp, RNR_RSP, 0, 0, NULL); |
break; |
case 29: |
if (lp->remote_busy == 0) |
{ |
lp->remote_busy = 1; |
llc_start_timer(lp, BUSY_TIMER); |
lp->llc_callbacks|=LLC_REMOTE_BUSY; |
} |
else if (lp->timer_state[BUSY_TIMER] == TIMER_IDLE) |
{ |
llc_start_timer(lp, BUSY_TIMER); |
} |
break; |
case 30: |
if (IS_RSP(fr)) |
llc_sendpdu(lp, RNR_CMD, 0, 0, NULL); |
else |
llc_sendpdu(lp, RNR_RSP, 0, 0, NULL); |
break; |
case 31: |
llc_sendpdu(lp, RR_CMD, 1, 0, NULL); |
break; |
case 32: |
llc_sendpdu(lp, RR_CMD, 1, 0, NULL); |
break; |
case 33: |
llc_sendpdu(lp, RR_RSP, 1, 0, NULL); |
break; |
case 34: |
llc_sendpdu(lp, RR_RSP, 1, 0, NULL); |
break; |
case 35: |
llc_sendpdu(lp, RR_RSP, 0, 0, NULL); |
break; |
case 36: |
if (IS_RSP(fr)) |
llc_sendpdu(lp, RR_CMD, 0, 0, NULL); |
else |
llc_sendpdu(lp, RR_RSP, 0, 0, NULL); |
break; |
case 37: |
llc_sendpdu(lp, SABME_CMD, 0, 0, NULL); |
lp->f_flag = 0; |
break; |
case 38: |
llc_sendpdu(lp, UA_RSP, lp->f_flag, 0, NULL); |
break; |
case 39: |
lp->s_flag = 0; |
break; |
case 40: |
lp->s_flag = 1; |
break; |
case 41: |
if(lp->timer_state[P_TIMER] == TIMER_RUNNING) |
llc_stop_timer(lp, P_TIMER); |
llc_start_timer(lp, P_TIMER); |
if (lp->p_flag == 0) |
{ |
lp->retry_count = 0; |
lp->p_flag = 1; |
} |
break; |
case 44: |
if (lp->timer_state[ACK_TIMER] == TIMER_IDLE) |
llc_start_timer(lp, ACK_TIMER); |
break; |
case 42: |
llc_start_timer(lp, ACK_TIMER); |
break; |
case 43: |
llc_start_timer(lp, REJ_TIMER); |
break; |
case 45: |
llc_stop_timer(lp, ACK_TIMER); |
break; |
case 46: |
llc_stop_timer(lp, ACK_TIMER); |
lp->p_flag = 0; |
break; |
case 10: |
if (lp->data_flag == 2) |
llc_stop_timer(lp, REJ_TIMER); |
break; |
case 47: |
llc_stop_timer(lp, REJ_TIMER); |
break; |
case 48: |
llc_stop_timer(lp, ACK_TIMER); |
llc_stop_timer(lp, P_TIMER); |
llc_stop_timer(lp, REJ_TIMER); |
llc_stop_timer(lp, BUSY_TIMER); |
break; |
case 49: |
llc_stop_timer(lp, P_TIMER); |
llc_stop_timer(lp, REJ_TIMER); |
llc_stop_timer(lp, BUSY_TIMER); |
break; |
case 50: |
ack_count = llc_free_acknowledged_skbs(lp, |
(unsigned char) fr->s_hdr.nr); |
if (ack_count > 0) |
{ |
lp->retry_count = 0; |
llc_stop_timer(lp, ACK_TIMER); |
if (skb_peek(&lp->rtq) != NULL) |
{ |
/* |
* Re-transmit queue not empty |
*/ |
llc_start_timer(lp, ACK_TIMER); |
} |
} |
break; |
case 51: |
if (IS_UFRAME(fr)) |
p_flag_received = fr->u_hdr.u_pflag; |
else |
p_flag_received = fr->i_hdr.i_pflag; |
if ((fr->pdu_hdr.ssap & 0x01) && (p_flag_received)) |
{ |
lp->p_flag = 0; |
llc_stop_timer(lp, P_TIMER); |
} |
break; |
case 52: |
lp->data_flag = 2; |
break; |
case 53: |
lp->data_flag = 0; |
break; |
case 54: |
lp->data_flag = 1; |
break; |
case 55: |
if (lp->data_flag == 0) |
lp->data_flag = 1; |
break; |
case 56: |
lp->p_flag = 0; |
break; |
case 57: |
lp->p_flag = lp->f_flag; |
break; |
case 58: |
lp->remote_busy = 0; |
break; |
case 59: |
lp->retry_count = 0; |
break; |
case 60: |
lp->retry_count++; |
break; |
case 61: |
lp->vr = 0; |
break; |
case 62: |
lp->vr++; |
break; |
case 63: |
lp->vs = 0; |
break; |
case 64: |
lp->vs = fr->i_hdr.nr; |
break; |
case 65: |
if (IS_UFRAME(fr)) |
lp->f_flag = fr->u_hdr.u_pflag; |
else |
lp->f_flag = fr->i_hdr.i_pflag; |
break; |
default:; |
} |
pc++; |
} |
} |
|
|
/* |
* Process_otype2_frame will handle incoming frames |
* for 802.2 Type 2 Procedure. |
*/ |
|
void llc_process_otype2_frame(llcptr lp, struct sk_buff *skb, char type) |
{ |
int idx; /* index in transition table */ |
int pc_label; /* action to perform, from tr tbl */ |
int validation; /* result of validate_seq_nos */ |
int p_flag_received; /* p_flag in received frame */ |
frameptr fr; |
|
fr = (frameptr) skb->data; |
|
if (IS_UFRAME(fr)) |
p_flag_received = fr->u_hdr.u_pflag; |
else |
p_flag_received = fr->i_hdr.i_pflag; |
|
switch(lp->state) |
{ |
/* Compute index in transition table: */ |
case ADM: |
idx = type; |
idx = (idx << 1) + p_flag_received; |
break; |
case CONN: |
case RESET_WAIT: |
case RESET_CHECK: |
case ERROR: |
idx = type; |
break; |
case SETUP: |
case RESET: |
case D_CONN: |
idx = type; |
idx = (idx << 1) + lp->p_flag; |
break; |
case NORMAL: |
case BUSY: |
case REJECT: |
case AWAIT: |
case AWAIT_BUSY: |
case AWAIT_REJECT: |
validation = llc_validate_seq_nos(lp, fr); |
if (validation > 3) |
type = BAD_FRAME; |
idx = type; |
idx = (idx << 1); |
if (validation & 1) |
idx = idx +1; |
idx = (idx << 1) + p_flag_received; |
idx = (idx << 1) + lp->p_flag; |
default: |
printk("llc_proc: bad state\n"); |
return; |
} |
idx = (idx << 1) + pdutr_offset[lp->state]; |
lp->state = pdutr_entry[idx +1]; |
pc_label = pdutr_entry[idx]; |
if (pc_label != 0) |
{ |
llc_interpret_pseudo_code(lp, pc_label, skb, type); |
if(lp->llc_callbacks) |
{ |
lp->llc_event(lp); |
lp->llc_callbacks=0; |
} |
/* |
* lp may no longer be valid after this point. Be |
* careful what is added! |
*/ |
} |
} |
|
|
void llc_timer_expired(llcptr lp, int t) |
{ |
int idx; /* index in transition table */ |
int pc_label; /* action to perform, from tr tbl */ |
|
lp->timer_state[t] = TIMER_EXPIRED; |
idx = lp->state; /* Compute index in transition table: */ |
idx = (idx << 2) + t; |
idx = idx << 1; |
if (lp->retry_count >= lp->n2) |
idx = idx + 1; |
idx = (idx << 1) + lp->s_flag; |
idx = (idx << 1) + lp->p_flag; |
idx = idx << 1; /* 2 bytes per entry: action & newstate */ |
|
pc_label = timertr_entry[idx]; |
if (pc_label != 0) |
{ |
llc_interpret_pseudo_code(lp, pc_label, NULL, NO_FRAME); |
lp->state = timertr_entry[idx +1]; |
} |
lp->timer_state[t] = TIMER_IDLE; |
if(lp->llc_callbacks) |
{ |
lp->llc_event(lp); |
lp->llc_callbacks=0; |
} |
/* |
* And lp may have vanished in the event callback |
*/ |
} |
|
/p8022.c
0,0 → 1,144
/* |
* NET3: Support for 802.2 demultiplexing off Ethernet (Token ring |
* is kept separate see p8022tr.c) |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU General Public License |
* as published by the Free Software Foundation; either version |
* 2 of the License, or (at your option) any later version. |
* |
* Demultiplex 802.2 encoded protocols. We match the entry by the |
* SSAP/DSAP pair and then deliver to the registered datalink that |
* matches. The control byte is ignored and handling of such items |
* is up to the routine passed the frame. |
* |
* Unlike the 802.3 datalink we have a list of 802.2 entries as there |
* are multiple protocols to demux. The list is currently short (3 or |
* 4 entries at most). The current demux assumes this. |
*/ |
|
#include <linux/module.h> |
#include <linux/netdevice.h> |
#include <linux/skbuff.h> |
#include <net/datalink.h> |
#include <linux/mm.h> |
#include <linux/in.h> |
#include <linux/init.h> |
#include <net/p8022.h> |
|
static struct datalink_proto *p8022_list = NULL; |
|
/* |
* We don't handle the loopback SAP stuff, the extended |
* 802.2 command set, multicast SAP identifiers and non UI |
* frames. We have the absolute minimum needed for IPX, |
* IP and Appletalk phase 2. See the llc_* routines for |
* support libraries if your protocol needs these. |
*/ |
|
static struct datalink_proto *find_8022_client(unsigned char type) |
{ |
struct datalink_proto *proto; |
|
for (proto = p8022_list; |
((proto != NULL) && (*(proto->type) != type)); |
proto = proto->next) |
; |
|
return proto; |
} |
|
int p8022_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) |
{ |
struct datalink_proto *proto; |
|
proto = find_8022_client(*(skb->h.raw)); |
if (proto != NULL) |
{ |
skb->h.raw += 3; |
skb->nh.raw += 3; |
skb_pull(skb,3); |
return proto->rcvfunc(skb, dev, pt); |
} |
|
skb->sk = NULL; |
kfree_skb(skb); |
return 0; |
} |
|
static void p8022_datalink_header(struct datalink_proto *dl, |
struct sk_buff *skb, unsigned char *dest_node) |
{ |
struct net_device *dev = skb->dev; |
unsigned char *rawp; |
|
rawp = skb_push(skb,3); |
*rawp++ = dl->type[0]; |
*rawp++ = dl->type[0]; |
*rawp = 0x03; /* UI */ |
dev->hard_header(skb, dev, ETH_P_802_3, dest_node, NULL, skb->len); |
} |
|
static struct packet_type p8022_packet_type = |
{ |
0, /* MUTTER ntohs(ETH_P_8022),*/ |
NULL, /* All devices */ |
p8022_rcv, |
NULL, |
NULL, |
}; |
|
EXPORT_SYMBOL(register_8022_client); |
EXPORT_SYMBOL(unregister_8022_client); |
|
static int __init p8022_init(void) |
{ |
p8022_packet_type.type=htons(ETH_P_802_2); |
dev_add_pack(&p8022_packet_type); |
return 0; |
} |
|
module_init(p8022_init); |
|
struct datalink_proto *register_8022_client(unsigned char type, int (*rcvfunc)(struct sk_buff *, struct net_device *, struct packet_type *)) |
{ |
struct datalink_proto *proto; |
|
if (find_8022_client(type) != NULL) |
return NULL; |
|
proto = (struct datalink_proto *) kmalloc(sizeof(*proto), GFP_ATOMIC); |
if (proto != NULL) { |
proto->type[0] = type; |
proto->type_len = 1; |
proto->rcvfunc = rcvfunc; |
proto->header_length = 3; |
proto->datalink_header = p8022_datalink_header; |
proto->string_name = "802.2"; |
proto->next = p8022_list; |
p8022_list = proto; |
} |
|
return proto; |
} |
|
void unregister_8022_client(unsigned char type) |
{ |
struct datalink_proto *tmp, **clients = &p8022_list; |
unsigned long flags; |
|
save_flags(flags); |
cli(); |
|
while ((tmp = *clients) != NULL) |
{ |
if (tmp->type[0] == type) { |
*clients = tmp->next; |
kfree(tmp); |
break; |
} else { |
clients = &tmp->next; |
} |
} |
|
restore_flags(flags); |
} |
/p8023.c
0,0 → 1,62
/* |
* NET3: 802.3 data link hooks used for IPX 802.3 |
* |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU General Public License |
* as published by the Free Software Foundation; either version |
* 2 of the License, or (at your option) any later version. |
* |
* 802.3 isn't really a protocol data link layer. Some old IPX stuff |
* uses it however. Note that there is only one 802.3 protocol layer |
* in the system. We don't currently support different protocols |
* running raw 802.3 on different devices. Thankfully nobody else |
* has done anything like the old IPX. |
*/ |
|
#include <linux/netdevice.h> |
#include <linux/skbuff.h> |
#include <net/datalink.h> |
#include <linux/mm.h> |
#include <linux/in.h> |
|
/* |
* Place an 802.3 header on a packet. The driver will do the mac |
* addresses, we just need to give it the buffer length. |
*/ |
|
static void p8023_datalink_header(struct datalink_proto *dl, |
struct sk_buff *skb, unsigned char *dest_node) |
{ |
struct net_device *dev = skb->dev; |
dev->hard_header(skb, dev, ETH_P_802_3, dest_node, NULL, skb->len); |
} |
|
/* |
* Create an 802.3 client. Note there can be only one 802.3 client |
*/ |
|
struct datalink_proto *make_8023_client(void) |
{ |
struct datalink_proto *proto; |
|
proto = (struct datalink_proto *) kmalloc(sizeof(*proto), GFP_ATOMIC); |
if (proto != NULL) |
{ |
proto->type_len = 0; |
proto->header_length = 0; |
proto->datalink_header = p8023_datalink_header; |
proto->string_name = "802.3"; |
} |
return proto; |
} |
|
/* |
* Destroy the 802.3 client. |
*/ |
|
void destroy_8023_client(struct datalink_proto *dl) |
{ |
if (dl) |
kfree(dl); |
} |
|
/llc_macinit.c
0,0 → 1,214
/* |
* NET An implementation of the IEEE 802.2 LLC protocol for the |
* LINUX operating system. LLC is implemented as a set of |
* state machines and callbacks for higher networking layers. |
* |
* Code for initialization, termination, registration and |
* MAC layer glue. |
* |
* Written by Tim Alpaerts, Tim_Alpaerts@toyota-motor-europe.com |
* |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU General Public License |
* as published by the Free Software Foundation; either version |
* 2 of the License, or (at your option) any later version. |
* |
* Changes |
* Alan Cox : Chainsawed to Linux format |
* Added llc_ to names |
* Started restructuring handlers |
* |
* Horst von Brand : Add #include <linux/string.h> |
*/ |
|
#include <linux/module.h> |
#include <linux/version.h> |
#include <linux/kernel.h> |
#include <linux/slab.h> |
#include <linux/unistd.h> |
#include <linux/string.h> |
#include <linux/netdevice.h> |
#include <linux/init.h> |
#include <net/p8022.h> |
|
#include <asm/byteorder.h> |
|
#include <net/llc_frame.h> |
#include <net/llc.h> |
|
/* |
* All incoming frames pass thru mac_data_indicate(). |
* On entry the llc structure related to the frame is passed as parameter. |
* The received sk_buffs with pdus other than I_CMD and I_RSP |
* are freed by mac_data_indicate() after processing, |
* the I pdu buffers are freed by the cl2llc client when it no longer needs |
* the skb. |
*/ |
|
int llc_mac_data_indicate(llcptr lp, struct sk_buff *skb) |
{ |
int ll; /* logical length == 802.3 length field */ |
unsigned char p_flag; |
unsigned char type; |
frameptr fr; |
int free=1; |
|
lp->inc_skb=NULL; |
|
/* |
* Truncate buffer to true 802.3 length |
* [FIXME: move to 802.2 demux] |
*/ |
|
ll = *(skb->data -2) * 256 + *(skb->data -1); |
skb_trim( skb, ll ); |
|
fr = (frameptr) skb->data; |
type = llc_decode_frametype( fr ); |
|
|
if (type <= FRMR_RSP) |
{ |
/* |
* PDU is of the type 2 set |
*/ |
if ((lp->llc_mode == MODE_ABM)||(type == SABME_CMD)) |
llc_process_otype2_frame(lp, skb, type); |
|
} |
else |
{ |
/* |
* PDU belongs to type 1 set |
*/ |
p_flag = fr->u_hdr.u_pflag; |
switch(type) |
{ |
case TEST_CMD: |
llc_sendpdu(lp, TEST_RSP, 0,ll -3, |
fr->u_hdr.u_info); |
break; |
case TEST_RSP: |
lp->llc_callbacks|=LLC_TEST_INDICATION; |
lp->inc_skb=skb; |
free=0; |
break; |
case XID_CMD: |
/* |
* Basic format XID is handled by LLC itself |
* Doc 5.4.1.1.2 p 48/49 |
*/ |
|
if ((ll == 6)&&(fr->u_hdr.u_info[0] == 0x81)) |
{ |
lp->k = fr->u_hdr.u_info[2]; |
llc_sendpdu(lp, XID_RSP, |
fr->u_hdr.u_pflag, ll -3, |
fr->u_hdr.u_info); |
} |
break; |
|
case XID_RSP: |
if( ll == 6 && fr->u_hdr.u_info[0] == 0x81 ) |
{ |
lp->k = fr->u_hdr.u_info[2]; |
} |
lp->llc_callbacks|=LLC_XID_INDICATION; |
lp->inc_skb=skb; |
free=0; |
break; |
|
case UI_CMD: |
lp->llc_callbacks|=LLC_UI_DATA; |
skb_pull(skb,3); |
lp->inc_skb=skb; |
free=0; |
break; |
|
default:; |
/* |
* All other type 1 pdus ignored for now |
*/ |
} |
} |
|
if (free&&(!(IS_IFRAME(fr)))) |
{ |
/* |
* No auto free for I pdus |
*/ |
skb->sk = NULL; |
kfree_skb(skb); |
} |
|
if(lp->llc_callbacks) |
{ |
if ( lp->llc_event != NULL ) lp->llc_event(lp); |
lp->llc_callbacks=0; |
} |
return 0; |
} |
|
|
/* |
* Create an LLC client. As it is the job of the caller to clean up |
* LLC's on device down, the device list must be locked before this call. |
*/ |
|
int register_cl2llc_client(llcptr lp, const char *device, void (*event)(llcptr), u8 *rmac, u8 ssap, u8 dsap) |
{ |
char eye_init[] = "LLC\0"; |
|
memset(lp, 0, sizeof(*lp)); |
lp->dev = __dev_get_by_name(device); |
if(lp->dev == NULL) |
return -ENODEV; |
memcpy(lp->eye, eye_init, sizeof(lp->eye)); |
lp->rw = 1; |
lp->k = 127; |
lp->n1 = 1490; |
lp->n2 = 10; |
lp->timer_interval[P_TIMER] = HZ; /* 1 sec */ |
lp->timer_interval[REJ_TIMER] = HZ/8; |
lp->timer_interval[ACK_TIMER] = HZ/8; |
lp->timer_interval[BUSY_TIMER] = HZ*2; |
lp->local_sap = ssap; |
lp->llc_event = event; |
memcpy(lp->remote_mac, rmac, sizeof(lp->remote_mac)); |
lp->state = 0; |
lp->llc_mode = MODE_ADM; |
lp->remote_sap = dsap; |
skb_queue_head_init(&lp->atq); |
skb_queue_head_init(&lp->rtq); |
MOD_INC_USE_COUNT; |
return 0; |
} |
|
|
void unregister_cl2llc_client(llcptr lp) |
{ |
llc_cancel_timers(lp); |
MOD_DEC_USE_COUNT; |
kfree(lp); |
} |
|
|
EXPORT_SYMBOL(register_cl2llc_client); |
EXPORT_SYMBOL(unregister_cl2llc_client); |
EXPORT_SYMBOL(llc_data_request); |
EXPORT_SYMBOL(llc_unit_data_request); |
EXPORT_SYMBOL(llc_test_request); |
EXPORT_SYMBOL(llc_xid_request); |
EXPORT_SYMBOL(llc_mac_data_indicate); |
EXPORT_SYMBOL(llc_cancel_timers); |
|
#define ALL_TYPES_8022 0 |
|
static int __init llc_init(void) |
{ |
printk(KERN_NOTICE "IEEE 802.2 LLC for Linux 2.1 (c) 1996 Tim Alpaerts\n"); |
return 0; |
} |
|
|
module_init(llc_init); |
/pseudo/pseudocode.h
0,0 → 1,287
|
/* this file generated on Thu Oct 24 11:42:35 GMT 1996 */ |
|
static char pseudo_code [ ] = { |
0, 37, 57, 42, 59, 39, 0, 65, 38, |
63, 61, 59, 56, 58, 2, 0, 12, 0, |
12, 0, 0, 0, 12, 0, 65, 0, 5, |
0, 0, 0, 37, 57, 42, 59, 0, 38, |
63, 61, 59, 56, 58, 7, 0, 11, 57, |
42, 59, 0, 12, 0, 5, 0, 40, 65, |
0, 12, 5, 0, 0, 0, 38, 63, 61, |
59, 56, 58, 0, 12, 0, 5, 0, 65, |
0, 12, 5, 0, 0, 0, 38, 63, 61, |
59, 40, 0, 45, 63, 61, 59, 51, 3, |
58, 0, 56, 3, 58, 0, 12, 5, 45, |
0, 5, 45, 0, 0, 0, 37, 57, 42, |
60, 0, 5, 0, 38, 63, 61, 59, 40, |
0, 45, 63, 61, 59, 51, 7, 58, 0, |
56, 7, 58, 0, 12, 5, 45, 0, 5, |
45, 0, 0, 0, 37, 57, 42, 60, 0, |
5, 0, 12, 45, 0, 45, 0, 38, 0, |
45, 0, 0, 0, 11, 57, 42, 60, 0, |
0, 0, 71, 45, 65, 0, 38, 5, 45, |
0, 5, 45, 0, 70, 45, 66, 39, 0, |
15, 42, 0, 0, 0, 14, 42, 60, 0, |
39, 70, 0, 11, 57, 42, 49, 59, 0, |
37, 57, 42, 49, 59, 39, 0, 71, 65, |
48, 0, 38, 5, 48, 0, 48, 70, 66, |
39, 0, 5, 48, 0, 13, 67, 42, 49, |
59, 0, 0, 67, 42, 49, 59, 0, 0, |
67, 42, 49, 59, 0, 13, 67, 42, 49, |
59, 0, 48, 70, 39, 0, 16, 41, 44, |
0, 19, 44, 0, 26, 41, 53, 0, 28, |
53, 0, 25, 50, 51, 43, 9, 0, 25, |
50, 43, 0, 24, 50, 43, 0, 62, 32, |
41, 50, 9, 4, 0, 62, 51, 36, 50, |
9, 4, 0, 62, 36, 50, 4, 0, 62, |
34, 50, 4, 0, 51, 50, 1, 0, 34, |
50, 1, 0, 51, 50, 29, 0, 33, 50, |
29, 0, 64, 50, 51, 20, 1, 0, 64, |
50, 20, 1, 0, 64, 50, 22, 1, 0, |
31, 41, 0, 56, 0, 31, 41, 60, 0, |
16, 41, 44, 0, 19, 44, 0, 23, 43, |
41, 0, 25, 43, 0, 31, 41, 35, 0, |
35, 0, 31, 41, 35, 0, 35, 0, 30, |
51, 50, 55, 9, 0, 30, 50, 55, 0, |
27, 50, 55, 0, 27, 50, 10, 54, 0, |
30, 51, 50, 10, 54, 9, 0, 30, 50, |
10, 54, 0, 51, 50, 1, 0, 27, 50, |
1, 0, 51, 50, 29, 0, 27, 50, 29, |
0, 64, 50, 51, 20, 1, 0, 64, 50, |
20, 1, 0, 64, 50, 27, 20, 1, 0, |
26, 41, 0, 56, 0, 26, 41, 60, 0, |
54, 0, 54, 0, 16, 41, 44, 0, 19, |
44, 0, 26, 41, 52, 0, 28, 52, 0, |
50, 51, 9, 0, 33, 50, 0, 62, 32, |
41, 50, 9, 47, 4, 0, 62, 36, 50, |
47, 4, 0, 62, 34, 50, 47, 4, 0, |
51, 50, 1, 0, 34, 50, 1, 0, 51, |
50, 29, 0, 33, 50, 29, 0, 64, 50, |
51, 20, 1, 0, 64, 50, 20, 1, 0, |
64, 50, 22, 1, 0, 31, 41, 0, 23, |
41, 43, 60, 0, 56, 0, 31, 41, 43, |
60, 0, 28, 53, 0, 25, 50, 64, 46, |
20, 43, 1, 0, 25, 50, 43, 0, 24, |
50, 43, 0, 62, 50, 64, 18, 41, 1, |
4, 0, 62, 35, 50, 4, 0, 62, 33, |
50, 4, 0, 50, 64, 46, 20, 1, 0, |
50, 1, 0, 33, 50, 1, 0, 50, 64, |
46, 29, 0, 50, 29, 0, 33, 50, 29, |
0, 31, 41, 60, 0, 25, 43, 0, 35, |
0, 35, 0, 30, 50, 64, 46, 54, 1, |
20, 0, 30, 50, 54, 0, 27, 50, 54, |
0, 30, 50, 64, 54, 46, 1, 20, 0, |
30, 50, 54, 0, 27, 50, 54, 0, 50, |
64, 46, 20, 1, 0, 50, 1, 0, 27, |
50, 1, 0, 50, 64, 46, 29, 0, 50, |
29, 0, 27, 50, 29, 0, 26, 41, 60, |
0, 28, 52, 0, 50, 0, 33, 50, 0, |
62, 50, 64, 18, 41, 47, 1, 4, 0, |
62, 35, 47, 50, 4, 0, 62, 33, 47, |
50, 4, 0, 50, 64, 46, 20, 1, 0, |
50, 1, 0, 33, 50, 1, 0, 50, 64, |
46, 29, 0, 50, 29, 0, 33, 50, 29, |
0, 23, 41, 60, 0 |
}; |
|
static short int pseudo_code_idx [ ] ={ |
0, 1, 7, 16, 18, 20, 22, 24, 26, |
28, 30, 35, 43, 48, 50, 52, 55, 58, |
60, 67, 69, 71, 73, 76, 78, 84, 92, |
96, 100, 103, 105, 110, 112, 118, 126, 130, |
134, 137, 139, 144, 146, 149, 151, 153, 155, |
157, 162, 164, 168, 172, 175, 180, 183, 185, |
189, 192, 198, 205, 209, 213, 218, 221, 227, |
233, 239, 245, 249, 253, 256, 260, 263, 269, |
273, 277, 284, 291, 296, 301, 305, 309, 313, |
317, 323, 328, 333, 336, 338, 342, 346, 349, |
353, 356, 360, 362, 366, 368, 374, 378, 382, |
387, 394, 399, 403, 407, 411, 415, 421, 426, |
432, 435, 437, 441, 443, 445, 449, 452, 456, |
459, 463, 466, 474, 480, 486, 490, 494, 498, |
502, 508, 513, 518, 521, 526, 528, 533, 536, |
544, 548, 552, 560, 565, 570, 576, 579, 583, |
588, 591, 595, 599, 602, 604, 606, 614, 618, |
622, 630, 634, 638, 644, 647, 651, 656, 659, |
663, 667, 670, 672, 675, 684, 690, 696, 702, |
705, 709, 714, 717, 721, 0 |
}; |
|
#define NOP 0 |
#define ADM1 1 |
#define ADM2 2 |
#define ADM3 3 |
#define ADM4 4 |
#define ADM5 5 |
#define CONN2 6 |
#define CONN3 7 |
#define CONN4 8 |
#define CONN5 9 |
#define RESWAIT1 10 |
#define RESWAIT2 11 |
#define RESWAIT3 12 |
#define RESWAIT4 13 |
#define RESWAIT5 14 |
#define RESWAIT6 15 |
#define RESWAIT7 16 |
#define RESWAIT8 17 |
#define RESCHK1 18 |
#define RESCHK2 19 |
#define RESCHK3 20 |
#define RESCHK4 21 |
#define RESCHK5 22 |
#define RESCHK6 23 |
#define SETUP1 24 |
#define SETUP2 25 |
#define SETUP3 26 |
#define SETUP4 27 |
#define SETUP5 28 |
#define SETUP6 29 |
#define SETUP7 30 |
#define SETUP8 31 |
#define RESET1 32 |
#define RESET2 33 |
#define RESET3 34 |
#define RESET4 35 |
#define RESET5 36 |
#define RESET6 37 |
#define RESET7 38 |
#define RESET8 39 |
#define D_CONN1 40 |
#define D_CONN2 41 |
#define D_CONN3 42 |
#define D_CONN4 43 |
#define D_CONN5 44 |
#define D_CONN6 45 |
#define D_CONN7 46 |
#define ERR1 47 |
#define ERR2 48 |
#define ERR3 49 |
#define ERR4 50 |
#define ERR5 51 |
#define ERR6 52 |
#define ERR7 53 |
#define ERR8 54 |
#define SH1 55 |
#define SH2 56 |
#define SH3 57 |
#define SH4 58 |
#define SH5 59 |
#define SH6 60 |
#define SH7 61 |
#define SH8 62 |
#define SH9 63 |
#define SH10 64 |
#define SH11 65 |
#define NORMAL1 66 |
#define NORMAL2 67 |
#define NORMAL3 68 |
#define NORMAL4 69 |
#define NORMAL5 70 |
#define NORMAL6 71 |
#define NORMAL7 72 |
#define NORMAL8A 73 |
#define NORMAL8B 74 |
#define NORMAL9 75 |
#define NORMAL10 76 |
#define NORMAL11 77 |
#define NORMAL12 78 |
#define NORMAL13 79 |
#define NORMAL14 80 |
#define NORMAL15 81 |
#define NORMAL16 82 |
#define NORMAL17 83 |
#define NORMAL18 84 |
#define NORMAL19 85 |
#define NORMAL20 86 |
#define BUSY1 87 |
#define BUSY2 88 |
#define BUSY3 89 |
#define BUSY4 90 |
#define BUSY5 91 |
#define BUSY6 92 |
#define BUSY7 93 |
#define BUSY8 94 |
#define BUSY9 95 |
#define BUSY10 96 |
#define BUSY11 97 |
#define BUSY12 98 |
#define BUSY13 99 |
#define BUSY14 100 |
#define BUSY15 101 |
#define BUSY16 102 |
#define BUSY17 103 |
#define BUSY18 104 |
#define BUSY19 105 |
#define BUSY20 106 |
#define BUSY21 107 |
#define BUSY22 108 |
#define BUSY23 109 |
#define BUSY24 110 |
#define BUSY25 111 |
#define BUSY26 112 |
#define REJECT1 113 |
#define REJECT2 114 |
#define REJECT3 115 |
#define REJECT4 116 |
#define REJECT5 117 |
#define REJECT6 118 |
#define REJECT7 119 |
#define REJECT8 120 |
#define REJECT9 121 |
#define REJECT10 122 |
#define REJECT11 123 |
#define REJECT12 124 |
#define REJECT13 125 |
#define REJECT14 126 |
#define REJECT15 127 |
#define REJECT16 128 |
#define REJECT17 129 |
#define REJECT18 130 |
#define REJECT19 131 |
#define REJECT20 132 |
#define AWAIT1 133 |
#define AWAIT2 134 |
#define AWAIT3 135 |
#define AWAIT4 136 |
#define AWAIT5 137 |
#define AWAIT6 138 |
#define AWAIT7 139 |
#define AWAIT8 140 |
#define AWAIT9 141 |
#define AWAIT10 142 |
#define AWAIT11 143 |
#define AWAIT12 144 |
#define AWAIT13 145 |
#define AWAIT14 146 |
#define AWAIT_BUSY1 147 |
#define AWAIT_BUSY2 148 |
#define AWAIT_BUSY3 149 |
#define AWAIT_BUSY4 150 |
#define AWAIT_BUSY5 151 |
#define AWAIT_BUSY6 152 |
#define AWAIT_BUSY7 153 |
#define AWAIT_BUSY8 154 |
#define AWAIT_BUSY9 155 |
#define AWAIT_BUSY10 156 |
#define AWAIT_BUSY11 157 |
#define AWAIT_BUSY12 158 |
#define AWAIT_BUSY13 159 |
#define AWAIT_BUSY14 160 |
#define AWAIT_BUSY15 161 |
#define AWAIT_BUSY16 162 |
#define AWAIT_REJECT1 163 |
#define AWAIT_REJECT2 164 |
#define AWAIT_REJECT3 165 |
#define AWAIT_REJECT4 166 |
#define AWAIT_REJECT5 167 |
#define AWAIT_REJECT6 168 |
#define AWAIT_REJECT7 169 |
#define AWAIT_REJECT8 170 |
#define AWAIT_REJECT9 171 |
#define AWAIT_REJECT10 172 |
#define AWAIT_REJECT11 173 |
#define AWAIT_REJECT12 174 |
#define AWAIT_REJECT13 175 |
|
/pseudo/opcd2num.sed
0,0 → 1,72
s/NOP/0/ |
s/DUMMY_6/6/ |
s/DUMMY_8/8/ |
s/IF_F=1_CLEAR_REMOTE_BUSY/9/ |
s/CLEAR_REMOTE_BUSY/1/ |
s/CONNECT_CONFIRM/3/ |
s/DISCONNECT_INDICATION/5/ |
s/CONNECT_INDICATION/2/ |
s/IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1/55/ |
s/DATA_FLAG:=0/53/ |
s/DATA_FLAG:=1/54/ |
s/DATA_FLAG:=2/52/ |
s/DATA_INDICATION/4/ |
s/F_FLAG:=P/65/ |
s/IF_DATA_FLAG=2_STOP_REJ_TIMER/10/ |
s/OPTIONAL_SEND_RNR_XXX(X=0)/30/ |
s/P_FLAG:=0/56/ |
s/P_FLAG:=P/57/ |
s/RE-SEND_FRMR_RSP(F=0)/14/ |
s/RE-SEND_FRMR_RSP(F=P)/15/ |
s/RE-SEND_I_CMD(P=1)_OR_SEND_RR/18/ |
s/RE-SEND_I_CMD(P=1)/17/ |
s/RE-SEND_I_RSP(F=1)/22/ |
s/RE-SEND_I_XXX(X=0)_OR_SEND_RR/21/ |
s/RE-SEND_I_XXX(X=0)/20/ |
s/REMOTE_BUSY:=0/58/ |
s/REPORT_STATUS(FRMR_RECEIVED)/66/ |
s/REPORT_STATUS(FRMR_SENT)/67/ |
s/REPORT_STATUS(REMOTE_BUSY)/68/ |
s/REPORT_STATUS(REMOTE_NOT_BUSY)/69/ |
s/RESET_CONFIRM/7/ |
s/RESET_INDICATION(LOCAL)/70/ |
s/RESET_INDICATION(REMOTE)/71/ |
s/RETRY_COUNT:=RETRY_COUNT+1/60/ |
s/RETRY_COUNT:=0/59/ |
s/SEND_ACKNOWLEDGE_CMD(P=1)/32/ |
s/SEND_ACKNOWLEDGE_RSP(F=1)/34/ |
s/SEND_ACKNOWLEDGE_XXX(X=0)/36/ |
s/SEND_DISC_CMD(P=X)/11/ |
s/SEND_DM_RSP(F=X)/12/ |
s/SEND_FRMR_RSP(F=X)/13/ |
s/SEND_I_CMD(P=1)/16/ |
s/SEND_I_XXX(X=0)/19/ |
s/SEND_REJ_CMD(P=1)/23/ |
s/SEND_REJ_RSP(F=1)/24/ |
s/SEND_REJ_XXX(X=0)/25/ |
s/SEND_RNR_CMD(F=1)/26/ |
s/SEND_RNR_RSP(F=1)/27/ |
s/SEND_RNR_XXX(X=0)/28/ |
s/SEND_RR_CMD(P=1)/31/ |
s/SEND_RR_RSP(F=1)/33/ |
s/SEND_RR_XXX(X=0)/35/ |
s/SEND_SABME_CMD(P=X)/37/ |
s/SEND_UA_RSP(F=X)/38/ |
s/SET_REMOTE_BUSY/29/ |
s/START_ACK_TIMER_IF_NOT_RUNNING/44/ |
s/START_ACK_TIMER/42/ |
s/START_P_TIMER/41/ |
s/START_REJ_TIMER/43/ |
s/STOP_ACK_TIMER/45/ |
s/STOP_ALL_TIMERS/48/ |
s/STOP_OTHER_TIMERS/49/ |
s/STOP_P_TIMER/46/ |
s/STOP_REJ_TIMER/47/ |
s/S_FLAG:=0/39/ |
s/S_FLAG:=1/40/ |
s/UPDATE_N(R)_RECEIVED/50/ |
s/UPDATE_P_FLAG/51/ |
s/V(R):=0/61/ |
s/V(R):=V(R)+1/62/ |
s/V(S):=0/63/ |
s/V(S):=N(R)/64/ |
/pseudo/actionnm.awk
0,0 → 1,27
# usage: awk -f actionnm.awk pseudocode.h |
# |
BEGIN { "date" | getline |
today = $0 |
printf("\n/* this file generated on %s */\n", today ) |
printf("\nstatic char *action_names[] = { \n " ) |
opl = 0 |
} |
|
/^#define/ { |
if ( opl > 3 ) { |
printf("\n ") |
opl = 0 |
} |
opl = opl +1 |
t = sprintf("\"%s\"", $2 ) |
printf("%-15s ,", t ) |
# printf("%-10s", $2 ) |
} |
|
END { |
if ( opl > 3 ) { |
printf("\n ") |
} |
printf("\t 0\n};\n\n") |
} |
|
/pseudo/compile.awk
0,0 → 1,57
# usage: cat pseudocode | sed -f act2num | awk -f compile.awk |
# |
# |
BEGIN { "date" | getline |
today = $0 |
printf("\n/* this file generated on %s */\n", today ) |
printf("\nstatic char pseudo_code [ ] = { \n" ) |
opl = 0 # op codes on the current line |
|
opc = 0 # opcode counter |
fpi = 0 # fill pointer for idx array |
} |
|
/^;/ { } # line starting with semicolon is comment |
|
/^[A-Z]/ { # start of a new action |
emit( 0 ) |
idx[ ++fpi ] = opc |
name[ fpi ] = $1 |
emit( $2 ) |
} |
|
/^[\t ]/ { |
emit( $1 ) |
} |
|
END { |
if ( opl > 8 ) { |
printf("\n") |
} |
printf("\t 0\n};\n\n") |
printf("static short int pseudo_code_idx [ ] ={\n") |
opl = 0 |
emit( 0 ) |
for( ii = 1; ii <= fpi; ii++ ) |
emit( idx[ ii ] ) |
if ( opl > 8 ) { |
printf("\n") |
} |
printf("\t 0\n};\n\n") |
|
printf("#define %-10s \t %3d \n", "NOP", 0 ) |
for( ii = 1; ii <= fpi; ii++ ) |
printf("#define %-10s \t %3d \n", name[ ii ], ii ) |
printf("\n") |
} |
|
function emit( opcode ){ # Niclaus Wirth |
if ( opl > 8 ) { |
printf("\n") |
opl = 0 |
} |
opl = opl +1 |
printf("\t%4d,", opcode ) |
opc++ |
} |
|
/pseudo/pseudocode
0,0 → 1,780
;============================================================================ |
; |
; translate this with |
; cat pseudocode | sed -f act2num | awk -f compile.awk >pseudocode.h |
; |
; actionname pseudocode |
; |
;============================================================================ |
ADM1 SEND_SABME_CMD(P=X) |
P_FLAG:=P |
START_ACK_TIMER |
RETRY_COUNT:=0 |
S_FLAG:=0 |
; |
; instructions in ADM2 have been changed: |
; 1. P_FLAG:=P is probably wrong in doc... |
; I think it should be F_FLAG:=P the way it is in CONN3 |
; 2. CONNECT_RESPONSE has been wired in here, |
; CONN1 is no longer referenced |
; |
ADM2 F_FLAG:=P |
SEND_UA_RSP(F=X) |
V(S):=0 |
V(R):=0 |
RETRY_COUNT:=0 |
P_FLAG:=0 |
REMOTE_BUSY:=0 |
CONNECT_INDICATION |
ADM3 SEND_DM_RSP(F=X) |
ADM4 SEND_DM_RSP(F=X) |
ADM5 NOP |
;============================================================================ |
;CONN1 SEND_UA_RSP(F=X) |
; V(S):=0 |
; V(R):=0 |
; RETRY_COUNT:=0 |
; P_FLAG:=0 |
; REMOTE_BUSY:=0 |
CONN2 SEND_DM_RSP(F=X) |
CONN3 F_FLAG:=P |
CONN4 DISCONNECT_INDICATION |
CONN5 NOP |
;============================================================================ |
RESWAIT1 SEND_SABME_CMD(P=X) |
P_FLAG:=P |
START_ACK_TIMER |
RETRY_COUNT:=0 |
RESWAIT2 SEND_UA_RSP(F=X) |
V(S):=0 |
V(R):=0 |
RETRY_COUNT:=0 |
P_FLAG:=0 |
REMOTE_BUSY:=0 |
RESET_CONFIRM |
RESWAIT3 SEND_DISC_CMD(P=X) |
P_FLAG:=P |
START_ACK_TIMER |
RETRY_COUNT:=0 |
RESWAIT4 SEND_DM_RSP(F=X) |
RESWAIT5 DISCONNECT_INDICATION |
RESWAIT6 S_FLAG:=1 |
F_FLAG:=P |
RESWAIT7 SEND_DM_RSP(F=X) |
DISCONNECT_INDICATION |
RESWAIT8 NOP |
;============================================================================ |
RESCHK1 SEND_UA_RSP(F=X) |
V(S):=0 |
V(R):=0 |
RETRY_COUNT:=0 |
P_FLAG:=0 |
REMOTE_BUSY:=0 |
RESCHK2 SEND_DM_RSP(F=X) |
RESCHK3 DISCONNECT_INDICATION |
RESCHK4 F_FLAG:=P |
RESCHK5 SEND_DM_RSP(F=X) |
DISCONNECT_INDICATION |
RESCHK6 NOP |
;============================================================================ |
SETUP1 SEND_UA_RSP(F=X) |
V(S):=0 |
V(R):=0 |
RETRY_COUNT:=0 |
S_FLAG:=1 |
SETUP2 STOP_ACK_TIMER |
V(S):=0 |
V(R):=0 |
RETRY_COUNT:=0 |
UPDATE_P_FLAG |
CONNECT_CONFIRM |
REMOTE_BUSY:=0 |
SETUP3 P_FLAG:=0 |
CONNECT_CONFIRM |
REMOTE_BUSY:=0 |
SETUP4 SEND_DM_RSP(F=X) |
DISCONNECT_INDICATION |
STOP_ACK_TIMER |
SETUP5 DISCONNECT_INDICATION |
STOP_ACK_TIMER |
SETUP6 NOP |
SETUP7 SEND_SABME_CMD(P=X) |
P_FLAG:=P |
START_ACK_TIMER |
RETRY_COUNT:=RETRY_COUNT+1 |
SETUP8 DISCONNECT_INDICATION |
;============================================================================ |
RESET1 SEND_UA_RSP(F=X) |
V(S):=0 |
V(R):=0 |
RETRY_COUNT:=0 |
S_FLAG:=1 |
RESET2 STOP_ACK_TIMER |
V(S):=0 |
V(R):=0 |
RETRY_COUNT:=0 |
UPDATE_P_FLAG |
RESET_CONFIRM |
REMOTE_BUSY:=0 |
RESET3 P_FLAG:=0 |
RESET_CONFIRM |
REMOTE_BUSY:=0 |
RESET4 SEND_DM_RSP(F=X) |
DISCONNECT_INDICATION |
STOP_ACK_TIMER |
RESET5 DISCONNECT_INDICATION |
STOP_ACK_TIMER |
RESET6 NOP |
RESET7 SEND_SABME_CMD(P=X) |
P_FLAG:=P |
START_ACK_TIMER |
RETRY_COUNT:=RETRY_COUNT+1 |
RESET8 DISCONNECT_INDICATION |
;============================================================================ |
D_CONN1 SEND_DM_RSP(F=X) |
STOP_ACK_TIMER |
D_CONN2 STOP_ACK_TIMER |
D_CONN3 SEND_UA_RSP(F=X) |
D_CONN4 STOP_ACK_TIMER |
D_CONN5 NOP |
D_CONN6 SEND_DISC_CMD(P=X) |
P_FLAG:=P |
START_ACK_TIMER |
RETRY_COUNT:=RETRY_COUNT+1 |
D_CONN7 NOP |
;============================================================================ |
ERR1 RESET_INDICATION(REMOTE) |
STOP_ACK_TIMER |
F_FLAG:=P |
ERR2 SEND_UA_RSP(F=X) |
DISCONNECT_INDICATION |
STOP_ACK_TIMER |
ERR3 DISCONNECT_INDICATION |
STOP_ACK_TIMER |
ERR4 RESET_INDICATION(LOCAL) |
STOP_ACK_TIMER |
REPORT_STATUS(FRMR_RECEIVED) |
S_FLAG:=0 |
ERR5 RE-SEND_FRMR_RSP(F=P) |
START_ACK_TIMER |
ERR6 NOP |
ERR7 RE-SEND_FRMR_RSP(F=0) |
START_ACK_TIMER |
RETRY_COUNT:=RETRY_COUNT+1 |
ERR8 S_FLAG:=0 |
RESET_INDICATION(LOCAL) |
;============================================================================ |
; the shared actions are common to states NORMAL, BUSY, REJECT, |
; AWAIT, AWAIT_BUSY and AWAIT_REJECT. |
;============================================================================ |
SH1 SEND_DISC_CMD(P=X) |
P_FLAG:=P |
START_ACK_TIMER |
STOP_OTHER_TIMERS |
RETRY_COUNT:=0 |
SH2 SEND_SABME_CMD(P=X) |
P_FLAG:=P |
START_ACK_TIMER |
STOP_OTHER_TIMERS |
RETRY_COUNT:=0 |
S_FLAG:=0 |
SH3 RESET_INDICATION(REMOTE) |
F_FLAG:=P |
STOP_ALL_TIMERS |
SH4 SEND_UA_RSP(F=X) |
DISCONNECT_INDICATION |
STOP_ALL_TIMERS |
SH5 STOP_ALL_TIMERS |
RESET_INDICATION(LOCAL) |
REPORT_STATUS(FRMR_RECEIVED) |
S_FLAG:=0 |
SH6 DISCONNECT_INDICATION |
STOP_ALL_TIMERS |
SH7 SEND_FRMR_RSP(F=X) |
REPORT_STATUS(FRMR_SENT) |
START_ACK_TIMER |
STOP_OTHER_TIMERS |
RETRY_COUNT:=0 |
SH8 SEND_FRMR_RSP(F=0) |
REPORT_STATUS(FRMR_SENT) |
START_ACK_TIMER |
STOP_OTHER_TIMERS |
RETRY_COUNT:=0 |
SH9 SEND_FRMR_RSP(F=0) |
REPORT_STATUS(FRMR_SENT) |
START_ACK_TIMER |
STOP_OTHER_TIMERS |
RETRY_COUNT:=0 |
SH10 SEND_FRMR_RSP(F=X) |
REPORT_STATUS(FRMR_SENT) |
START_ACK_TIMER |
STOP_OTHER_TIMERS |
RETRY_COUNT:=0 |
SH11 STOP_ALL_TIMERS |
RESET_INDICATION(LOCAL) |
S_FLAG:=0 |
;============================================================================ |
NORMAL1 SEND_I_CMD(P=1) |
START_P_TIMER |
START_ACK_TIMER_IF_NOT_RUNNING |
; SEND_I_XXX(X=0) |
; START_ACK_TIMER_IF_NOT_RUNNING |
NORMAL2 SEND_I_XXX(X=0) |
START_ACK_TIMER_IF_NOT_RUNNING |
NORMAL3 SEND_RNR_CMD(F=1) |
START_P_TIMER |
DATA_FLAG:=0 |
; SEND_RNR_XXX(X=0) |
; DATA_FLAG:=0 |
NORMAL4 SEND_RNR_XXX(X=0) |
DATA_FLAG:=0 |
NORMAL5 SEND_REJ_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
UPDATE_P_FLAG |
START_REJ_TIMER |
IF_F=1_CLEAR_REMOTE_BUSY |
; SEND_REJ_CMD(P=1) |
; UPDATE_N(R)_RECEIVED |
; START_P_TIMER |
; START_REJ_TIMER |
; IF_F=1_CLEAR_REMOTE_BUSY |
NORMAL6 SEND_REJ_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
START_REJ_TIMER |
NORMAL7 SEND_REJ_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
START_REJ_TIMER |
; |
; the order of opcodes in NORMAL8 is changed. |
; the transition table will execute NORMAL8A for incoming pdus |
; with p/f 1, pdus with pf 0 are treated in NORMAL8B. |
; |
NORMAL8A V(R):=V(R)+1 |
SEND_ACKNOWLEDGE_CMD(P=1) |
START_P_TIMER |
UPDATE_N(R)_RECEIVED |
IF_F=1_CLEAR_REMOTE_BUSY |
DATA_INDICATION |
; |
NORMAL8B V(R):=V(R)+1 |
UPDATE_P_FLAG |
SEND_ACKNOWLEDGE_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
IF_F=1_CLEAR_REMOTE_BUSY |
DATA_INDICATION |
; |
; the order of opcodes in NORMAL9 is changed |
NORMAL9 V(R):=V(R)+1 |
SEND_ACKNOWLEDGE_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
DATA_INDICATION |
; |
; the order of opcodes in NORMAL10 is changed |
NORMAL10 V(R):=V(R)+1 |
SEND_ACKNOWLEDGE_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
DATA_INDICATION |
NORMAL11 UPDATE_P_FLAG |
UPDATE_N(R)_RECEIVED |
CLEAR_REMOTE_BUSY |
NORMAL12 SEND_ACKNOWLEDGE_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
CLEAR_REMOTE_BUSY |
NORMAL13 UPDATE_P_FLAG |
UPDATE_N(R)_RECEIVED |
SET_REMOTE_BUSY |
NORMAL14 SEND_RR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
SET_REMOTE_BUSY |
NORMAL15 V(S):=N(R) |
UPDATE_N(R)_RECEIVED |
UPDATE_P_FLAG |
RE-SEND_I_XXX(X=0) |
CLEAR_REMOTE_BUSY |
; V(S):=N(R) |
; UPDATE_N(R)_RECEIVED |
; START_P_TIMER |
; RE-SEND_I_CMD(P=1) |
; CLEAR_REMOTE_BUSY |
NORMAL16 V(S):=N(R) |
UPDATE_N(R)_RECEIVED |
RE-SEND_I_XXX(X=0) |
CLEAR_REMOTE_BUSY |
NORMAL17 V(S):=N(R) |
UPDATE_N(R)_RECEIVED |
RE-SEND_I_RSP(F=1) |
CLEAR_REMOTE_BUSY |
NORMAL18 SEND_RR_CMD(P=1) |
START_P_TIMER |
NORMAL19 P_FLAG:=0 |
; SEND_RR_CMD(P=1) |
; START_P_TIMER |
; RETRY_COUNT:=RETRY_COUNT+1 |
NORMAL20 SEND_RR_CMD(P=1) |
START_P_TIMER |
RETRY_COUNT:=RETRY_COUNT+1 |
;============================================================================ |
BUSY1 SEND_I_CMD(P=1) |
START_P_TIMER |
START_ACK_TIMER_IF_NOT_RUNNING |
; SEND_I_XXX(X=0) |
; START_ACK_TIMER_IF_NOT_RUNNING |
BUSY2 SEND_I_XXX(X=0) |
START_ACK_TIMER_IF_NOT_RUNNING |
BUSY3 SEND_REJ_CMD(P=1) |
START_REJ_TIMER |
START_P_TIMER |
; SEND_REJ_XXX(X=0) |
; START_REJ_TIMER |
BUSY4 SEND_REJ_XXX(X=0) |
START_REJ_TIMER |
BUSY5 SEND_RR_CMD(P=1) |
START_P_TIMER |
SEND_RR_XXX(X=0) |
BUSY6 SEND_RR_XXX(X=0) |
BUSY7 SEND_RR_CMD(P=1) |
START_P_TIMER |
SEND_RR_XXX(X=0) |
BUSY8 SEND_RR_XXX(X=0) |
BUSY9 OPTIONAL_SEND_RNR_XXX(X=0) |
UPDATE_P_FLAG |
UPDATE_N(R)_RECEIVED |
IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1 |
IF_F=1_CLEAR_REMOTE_BUSY |
; SEND_RNR_CMD(P=1) |
; START_P_TIMER |
; UPDATE_N(R)_RECEIVED |
; IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1 |
; IF_F=1_CLEAR_REMOTE_BUSY |
BUSY10 OPTIONAL_SEND_RNR_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1 |
BUSY11 SEND_RNR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1 |
BUSY12 SEND_RNR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
IF_DATA_FLAG=2_STOP_REJ_TIMER |
DATA_FLAG:=1 |
; V(R):=V(R)+1 |
; DATA_INDICATION |
; SEND_RNR_RSP(F=1) |
; UPDATE_N(R)_RECEIVED |
; IF_DATA_FLAG=2_STOP_REJ_TIMER |
; DATA_FLAG:=0 |
BUSY13 OPTIONAL_SEND_RNR_XXX(X=0) |
UPDATE_P_FLAG |
UPDATE_N(R)_RECEIVED |
IF_DATA_FLAG=2_STOP_REJ_TIMER |
DATA_FLAG:=1 |
IF_F=1_CLEAR_REMOTE_BUSY |
; SEND_RNR_CMD(F=1) |
; START_P_TIMER |
; UPDATE_N(R)_RECEIVED |
; IF_DATA_FLAG=2_STOP_REJ_TIMER |
; DATA_FLAG:=1 |
; IF_F=1_CLEAR_REMOTE_BUSY |
; V(R):=V(R)+1 |
; DATA_INDICATION |
; SEND_RNR_CMD(F=1) |
; START_P_TIMER |
; UPDATE_N(R)_RECEIVED |
; IF_DATA_FLAG=2_STOP_REJ_TIMER |
; DATA_FLAG:=0 |
; IF_F=1_CLEAR_REMOTE_BUSY |
; V(R):=V(R)+1 |
; DATA_INDICATION |
; UPDATE_P_FLAG |
; OPTIONAL_SEND_RNR_XXX(X=0) |
; UPDATE_N(R)_RECEIVED |
; IF_DATA_FLAG=2_STOP_REJ_TIMER |
; DATA_FLAG:=0 |
; IF_F=1_CLEAR_REMOTE_BUSY |
BUSY14 OPTIONAL_SEND_RNR_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
IF_DATA_FLAG=2_STOP_REJ_TIMER |
DATA_FLAG:=1 |
; V(R):=V(R)+1 |
; DATA_INDICATION |
; OPTIONAL_SEND_RNR_XXX(X=0) |
; UPDATE_N(R)_RECEIVED |
; IF_DATA_FLAG=2_STOP_REJ_TIMER |
; DATA_FLAG:=0 |
BUSY15 UPDATE_P_FLAG |
UPDATE_N(R)_RECEIVED |
CLEAR_REMOTE_BUSY |
BUSY16 SEND_RNR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
CLEAR_REMOTE_BUSY |
BUSY17 UPDATE_P_FLAG |
UPDATE_N(R)_RECEIVED |
SET_REMOTE_BUSY |
BUSY18 SEND_RNR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
SET_REMOTE_BUSY |
BUSY19 V(S):=N(R) |
UPDATE_N(R)_RECEIVED |
UPDATE_P_FLAG |
RE-SEND_I_XXX(X=0) |
CLEAR_REMOTE_BUSY |
; V(S):=N(R) |
; UPDATE_N(R)_RECEIVED |
; RE-SEND_I_CMD(P=1) |
; CLEAR_REMOTE_BUSY |
BUSY20 V(S):=N(R) |
UPDATE_N(R)_RECEIVED |
RE-SEND_I_XXX(X=0) |
CLEAR_REMOTE_BUSY |
BUSY21 V(S):=N(R) |
UPDATE_N(R)_RECEIVED |
SEND_RNR_RSP(F=1) |
RE-SEND_I_XXX(X=0) |
CLEAR_REMOTE_BUSY |
BUSY22 SEND_RNR_CMD(F=1) |
START_P_TIMER |
BUSY23 P_FLAG:=0 |
; SEND_RNR_CMD(F=1) |
; START_P_TIMER |
; RETRY_COUNT:=RETRY_COUNT+1 |
BUSY24 SEND_RNR_CMD(F=1) |
START_P_TIMER |
RETRY_COUNT:=RETRY_COUNT+1 |
BUSY25 DATA_FLAG:=1 |
; SEND_RNR_CMD(F=1) |
; START_P_TIMER |
; RETRY_COUNT:=RETRY_COUNT+1 |
; DATA_FLAG:=1 |
BUSY26 DATA_FLAG:=1 |
;============================================================================ |
REJECT1 SEND_I_CMD(P=1) |
START_P_TIMER |
START_ACK_TIMER_IF_NOT_RUNNING |
; SEND_I_XXX(X=0) |
; START_ACK_TIMER_IF_NOT_RUNNING |
REJECT2 SEND_I_XXX(X=0) |
START_ACK_TIMER_IF_NOT_RUNNING |
REJECT3 SEND_RNR_CMD(F=1) |
START_P_TIMER |
DATA_FLAG:=2 |
; SEND_RNR_XXX(X=0) |
; DATA_FLAG:=2 |
REJECT4 SEND_RNR_XXX(X=0) |
DATA_FLAG:=2 |
REJECT5 UPDATE_N(R)_RECEIVED |
UPDATE_P_FLAG |
IF_F=1_CLEAR_REMOTE_BUSY |
REJECT6 SEND_RR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
; |
; order of opcodes in REJECT7 is changed |
REJECT7 V(R):=V(R)+1 |
SEND_ACKNOWLEDGE_CMD(P=1) |
START_P_TIMER |
UPDATE_N(R)_RECEIVED |
IF_F=1_CLEAR_REMOTE_BUSY |
STOP_REJ_TIMER |
DATA_INDICATION |
; V(R):=V(R)+1 |
; DATA_INDICATION |
; UPDATE_P_FLAG |
; SEND_ACKNOWLEDGE_XXX(X=0) |
; UPDATE_N(R)_RECEIVED |
; IF_F=1_CLEAR_REMOTE_BUSY |
; STOP_REJ_TIMER |
; |
; order of opcodes in REJECT8 is changed |
REJECT8 V(R):=V(R)+1 |
SEND_ACKNOWLEDGE_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
STOP_REJ_TIMER |
DATA_INDICATION |
; |
; order of opcodes in REJECT9 is changed |
REJECT9 V(R):=V(R)+1 |
SEND_ACKNOWLEDGE_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
STOP_REJ_TIMER |
DATA_INDICATION |
REJECT10 UPDATE_P_FLAG |
UPDATE_N(R)_RECEIVED |
CLEAR_REMOTE_BUSY |
REJECT11 SEND_ACKNOWLEDGE_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
CLEAR_REMOTE_BUSY |
REJECT12 UPDATE_P_FLAG |
UPDATE_N(R)_RECEIVED |
SET_REMOTE_BUSY |
REJECT13 SEND_RR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
SET_REMOTE_BUSY |
REJECT14 V(S):=N(R) |
UPDATE_N(R)_RECEIVED |
UPDATE_P_FLAG |
RE-SEND_I_XXX(X=0) |
CLEAR_REMOTE_BUSY |
; V(S):=N(R) |
; UPDATE_N(R)_RECEIVED |
; RE-SEND_I_CMD(P=1) |
; START_P_TIMER |
; CLEAR_REMOTE_BUSY |
REJECT15 V(S):=N(R) |
UPDATE_N(R)_RECEIVED |
RE-SEND_I_XXX(X=0) |
CLEAR_REMOTE_BUSY |
REJECT16 V(S):=N(R) |
UPDATE_N(R)_RECEIVED |
RE-SEND_I_RSP(F=1) |
CLEAR_REMOTE_BUSY |
REJECT17 SEND_RR_CMD(P=1) |
START_P_TIMER |
REJECT18 SEND_REJ_CMD(P=1) |
START_P_TIMER |
START_REJ_TIMER |
RETRY_COUNT:=RETRY_COUNT+1 |
REJECT19 P_FLAG:=0 |
; SEND_RR_CMD(P=1) |
; START_P_TIMER |
; START_REJ_TIMER |
; RETRY_COUNT:=RETRY_COUNT+1 |
REJECT20 SEND_RR_CMD(P=1) |
START_P_TIMER |
START_REJ_TIMER |
RETRY_COUNT:=RETRY_COUNT+1 |
;============================================================================ |
AWAIT1 SEND_RNR_XXX(X=0) |
DATA_FLAG:=0 |
AWAIT2 SEND_REJ_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
V(S):=N(R) |
STOP_P_TIMER |
RE-SEND_I_XXX(X=0) |
START_REJ_TIMER |
CLEAR_REMOTE_BUSY |
; SEND_REJ_CMD(P=1) |
; UPDATE_N(R)_RECEIVED |
; V(S):=N(R) |
; RE-SEND_I_XXX(X=0) |
; START_P_TIMER |
; START_REJ_TIMER |
; CLEAR_REMOTE_BUSY |
AWAIT3 SEND_REJ_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
START_REJ_TIMER |
AWAIT4 SEND_REJ_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
START_REJ_TIMER |
; |
; order of opcode in AWAIT5 changed |
AWAIT5 V(R):=V(R)+1 |
UPDATE_N(R)_RECEIVED |
V(S):=N(R) |
RE-SEND_I_CMD(P=1)_OR_SEND_RR |
START_P_TIMER |
CLEAR_REMOTE_BUSY |
DATA_INDICATION |
; V(R):=V(R)+1 |
; DATA_INDICATION |
; STOP_P_TIMER |
; UPDATE_N(R)_RECEIVED |
; V(S):=N(R) |
; RE-SEND_I_XXX(X=0)_OR_SEND_RR |
; CLEAR_REMOTE_BUSY |
; |
; order of opcode in AWAIT6 changed |
AWAIT6 V(R):=V(R)+1 |
SEND_RR_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
DATA_INDICATION |
; |
; order of opcode in AWAIT7 changed |
AWAIT7 V(R):=V(R)+1 |
SEND_RR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
DATA_INDICATION |
AWAIT8 UPDATE_N(R)_RECEIVED |
V(S):=N(R) |
STOP_P_TIMER |
RE-SEND_I_XXX(X=0) |
CLEAR_REMOTE_BUSY |
; UPDATE_N(R)_RECEIVED |
; V(S):=N(R) |
; RE-SEND_I_CMD(P=1) |
; START_P_TIMER |
; CLEAR_REMOTE_BUSY |
AWAIT9 UPDATE_N(R)_RECEIVED |
CLEAR_REMOTE_BUSY |
AWAIT10 SEND_RR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
CLEAR_REMOTE_BUSY |
AWAIT11 UPDATE_N(R)_RECEIVED |
V(S):=N(R) |
STOP_P_TIMER |
SET_REMOTE_BUSY |
AWAIT12 UPDATE_N(R)_RECEIVED |
SET_REMOTE_BUSY |
AWAIT13 SEND_RR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
SET_REMOTE_BUSY |
AWAIT14 SEND_RR_CMD(P=1) |
START_P_TIMER |
RETRY_COUNT:=RETRY_COUNT+1 |
;============================================================================ |
AWAIT_BUSY1 SEND_REJ_XXX(X=0) |
START_REJ_TIMER |
AWAIT_BUSY2 SEND_RR_XXX(X=0) |
AWAIT_BUSY3 SEND_RR_XXX(X=0) |
AWAIT_BUSY4 OPTIONAL_SEND_RNR_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
V(S):=N(R) |
STOP_P_TIMER |
DATA_FLAG:=1 |
CLEAR_REMOTE_BUSY |
RE-SEND_I_XXX(X=0) |
; SEND_RNR_CMD(F=1) |
; UPDATE_N(R)_RECEIVED |
; V(S):=N(R) |
; START_P_TIMER |
; DATA_FLAG:=1 |
; CLEAR_REMOTE_BUSY |
; RE-SEND_I_XXX(X=0) |
AWAIT_BUSY5 OPTIONAL_SEND_RNR_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
DATA_FLAG:=1 |
AWAIT_BUSY6 SEND_RNR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
DATA_FLAG:=1 |
AWAIT_BUSY7 OPTIONAL_SEND_RNR_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
V(S):=N(R) |
DATA_FLAG:=1 |
STOP_P_TIMER |
CLEAR_REMOTE_BUSY |
RE-SEND_I_XXX(X=0) |
; SEND_RNR_CMD(F=1) |
; V(R):=V(R)+1 |
; DATA_INDICATION |
; START_P_TIMER |
; UPDATE_N(R)_RECEIVED |
; V(S):=N(R) |
; DATA_FLAG:=0 |
; CLEAR_REMOTE_BUSY |
; RE-SEND_I_XXX(X=0) |
; OPTIONAL_SEND_RNR_XXX(X=0) |
; V(R):=V(R)+1 |
; DATA_INDICATION |
; STOP_P_TIMER |
; UPDATE_N(R)_RECEIVED |
; V(S):=N(R) |
; DATA_FLAG:=0 |
; CLEAR_REMOTE_BUSY |
; RE-SEND_I_XXX(X=0) |
AWAIT_BUSY8 OPTIONAL_SEND_RNR_XXX(X=0) |
UPDATE_N(R)_RECEIVED |
DATA_FLAG:=1 |
; OPTIONAL_SEND_RNR_XXX(X=0) |
; V(R):=V(R)+1 |
; DATA_INDICATION |
; UPDATE_N(R)_RECEIVED |
; DATA_FLAG:=0 |
AWAIT_BUSY9 SEND_RNR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
DATA_FLAG:=1 |
; SEND_RNR_RSP(F=1) |
; V(R):=V(R)+1 |
; DATA_INDICATION |
; UPDATE_N(R)_RECEIVED |
; DATA_FLAG:=0 |
AWAIT_BUSY10 UPDATE_N(R)_RECEIVED |
V(S):=N(R) |
STOP_P_TIMER |
RE-SEND_I_XXX(X=0) |
CLEAR_REMOTE_BUSY |
; UPDATE_N(R)_RECEIVED |
; V(S):=N(R) |
; RE-SEND_I_CMD(P=1) |
; START_P_TIMER |
; CLEAR_REMOTE_BUSY |
AWAIT_BUSY11 UPDATE_N(R)_RECEIVED |
CLEAR_REMOTE_BUSY |
AWAIT_BUSY12 SEND_RNR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
CLEAR_REMOTE_BUSY |
AWAIT_BUSY13 UPDATE_N(R)_RECEIVED |
V(S):=N(R) |
STOP_P_TIMER |
SET_REMOTE_BUSY |
AWAIT_BUSY14 UPDATE_N(R)_RECEIVED |
SET_REMOTE_BUSY |
AWAIT_BUSY15 SEND_RNR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
SET_REMOTE_BUSY |
AWAIT_BUSY16 SEND_RNR_CMD(F=1) |
START_P_TIMER |
RETRY_COUNT:=RETRY_COUNT+1 |
;============================================================================ |
AWAIT_REJECT1 SEND_RNR_XXX(X=0) |
DATA_FLAG:=2 |
AWAIT_REJECT2 UPDATE_N(R)_RECEIVED |
AWAIT_REJECT3 SEND_RR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
; |
; order of opcodes in AWAIT_REJECT4 changed |
AWAIT_REJECT4 V(R):=V(R)+1 |
UPDATE_N(R)_RECEIVED |
V(S):=N(R) |
RE-SEND_I_CMD(P=1)_OR_SEND_RR |
START_P_TIMER |
STOP_REJ_TIMER |
CLEAR_REMOTE_BUSY |
DATA_INDICATION |
; V(R):=V(R)+1 |
; DATA_INDICATION |
; STOP_P_TIMER |
; STOP_REJ_TIMER |
; UPDATE_N(R)_RECEIVED |
; V(S):=N(R) |
; RE-SEND_I_CMD(P=1)_OR_SEND_RR |
; CLEAR_REMOTE_BUSY |
; |
; order of opcodes in AWAIT_REJECT5 changed |
AWAIT_REJECT5 V(R):=V(R)+1 |
SEND_RR_XXX(X=0) |
STOP_REJ_TIMER |
UPDATE_N(R)_RECEIVED |
DATA_INDICATION |
; |
; order of opcodes in AWAIT_REJECT6 changed |
AWAIT_REJECT6 V(R):=V(R)+1 |
SEND_RR_RSP(F=1) |
STOP_REJ_TIMER |
UPDATE_N(R)_RECEIVED |
DATA_INDICATION |
AWAIT_REJECT7 UPDATE_N(R)_RECEIVED |
V(S):=N(R) |
STOP_P_TIMER |
RE-SEND_I_XXX(X=0) |
CLEAR_REMOTE_BUSY |
; UPDATE_N(R)_RECEIVED |
; V(S):=N(R) |
; RE-SEND_I_CMD(P=1) |
; START_P_TIMER |
; CLEAR_REMOTE_BUSY |
AWAIT_REJECT8 UPDATE_N(R)_RECEIVED |
CLEAR_REMOTE_BUSY |
AWAIT_REJECT9 SEND_RR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
CLEAR_REMOTE_BUSY |
AWAIT_REJECT10 UPDATE_N(R)_RECEIVED |
V(S):=N(R) |
STOP_P_TIMER |
SET_REMOTE_BUSY |
AWAIT_REJECT11 UPDATE_N(R)_RECEIVED |
SET_REMOTE_BUSY |
AWAIT_REJECT12 SEND_RR_RSP(F=1) |
UPDATE_N(R)_RECEIVED |
SET_REMOTE_BUSY |
AWAIT_REJECT13 SEND_REJ_CMD(P=1) |
START_P_TIMER |
RETRY_COUNT:=RETRY_COUNT+1 |
;============================================================================ |
|
/pseudo/opcodes
0,0 → 1,72
0 NOP |
1 CLEAR_REMOTE_BUSY |
2 CONNECT_INDICATION |
3 CONNECT_CONFIRM |
4 DATA_INDICATION |
5 DISCONNECT_INDICATION |
6 DUMMY_6 |
7 RESET_CONFIRM |
8 DUMMY_8 |
9 IF_F=1_CLEAR_REMOTE_BUSY |
10 IF_DATA_FLAG=2_STOP_REJ_TIMER |
11 SEND_DISC_CMD(P=X) |
12 SEND_DM_RSP(F=X) |
13 SEND_FRMR_RSP(F=X) |
14 RE-SEND_FRMR_RSP(F=0) |
15 RE-SEND_FRMR_RSP(F=P) |
16 SEND_I_CMD(P=1) |
17 RE-SEND_I_CMD(P=1) |
18 RE-SEND_I_CMD(P=1)_OR_SEND_RR |
19 SEND_I_XXX(X=0) |
20 RE-SEND_I_XXX(X=0) |
21 RE-SEND_I_XXX(X=0)_OR_SEND_RR |
22 RE-SEND_I_RSP(F=1) |
23 SEND_REJ_CMD(P=1) |
24 SEND_REJ_RSP(F=1) |
25 SEND_REJ_XXX(X=0) |
26 SEND_RNR_CMD(F=1) |
27 SEND_RNR_RSP(F=1) |
28 SEND_RNR_XXX(X=0) |
29 SET_REMOTE_BUSY |
30 OPTIONAL_SEND_RNR_XXX(X=0) |
31 SEND_RR_CMD(P=1) |
32 SEND_ACKNOWLEDGE_CMD(P=1) |
33 SEND_RR_RSP(F=1) |
34 SEND_ACKNOWLEDGE_RSP(F=1) |
35 SEND_RR_XXX(X=0) |
36 SEND_ACKNOWLEDGE_XXX(X=0) |
37 SEND_SABME_CMD(P=X) |
38 SEND_UA_RSP(F=X) |
39 S_FLAG:=0 |
40 S_FLAG:=1 |
41 START_P_TIMER |
42 START_ACK_TIMER |
43 START_REJ_TIMER |
44 START_ACK_TIMER_IF_NOT_RUNNING |
45 STOP_ACK_TIMER |
46 STOP_P_TIMER |
47 STOP_REJ_TIMER |
48 STOP_ALL_TIMERS |
49 STOP_OTHER_TIMERS |
50 UPDATE_N(R)_RECEIVED |
51 UPDATE_P_FLAG |
52 DATA_FLAG:=2 |
53 DATA_FLAG:=0 |
54 DATA_FLAG:=1 |
55 IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1 |
56 P_FLAG:=0 |
57 P_FLAG:=P |
58 REMOTE_BUSY:=0 |
59 RETRY_COUNT:=0 |
60 RETRY_COUNT:=RETRY_COUNT+1 |
61 V(R):=0 |
62 V(R):=V(R)+1 |
63 V(S):=0 |
64 V(S):=N(R) |
65 F_FLAG:=P |
66 REPORT_STATUS(FRMR_RECEIVED) |
67 REPORT_STATUS(FRMR_SENT) |
68 REPORT_STATUS(REMOTE_BUSY) |
69 REPORT_STATUS(REMOTE_NOT_BUSY) |
70 RESET_INDICATION(LOCAL) |
71 RESET_INDICATION(REMOTE) |
/pseudo/Makefile
0,0 → 1,13
all: pseudocode.h actionnm.h |
|
clean: |
touch pseudocode.h actionnm.h |
rm pseudocode.h actionnm.h |
|
pseudocode.h: pseudocode opcd2num.sed compile.awk |
sed -f opcd2num.sed pseudocode | awk -f compile.awk >pseudocode.h |
|
actionnm.h: pseudocode.h actionnm.awk |
awk -f actionnm.awk pseudocode.h>actionnm.h |
|
|
/pseudo/opcodesnm.h
0,0 → 1,23
static char *opcode_names[] = { |
"NOP", "CLEAR_REMOTE_BUSY", "CONNECT_INDICATION", "CONNECT_CONFIRM", "DATA_INDICATION", |
"DISCONNECT_INDICATION", "DUMMY_6", "RESET_CONFIRM", "DUMMY_8", |
"IF_F=1_CLEAR_REMOTE_BUSY", "IF_DATA_FLAG=2_STOP_REJ_TIMER", "SEND_DISC_CMD(P=X)", |
"SEND_DM_RSP(F=X)", "SEND_FRMR_RSP(F=X)", "RE-SEND_FRMR_RSP(F=0)", |
"RE-SEND_FRMR_RSP(F=P)", "SEND_I_CMD(P=1)", "RE-SEND_I_CMD(P=1)", |
"RE-SEND_I_CMD(P=1)_OR_SEND_RR", "SEND_I_XXX(X=0)", "RE-SEND_I_XXX(X=0)", |
"RE-SEND_I_XXX(X=0)_OR_SEND_RR", "RE-SEND_I_RSP(F=1)", "SEND_REJ_CMD(P=1)", |
"SEND_REJ_RSP(F=1)", "SEND_REJ_XXX(X=0)", "SEND_RNR_CMD(F=1)", "SEND_RNR_RSP(F=1)", |
"SEND_RNR_XXX(X=0)", "SET_REMOTE_BUSY", "OPTIONAL_SEND_RNR_XXX(X=0)", |
"SEND_RR_CMD(P=1)", "SEND_ACKNOWLEDGE_CMD(P=1)", "SEND_RR_RSP(F=1)", |
"SEND_ACKNOWLEDGE_RSP(F=1)", "SEND_RR_XXX(X=0)", "SEND_ACKNOWLEDGE_XXX(X=0)", |
"SEND_SABME_CMD(P=X)", "SEND_UA_RSP(F=X)", "S_FLAG:=0", "S_FLAG:=1", "START_P_TIMER", |
"START_ACK_TIMER", "START_REJ_TIMER", "START_ACK_TIMER_IF_NOT_RUNNING", |
"STOP_ACK_TIMER", "STOP_P_TIMER", "STOP_REJ_TIMER", "STOP_ALL_TIMERS", |
"STOP_OTHER_TIMERS", "UPDATE_N(R)_RECEIVED", "UPDATE_P_FLAG", "DATA_FLAG:=2", |
"DATA_FLAG:=0", "DATA_FLAG:=1", "IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1", "P_FLAG:=0", |
"P_FLAG:=P", "REMOTE_BUSY:=0", "RETRY_COUNT:=0", "RETRY_COUNT:=RETRY_COUNT+1", |
"V(R):=0", "V(R):=V(R)+1", "V(S):=0", "V(S):=N(R)", "F_FLAG:=P", |
"REPORT_STATUS(FRMR_RECEIVED)", "REPORT_STATUS(FRMR_SENT)", |
"REPORT_STATUS(REMOTE_BUSY)", "REPORT_STATUS(REMOTE_NOT_BUSY)", |
"RESET_INDICATION(LOCAL)", "RESET_INDICATION(REMOTE)" |
}; |
/pseudo/actionnm.h
0,0 → 1,51
|
/* this file generated on Thu Oct 24 11:42:37 GMT 1996 */ |
|
static char *action_names[] = { |
"NOP" ,"ADM1" ,"ADM2" ,"ADM3" , |
"ADM4" ,"ADM5" ,"CONN2" ,"CONN3" , |
"CONN4" ,"CONN5" ,"RESWAIT1" ,"RESWAIT2" , |
"RESWAIT3" ,"RESWAIT4" ,"RESWAIT5" ,"RESWAIT6" , |
"RESWAIT7" ,"RESWAIT8" ,"RESCHK1" ,"RESCHK2" , |
"RESCHK3" ,"RESCHK4" ,"RESCHK5" ,"RESCHK6" , |
"SETUP1" ,"SETUP2" ,"SETUP3" ,"SETUP4" , |
"SETUP5" ,"SETUP6" ,"SETUP7" ,"SETUP8" , |
"RESET1" ,"RESET2" ,"RESET3" ,"RESET4" , |
"RESET5" ,"RESET6" ,"RESET7" ,"RESET8" , |
"D_CONN1" ,"D_CONN2" ,"D_CONN3" ,"D_CONN4" , |
"D_CONN5" ,"D_CONN6" ,"D_CONN7" ,"ERR1" , |
"ERR2" ,"ERR3" ,"ERR4" ,"ERR5" , |
"ERR6" ,"ERR7" ,"ERR8" ,"SH1" , |
"SH2" ,"SH3" ,"SH4" ,"SH5" , |
"SH6" ,"SH7" ,"SH8" ,"SH9" , |
"SH10" ,"SH11" ,"NORMAL1" ,"NORMAL2" , |
"NORMAL3" ,"NORMAL4" ,"NORMAL5" ,"NORMAL6" , |
"NORMAL7" ,"NORMAL8A" ,"NORMAL8B" ,"NORMAL9" , |
"NORMAL10" ,"NORMAL11" ,"NORMAL12" ,"NORMAL13" , |
"NORMAL14" ,"NORMAL15" ,"NORMAL16" ,"NORMAL17" , |
"NORMAL18" ,"NORMAL19" ,"NORMAL20" ,"BUSY1" , |
"BUSY2" ,"BUSY3" ,"BUSY4" ,"BUSY5" , |
"BUSY6" ,"BUSY7" ,"BUSY8" ,"BUSY9" , |
"BUSY10" ,"BUSY11" ,"BUSY12" ,"BUSY13" , |
"BUSY14" ,"BUSY15" ,"BUSY16" ,"BUSY17" , |
"BUSY18" ,"BUSY19" ,"BUSY20" ,"BUSY21" , |
"BUSY22" ,"BUSY23" ,"BUSY24" ,"BUSY25" , |
"BUSY26" ,"REJECT1" ,"REJECT2" ,"REJECT3" , |
"REJECT4" ,"REJECT5" ,"REJECT6" ,"REJECT7" , |
"REJECT8" ,"REJECT9" ,"REJECT10" ,"REJECT11" , |
"REJECT12" ,"REJECT13" ,"REJECT14" ,"REJECT15" , |
"REJECT16" ,"REJECT17" ,"REJECT18" ,"REJECT19" , |
"REJECT20" ,"AWAIT1" ,"AWAIT2" ,"AWAIT3" , |
"AWAIT4" ,"AWAIT5" ,"AWAIT6" ,"AWAIT7" , |
"AWAIT8" ,"AWAIT9" ,"AWAIT10" ,"AWAIT11" , |
"AWAIT12" ,"AWAIT13" ,"AWAIT14" ,"AWAIT_BUSY1" , |
"AWAIT_BUSY2" ,"AWAIT_BUSY3" ,"AWAIT_BUSY4" ,"AWAIT_BUSY5" , |
"AWAIT_BUSY6" ,"AWAIT_BUSY7" ,"AWAIT_BUSY8" ,"AWAIT_BUSY9" , |
"AWAIT_BUSY10" ,"AWAIT_BUSY11" ,"AWAIT_BUSY12" ,"AWAIT_BUSY13" , |
"AWAIT_BUSY14" ,"AWAIT_BUSY15" ,"AWAIT_BUSY16" ,"AWAIT_REJECT1" , |
"AWAIT_REJECT2" ,"AWAIT_REJECT3" ,"AWAIT_REJECT4" ,"AWAIT_REJECT5" , |
"AWAIT_REJECT6" ,"AWAIT_REJECT7" ,"AWAIT_REJECT8" ,"AWAIT_REJECT9" , |
"AWAIT_REJECT10" ,"AWAIT_REJECT11" ,"AWAIT_REJECT12" ,"AWAIT_REJECT13" , |
0 |
}; |
|
/cl2llc.pre
0,0 → 1,615
/* |
* NET An implementation of the IEEE 802.2 LLC protocol for the |
* LINUX operating system. LLC is implemented as a set of |
* state machines and callbacks for higher networking layers. |
* |
* Class 2 llc algorithm. |
* Pseudocode interpreter, transition table lookup, |
* data_request & indicate primitives... |
* |
* Code for initialization, termination, registration and |
* MAC layer glue. |
* |
* Copyright Tim Alpaerts, |
* <Tim_Alpaerts@toyota-motor-europe.com> |
* |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU General Public License |
* as published by the Free Software Foundation; either version |
* 2 of the License, or (at your option) any later version. |
* |
* Changes |
* Alan Cox : Chainsawed into Linux format |
* Modified to use llc_ names |
* Changed callbacks |
* |
* This file must be processed by sed before it can be compiled. |
*/ |
|
#include <linux/types.h> |
#include <linux/kernel.h> |
#include <linux/slab.h> |
#include <linux/netdevice.h> |
#include <linux/skbuff.h> |
#include <net/p8022.h> |
#include <linux/proc_fs.h> |
#include <linux/stat.h> |
#include <asm/byteorder.h> |
|
#include "pseudo/pseudocode.h" |
#include "transit/pdutr.h" |
#include "transit/timertr.h" |
#include <net/llc_frame.h> |
#include <net/llc.h> |
|
/* |
* Data_request() is called by the client to present a data unit |
* to the llc for transmission. |
* In the future this function should also check if the transmit window |
* allows the sending of another pdu, and if not put the skb on the atq |
* for deferred sending. |
*/ |
|
int llc_data_request(llcptr lp, struct sk_buff *skb) |
{ |
if (skb_headroom(skb) < (lp->dev->hard_header_len +4)){ |
printk("cl2llc: data_request() not enough headroom in skb\n"); |
return -1; |
}; |
|
skb_push(skb, 4); |
|
if ((lp->state != NORMAL) && (lp->state != BUSY) && (lp->state != REJECT)) |
{ |
printk("cl2llc: data_request() while no llc connection\n"); |
return -1; |
} |
|
if (lp->remote_busy) |
{ /* if the remote llc is BUSY, */ |
ADD_TO_ATQ(skb); /* save skb in the await transmit queue */ |
return 0; |
} |
else |
{ |
/* |
* Else proceed with xmit |
*/ |
|
switch(lp->state) |
{ |
case NORMAL: |
if(lp->p_flag) |
llc_interpret_pseudo_code(lp, NORMAL2, skb, NO_FRAME); |
else |
llc_interpret_pseudo_code(lp, NORMAL1, skb, NO_FRAME); |
break; |
case BUSY: |
if (lp->p_flag) |
llc_interpret_pseudo_code(lp, BUSY2, skb, NO_FRAME); |
else |
llc_interpret_pseudo_code(lp, BUSY1, skb, NO_FRAME); |
break; |
case REJECT: |
if (lp->p_flag) |
llc_interpret_pseudo_code(lp, REJECT2, skb, NO_FRAME); |
else |
llc_interpret_pseudo_code(lp, REJECT1, skb, NO_FRAME); |
break; |
default:; |
} |
if(lp->llc_callbacks) |
{ |
lp->llc_event(lp); |
lp->llc_callbacks=0; |
} |
return 0; |
} |
} |
|
|
|
/* |
* Disconnect_request() requests that the llc to terminate a connection |
*/ |
|
void disconnect_request(llcptr lp) |
{ |
if ((lp->state == NORMAL) || |
(lp->state == BUSY) || |
(lp->state == REJECT) || |
(lp->state == AWAIT) || |
(lp->state == AWAIT_BUSY) || |
(lp->state == AWAIT_REJECT)) |
{ |
lp->state = D_CONN; |
llc_interpret_pseudo_code(lp, SH1, NULL, NO_FRAME); |
if(lp->llc_callbacks) |
{ |
lp->llc_event(lp); |
lp->llc_callbacks=0; |
} |
/* |
* lp may be invalid after the callback |
*/ |
} |
} |
|
|
/* |
* Connect_request() requests that the llc to start a connection |
*/ |
|
void connect_request(llcptr lp) |
{ |
if (lp->state == ADM) |
{ |
lp->state = SETUP; |
llc_interpret_pseudo_code(lp, ADM1, NULL, NO_FRAME); |
if(lp->llc_callbacks) |
{ |
lp->llc_event(lp); |
lp->llc_callbacks=0; |
} |
/* |
* lp may be invalid after the callback |
*/ |
} |
} |
|
|
/* |
* Interpret_pseudo_code() executes the actions in the connection component |
* state transition table. Table 4 in document on p88. |
* |
* If this function is called to handle an incoming pdu, skb will point |
* to the buffer with the pdu and type will contain the decoded pdu type. |
* |
* If called by data_request skb points to an skb that was skb_alloc-ed by |
* the llc client to hold the information unit to be transmitted, there is |
* no valid type in this case. |
* |
* If called because a timer expired no skb is passed, and there is no |
* type. |
*/ |
|
void llc_interpret_pseudo_code(llcptr lp, int pc_label, struct sk_buff *skb, |
char type) |
{ |
short int pc; /* program counter in pseudo code array */ |
char p_flag_received; |
frameptr fr; |
int resend_count; /* number of pdus resend by llc_resend_ipdu() */ |
int ack_count; /* number of pdus acknowledged */ |
struct sk_buff *skb2; |
|
if (skb != NULL) |
{ |
fr = (frameptr) skb->data; |
} |
else |
fr = NULL; |
|
pc = pseudo_code_idx[pc_label]; |
while(pseudo_code[pc]) |
{ |
switch(pseudo_code[pc]) |
{ |
case IF_F=1_CLEAR_REMOTE_BUSY: |
if ((type != I_CMD) || (fr->i_hdr.i_pflag == 0)) |
break; |
case CLEAR_REMOTE_BUSY: |
lp->remote_busy = 0; |
llc_stop_timer(lp, BUSY_TIMER); |
if ((lp->state == NORMAL) || |
(lp->state == REJECT) || |
(lp->state == BUSY)) |
{ |
skb2 = llc_pull_from_atq(lp); |
if (skb2 != NULL) |
llc_start_timer(lp, ACK_TIMER); |
while (skb2 != NULL) |
{ |
llc_sendipdu( lp, I_CMD, 0, skb2); |
skb2 = llc_pull_from_atq(lp); |
} |
} |
break; |
case CONNECT_INDICATION: |
lp->state = NORMAL; /* needed to eliminate connect_response() */ |
lp->llc_mode = MODE_ABM; |
lp->llc_callbacks|=LLC_CONN_INDICATION; |
break; |
case CONNECT_CONFIRM: |
lp->llc_mode = MODE_ABM; |
lp->llc_callbacks|=LLC_CONN_CONFIRM; |
break; |
case DATA_INDICATION: |
skb_pull(skb, 4); |
lp->inc_skb=skb; |
lp->llc_callbacks|=LLC_DATA_INDIC; |
break; |
case DISCONNECT_INDICATION: |
lp->llc_mode = MODE_ADM; |
lp->llc_callbacks|=LLC_DISC_INDICATION; |
break; |
case RESET_INDICATION(LOCAL): |
lp->llc_callbacks|=LLC_RESET_INDIC_LOC; |
break; |
case RESET_INDICATION(REMOTE): |
lp->llc_callbacks|=LLC_RESET_INDIC_REM; |
break; |
case RESET_CONFIRM: |
lp->llc_callbacks|=LLC_RST_CONFIRM; |
break; |
case REPORT_STATUS(FRMR_RECEIVED): |
lp->llc_callbacks|=LLC_FRMR_RECV; |
break; |
case REPORT_STATUS(FRMR_SENT): |
lp->llc_callbacks|=LLC_FRMR_SENT; |
break; |
case REPORT_STATUS(REMOTE_BUSY): |
lp->llc_callbacks|=LLC_REMOTE_BUSY; |
break; |
case REPORT_STATUS(REMOTE_NOT_BUSY): |
lp->llc_callbacks|=LLC_REMOTE_NOTBUSY; |
break; |
case SEND_DISC_CMD(P=X): |
llc_sendpdu(lp, DISC_CMD, lp->f_flag, 0, NULL); |
break; |
case SEND_DM_RSP(F=X): |
llc_sendpdu(lp, DM_RSP, 0, 0, NULL); |
break; |
case SEND_FRMR_RSP(F=X): |
lp->frmr_info_fld.cntl1 = fr->pdu_cntl.byte1; |
lp->frmr_info_fld.cntl2 = fr->pdu_cntl.byte2; |
lp->frmr_info_fld.vs = lp->vs; |
lp->frmr_info_fld.vr_cr = lp->vr; |
llc_sendpdu(lp, FRMR_RSP, 0, 5, (char *) &lp->frmr_info_fld); |
break; |
case RE-SEND_FRMR_RSP(F=0): |
llc_sendpdu(lp, FRMR_RSP, 0, 5, (char *) &lp->frmr_info_fld); |
break; |
case RE-SEND_FRMR_RSP(F=P): |
llc_sendpdu(lp, FRMR_RSP, lp->p_flag, |
5, (char *) &lp->frmr_info_fld); |
break; |
case SEND_I_CMD(P=1): |
llc_sendipdu(lp, I_CMD, 1, skb); |
break; |
case RE-SEND_I_CMD(P=1): |
resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 1); |
break; |
case RE-SEND_I_CMD(P=1)_OR_SEND_RR: |
resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 1); |
if (resend_count == 0) |
{ |
llc_sendpdu(lp, RR_CMD, 1, 0, NULL); |
} |
break; |
case SEND_I_XXX(X=0): |
llc_sendipdu(lp, I_CMD, 0, skb); |
break; |
case RE-SEND_I_XXX(X=0): |
resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 0); |
break; |
case RE-SEND_I_XXX(X=0)_OR_SEND_RR: |
resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 0); |
if (resend_count == 0) |
{ |
llc_sendpdu(lp, RR_CMD, 0, 0, NULL); |
} |
break; |
case RE-SEND_I_RSP(F=1): |
resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_RSP, 1); |
break; |
case SEND_REJ_CMD(P=1): |
llc_sendpdu(lp, REJ_CMD, 1, 0, NULL); |
break; |
case SEND_REJ_RSP(F=1): |
llc_sendpdu(lp, REJ_RSP, 1, 0, NULL); |
break; |
case SEND_REJ_XXX(X=0): |
if (IS_RSP(fr)) |
llc_sendpdu(lp, REJ_CMD, 0, 0, NULL); |
else |
llc_sendpdu(lp, REJ_RSP, 0, 0, NULL); |
break; |
case SEND_RNR_CMD(F=1): |
llc_sendpdu(lp, RNR_CMD, 1, 0, NULL); |
break; |
case SEND_RNR_RSP(F=1): |
llc_sendpdu(lp, RNR_RSP, 1, 0, NULL); |
break; |
case SEND_RNR_XXX(X=0): |
if (IS_RSP(fr)) |
llc_sendpdu(lp, RNR_CMD, 0, 0, NULL); |
else |
llc_sendpdu(lp, RNR_RSP, 0, 0, NULL); |
break; |
case SET_REMOTE_BUSY: |
if (lp->remote_busy == 0) |
{ |
lp->remote_busy = 1; |
llc_start_timer(lp, BUSY_TIMER); |
lp->llc_callbacks|=LLC_REMOTE_BUSY; |
} |
else if (lp->timer_state[BUSY_TIMER] == TIMER_IDLE) |
{ |
llc_start_timer(lp, BUSY_TIMER); |
} |
break; |
case OPTIONAL_SEND_RNR_XXX(X=0): |
if (IS_RSP(fr)) |
llc_sendpdu(lp, RNR_CMD, 0, 0, NULL); |
else |
llc_sendpdu(lp, RNR_RSP, 0, 0, NULL); |
break; |
case SEND_RR_CMD(P=1): |
llc_sendpdu(lp, RR_CMD, 1, 0, NULL); |
break; |
case SEND_ACKNOWLEDGE_CMD(P=1): |
llc_sendpdu(lp, RR_CMD, 1, 0, NULL); |
break; |
case SEND_RR_RSP(F=1): |
llc_sendpdu(lp, RR_RSP, 1, 0, NULL); |
break; |
case SEND_ACKNOWLEDGE_RSP(F=1): |
llc_sendpdu(lp, RR_RSP, 1, 0, NULL); |
break; |
case SEND_RR_XXX(X=0): |
llc_sendpdu(lp, RR_RSP, 0, 0, NULL); |
break; |
case SEND_ACKNOWLEDGE_XXX(X=0): |
if (IS_RSP(fr)) |
llc_sendpdu(lp, RR_CMD, 0, 0, NULL); |
else |
llc_sendpdu(lp, RR_RSP, 0, 0, NULL); |
break; |
case SEND_SABME_CMD(P=X): |
llc_sendpdu(lp, SABME_CMD, 0, 0, NULL); |
lp->f_flag = 0; |
break; |
case SEND_UA_RSP(F=X): |
llc_sendpdu(lp, UA_RSP, lp->f_flag, 0, NULL); |
break; |
case S_FLAG:=0: |
lp->s_flag = 0; |
break; |
case S_FLAG:=1: |
lp->s_flag = 1; |
break; |
case START_P_TIMER: |
if(lp->timer_state[P_TIMER] == TIMER_RUNNING) |
llc_stop_timer(lp, P_TIMER); |
llc_start_timer(lp, P_TIMER); |
if (lp->p_flag == 0) |
{ |
lp->retry_count = 0; |
lp->p_flag = 1; |
} |
break; |
case START_ACK_TIMER_IF_NOT_RUNNING: |
if (lp->timer_state[ACK_TIMER] == TIMER_IDLE) |
llc_start_timer(lp, ACK_TIMER); |
break; |
case START_ACK_TIMER: |
llc_start_timer(lp, ACK_TIMER); |
break; |
case START_REJ_TIMER: |
llc_start_timer(lp, REJ_TIMER); |
break; |
case STOP_ACK_TIMER: |
llc_stop_timer(lp, ACK_TIMER); |
break; |
case STOP_P_TIMER: |
llc_stop_timer(lp, ACK_TIMER); |
lp->p_flag = 0; |
break; |
case IF_DATA_FLAG=2_STOP_REJ_TIMER: |
if (lp->data_flag == 2) |
llc_stop_timer(lp, REJ_TIMER); |
break; |
case STOP_REJ_TIMER: |
llc_stop_timer(lp, REJ_TIMER); |
break; |
case STOP_ALL_TIMERS: |
llc_stop_timer(lp, ACK_TIMER); |
llc_stop_timer(lp, P_TIMER); |
llc_stop_timer(lp, REJ_TIMER); |
llc_stop_timer(lp, BUSY_TIMER); |
break; |
case STOP_OTHER_TIMERS: |
llc_stop_timer(lp, P_TIMER); |
llc_stop_timer(lp, REJ_TIMER); |
llc_stop_timer(lp, BUSY_TIMER); |
break; |
case UPDATE_N(R)_RECEIVED: |
ack_count = llc_free_acknowledged_skbs(lp, |
(unsigned char) fr->s_hdr.nr); |
if (ack_count > 0) |
{ |
lp->retry_count = 0; |
llc_stop_timer(lp, ACK_TIMER); |
if (skb_peek(&lp->rtq) != NULL) |
{ |
/* |
* Re-transmit queue not empty |
*/ |
llc_start_timer(lp, ACK_TIMER); |
} |
} |
break; |
case UPDATE_P_FLAG: |
if (IS_UFRAME(fr)) |
p_flag_received = fr->u_hdr.u_pflag; |
else |
p_flag_received = fr->i_hdr.i_pflag; |
if ((fr->pdu_hdr.ssap & 0x01) && (p_flag_received)) |
{ |
lp->p_flag = 0; |
llc_stop_timer(lp, P_TIMER); |
} |
break; |
case DATA_FLAG:=2: |
lp->data_flag = 2; |
break; |
case DATA_FLAG:=0: |
lp->data_flag = 0; |
break; |
case DATA_FLAG:=1: |
lp->data_flag = 1; |
break; |
case IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1: |
if (lp->data_flag == 0) |
lp->data_flag = 1; |
break; |
case P_FLAG:=0: |
lp->p_flag = 0; |
break; |
case P_FLAG:=P: |
lp->p_flag = lp->f_flag; |
break; |
case REMOTE_BUSY:=0: |
lp->remote_busy = 0; |
break; |
case RETRY_COUNT:=0: |
lp->retry_count = 0; |
break; |
case RETRY_COUNT:=RETRY_COUNT+1: |
lp->retry_count++; |
break; |
case V(R):=0: |
lp->vr = 0; |
break; |
case V(R):=V(R)+1: |
lp->vr++; |
break; |
case V(S):=0: |
lp->vs = 0; |
break; |
case V(S):=N(R): |
lp->vs = fr->i_hdr.nr; |
break; |
case F_FLAG:=P: |
if (IS_UFRAME(fr)) |
lp->f_flag = fr->u_hdr.u_pflag; |
else |
lp->f_flag = fr->i_hdr.i_pflag; |
break; |
default:; |
} |
pc++; |
} |
} |
|
|
/* |
* Process_otype2_frame will handle incoming frames |
* for 802.2 Type 2 Procedure. |
*/ |
|
void llc_process_otype2_frame(llcptr lp, struct sk_buff *skb, char type) |
{ |
int idx; /* index in transition table */ |
int pc_label; /* action to perform, from tr tbl */ |
int validation; /* result of validate_seq_nos */ |
int p_flag_received; /* p_flag in received frame */ |
frameptr fr; |
|
fr = (frameptr) skb->data; |
|
if (IS_UFRAME(fr)) |
p_flag_received = fr->u_hdr.u_pflag; |
else |
p_flag_received = fr->i_hdr.i_pflag; |
|
switch(lp->state) |
{ |
/* Compute index in transition table: */ |
case ADM: |
idx = type; |
idx = (idx << 1) + p_flag_received; |
break; |
case CONN: |
case RESET_WAIT: |
case RESET_CHECK: |
case ERROR: |
idx = type; |
break; |
case SETUP: |
case RESET: |
case D_CONN: |
idx = type; |
idx = (idx << 1) + lp->p_flag; |
break; |
case NORMAL: |
case BUSY: |
case REJECT: |
case AWAIT: |
case AWAIT_BUSY: |
case AWAIT_REJECT: |
validation = llc_validate_seq_nos(lp, fr); |
if (validation > 3) |
type = BAD_FRAME; |
idx = type; |
idx = (idx << 1); |
if (validation & 1) |
idx = idx +1; |
idx = (idx << 1) + p_flag_received; |
idx = (idx << 1) + lp->p_flag; |
default: |
printk("llc_proc: bad state\n"); |
return; |
} |
idx = (idx << 1) + pdutr_offset[lp->state]; |
lp->state = pdutr_entry[idx +1]; |
pc_label = pdutr_entry[idx]; |
if (pc_label != NOP) |
{ |
llc_interpret_pseudo_code(lp, pc_label, skb, type); |
if(lp->llc_callbacks) |
{ |
lp->llc_event(lp); |
lp->llc_callbacks=0; |
} |
/* |
* lp may no longer be valid after this point. Be |
* careful what is added! |
*/ |
} |
} |
|
|
void llc_timer_expired(llcptr lp, int t) |
{ |
int idx; /* index in transition table */ |
int pc_label; /* action to perform, from tr tbl */ |
|
lp->timer_state[t] = TIMER_EXPIRED; |
idx = lp->state; /* Compute index in transition table: */ |
idx = (idx << 2) + t; |
idx = idx << 1; |
if (lp->retry_count >= lp->n2) |
idx = idx + 1; |
idx = (idx << 1) + lp->s_flag; |
idx = (idx << 1) + lp->p_flag; |
idx = idx << 1; /* 2 bytes per entry: action & newstate */ |
|
pc_label = timertr_entry[idx]; |
if (pc_label != NOP) |
{ |
llc_interpret_pseudo_code(lp, pc_label, NULL, NO_FRAME); |
lp->state = timertr_entry[idx +1]; |
} |
lp->timer_state[t] = TIMER_IDLE; |
if(lp->llc_callbacks) |
{ |
lp->llc_event(lp); |
lp->llc_callbacks=0; |
} |
/* |
* And lp may have vanished in the event callback |
*/ |
} |
|
/sysctl_net_802.c
0,0 → 1,28
/* -*- linux-c -*- |
* sysctl_net_802.c: sysctl interface to net 802 subsystem. |
* |
* Begun April 1, 1996, Mike Shaver. |
* Added /proc/sys/net/802 directory entry (empty =) ). [MS] |
* |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU General Public License |
* as published by the Free Software Foundation; either version |
* 2 of the License, or (at your option) any later version. |
*/ |
|
#include <linux/mm.h> |
#include <linux/sysctl.h> |
#include <linux/config.h> |
|
ctl_table e802_table[] = { |
{0} |
}; |
|
#ifdef CONFIG_TR |
extern int sysctl_tr_rif_timeout; |
ctl_table tr_table[] = { |
{NET_TR_RIF_TIMEOUT, "rif_timeout", &sysctl_tr_rif_timeout, sizeof(int), |
0644, NULL, &proc_dointvec}, |
{0} |
}; |
#endif |
/psnap.c
0,0 → 1,154
/* |
* SNAP data link layer. Derived from 802.2 |
* |
* Alan Cox <Alan.Cox@linux.org>, from the 802.2 layer by Greg Page. |
* Merged in additions from Greg Page's psnap.c. |
* |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU General Public License |
* as published by the Free Software Foundation; either version |
* 2 of the License, or (at your option) any later version. |
*/ |
|
#include <linux/module.h> |
#include <linux/netdevice.h> |
#include <linux/skbuff.h> |
#include <net/datalink.h> |
#include <net/p8022.h> |
#include <net/psnap.h> |
#include <linux/mm.h> |
#include <linux/in.h> |
#include <linux/init.h> |
|
static struct datalink_proto *snap_list = NULL; |
static struct datalink_proto *snap_dl = NULL; /* 802.2 DL for SNAP */ |
|
/* |
* Find a snap client by matching the 5 bytes. |
*/ |
|
static struct datalink_proto *find_snap_client(unsigned char *desc) |
{ |
struct datalink_proto *proto; |
|
for (proto = snap_list; proto != NULL && memcmp(proto->type, desc, 5) ; proto = proto->next); |
return proto; |
} |
|
/* |
* A SNAP packet has arrived |
*/ |
|
int snap_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) |
{ |
static struct packet_type psnap_packet_type = |
{ |
0, |
NULL, /* All Devices */ |
snap_rcv, |
NULL, |
NULL, |
}; |
|
struct datalink_proto *proto; |
|
proto = find_snap_client(skb->h.raw); |
if (proto != NULL) |
{ |
/* |
* Pass the frame on. |
*/ |
|
skb->h.raw += 5; |
skb->nh.raw += 5; |
skb_pull(skb,5); |
if (psnap_packet_type.type == 0) |
psnap_packet_type.type=htons(ETH_P_SNAP); |
|
return proto->rcvfunc(skb, dev, &psnap_packet_type); |
} |
skb->sk = NULL; |
kfree_skb(skb); |
return 0; |
} |
|
/* |
* Put a SNAP header on a frame and pass to 802.2 |
*/ |
|
static void snap_datalink_header(struct datalink_proto *dl, struct sk_buff *skb, unsigned char *dest_node) |
{ |
memcpy(skb_push(skb,5),dl->type,5); |
snap_dl->datalink_header(snap_dl, skb, dest_node); |
} |
|
/* |
* Set up the SNAP layer |
*/ |
|
EXPORT_SYMBOL(register_snap_client); |
EXPORT_SYMBOL(unregister_snap_client); |
|
static int __init snap_init(void) |
{ |
snap_dl=register_8022_client(0xAA, snap_rcv); |
if(snap_dl==NULL) |
printk("SNAP - unable to register with 802.2\n"); |
return 0; |
} |
module_init(snap_init); |
|
/* |
* Register SNAP clients. We don't yet use this for IP. |
*/ |
|
struct datalink_proto *register_snap_client(unsigned char *desc, int (*rcvfunc)(struct sk_buff *, struct net_device *, struct packet_type *)) |
{ |
struct datalink_proto *proto; |
|
if (find_snap_client(desc) != NULL) |
return NULL; |
|
proto = (struct datalink_proto *) kmalloc(sizeof(*proto), GFP_ATOMIC); |
if (proto != NULL) |
{ |
memcpy(proto->type, desc,5); |
proto->type_len = 5; |
proto->rcvfunc = rcvfunc; |
proto->header_length = 5+snap_dl->header_length; |
proto->datalink_header = snap_datalink_header; |
proto->string_name = "SNAP"; |
proto->next = snap_list; |
snap_list = proto; |
} |
|
return proto; |
} |
|
/* |
* Unregister SNAP clients. Protocols no longer want to play with us ... |
*/ |
|
void unregister_snap_client(unsigned char *desc) |
{ |
struct datalink_proto **clients = &snap_list; |
struct datalink_proto *tmp; |
unsigned long flags; |
|
save_flags(flags); |
cli(); |
|
while ((tmp = *clients) != NULL) |
{ |
if (memcmp(tmp->type,desc,5) == 0) |
{ |
*clients = tmp->next; |
kfree(tmp); |
break; |
} |
else |
clients = &tmp->next; |
} |
|
restore_flags(flags); |
} |
/TODO
0,0 → 1,29
Remaining Problems: |
|
1. Serialization of access to variables in the llc structure |
by mac_data_indicate(), timer expired functions, and data_request() . |
There is not serialization of any kind right now. |
While testing, I have not seen any problems that stem from this lack of |
serialization, but it wories me... |
|
2. The code is currently able to handle one connection only, |
there is more work in register_cl2llc_client() to make a chain |
of llc structures and in mac_data_indicate() to find back |
the llc structure addressed by an incoming frame. |
According to IEEE, connections are identified by (remote mac + local mac |
+ dsap + ssap). dsap and ssap do not seem important: existing applications |
always use the same dsap/ssap. Its probably sufficient to index on |
the remote mac only. |
|
3. There is no test to see if the transmit window is full in data_request() |
as described in the doc p73, "7.5.1 Sending I PDUs" 3th alinea. |
The pdus presented to data_request() could probably go on the |
awaiting-transmit-queue (atq). The real difficulty is coding a test |
to see if the transmit window is used up and to send the queue |
when space in the window becomes available. |
As I have no network layer that can generate a continous flow of pdus it is |
difficult to simulate a remote busy condition and hence to test the code |
to handle it. |
|
4. A simple flow control algorithm, steering the size of the transmit |
window would be nice to have. |
/tr.c
0,0 → 1,558
/* |
* NET3: Token ring device handling subroutines |
* |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU General Public License |
* as published by the Free Software Foundation; either version |
* 2 of the License, or (at your option) any later version. |
* |
* Fixes: 3 Feb 97 Paul Norton <pnorton@cts.com> Minor routing fixes. |
* Added rif table to /proc/net/tr_rif and rif timeout to |
* /proc/sys/net/token-ring/rif_timeout. |
* 22 Jun 98 Paul Norton <p.norton@computer.org> Rearranged |
* tr_header and tr_type_trans to handle passing IPX SNAP and |
* 802.2 through the correct layers. Eliminated tr_reformat. |
* |
*/ |
|
#include <asm/uaccess.h> |
#include <asm/system.h> |
#include <linux/config.h> |
#include <linux/types.h> |
#include <linux/kernel.h> |
#include <linux/sched.h> |
#include <linux/string.h> |
#include <linux/mm.h> |
#include <linux/socket.h> |
#include <linux/in.h> |
#include <linux/inet.h> |
#include <linux/netdevice.h> |
#include <linux/trdevice.h> |
#include <linux/skbuff.h> |
#include <linux/errno.h> |
#include <linux/timer.h> |
#include <linux/net.h> |
#include <linux/proc_fs.h> |
#include <linux/init.h> |
#include <net/arp.h> |
|
void tr_source_route(struct sk_buff *skb, struct trh_hdr *trh, |
struct net_device *dev); |
static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev); |
static void rif_check_expire(unsigned long dummy); |
|
#define TR_SR_DEBUG 0 |
|
typedef struct rif_cache_s *rif_cache; |
|
/* |
* Each RIF entry we learn is kept this way |
*/ |
|
struct rif_cache_s { |
unsigned char addr[TR_ALEN]; |
int iface; |
__u16 rcf; |
__u16 rseg[8]; |
rif_cache next; |
unsigned long last_used; |
unsigned char local_ring; |
}; |
|
#define RIF_TABLE_SIZE 32 |
|
/* |
* We hash the RIF cache 32 ways. We do after all have to look it |
* up a lot. |
*/ |
|
static rif_cache rif_table[RIF_TABLE_SIZE]; |
static spinlock_t rif_lock = SPIN_LOCK_UNLOCKED; |
|
#define RIF_TIMEOUT 60*10*HZ |
#define RIF_CHECK_INTERVAL 60*HZ |
|
/* |
* Garbage disposal timer. |
*/ |
|
static struct timer_list rif_timer; |
|
int sysctl_tr_rif_timeout = RIF_TIMEOUT; |
|
/* |
* Put the headers on a token ring packet. Token ring source routing |
* makes this a little more exciting than on ethernet. |
*/ |
|
int tr_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, |
void *daddr, void *saddr, unsigned len) |
{ |
struct trh_hdr *trh; |
int hdr_len; |
|
/* |
* Add the 802.2 SNAP header if IP as the IPv4/IPv6 code calls |
* dev->hard_header directly. |
*/ |
if (type == ETH_P_IP || type == ETH_P_IPV6 || type == ETH_P_ARP) |
{ |
struct trllc *trllc=(struct trllc *)(trh+1); |
|
hdr_len = sizeof(struct trh_hdr) + sizeof(struct trllc); |
trh = (struct trh_hdr *)skb_push(skb, hdr_len); |
trllc = (struct trllc *)(trh+1); |
trllc->dsap = trllc->ssap = EXTENDED_SAP; |
trllc->llc = UI_CMD; |
trllc->protid[0] = trllc->protid[1] = trllc->protid[2] = 0x00; |
trllc->ethertype = htons(type); |
} |
else |
{ |
hdr_len = sizeof(struct trh_hdr); |
trh = (struct trh_hdr *)skb_push(skb, hdr_len); |
} |
|
trh->ac=AC; |
trh->fc=LLC_FRAME; |
|
if(saddr) |
memcpy(trh->saddr,saddr,dev->addr_len); |
else |
memcpy(trh->saddr,dev->dev_addr,dev->addr_len); |
|
/* |
* Build the destination and then source route the frame |
*/ |
|
if(daddr) |
{ |
memcpy(trh->daddr,daddr,dev->addr_len); |
tr_source_route(skb,trh,dev); |
return(hdr_len); |
} |
|
return -hdr_len; |
} |
|
/* |
* A neighbour discovery of some species (eg arp) has completed. We |
* can now send the packet. |
*/ |
|
int tr_rebuild_header(struct sk_buff *skb) |
{ |
struct trh_hdr *trh=(struct trh_hdr *)skb->data; |
struct trllc *trllc=(struct trllc *)(skb->data+sizeof(struct trh_hdr)); |
struct net_device *dev = skb->dev; |
|
/* |
* FIXME: We don't yet support IPv6 over token rings |
*/ |
|
if(trllc->ethertype != htons(ETH_P_IP)) { |
printk("tr_rebuild_header: Don't know how to resolve type %04X addresses ?\n",(unsigned int)htons(trllc->ethertype)); |
return 0; |
} |
|
#ifdef CONFIG_INET |
if(arp_find(trh->daddr, skb)) { |
return 1; |
} |
else |
#endif |
{ |
tr_source_route(skb,trh,dev); |
return 0; |
} |
} |
|
/* |
* Some of this is a bit hackish. We intercept RIF information |
* used for source routing. We also grab IP directly and don't feed |
* it via SNAP. |
*/ |
|
unsigned short tr_type_trans(struct sk_buff *skb, struct net_device *dev) |
{ |
|
struct trh_hdr *trh=(struct trh_hdr *)skb->data; |
struct trllc *trllc; |
unsigned riflen=0; |
|
skb->mac.raw = skb->data; |
|
if(trh->saddr[0] & TR_RII) |
riflen = (ntohs(trh->rcf) & TR_RCF_LEN_MASK) >> 8; |
|
trllc = (struct trllc *)(skb->data+sizeof(struct trh_hdr)-TR_MAXRIFLEN+riflen); |
|
skb_pull(skb,sizeof(struct trh_hdr)-TR_MAXRIFLEN+riflen); |
|
if(*trh->daddr & 0x80) |
{ |
if(!memcmp(trh->daddr,dev->broadcast,TR_ALEN)) |
skb->pkt_type=PACKET_BROADCAST; |
else |
skb->pkt_type=PACKET_MULTICAST; |
} |
else if ( (trh->daddr[0] & 0x01) && (trh->daddr[1] & 0x00) && (trh->daddr[2] & 0x5E)) |
{ |
skb->pkt_type=PACKET_MULTICAST; |
} |
else if(dev->flags & IFF_PROMISC) |
{ |
if(memcmp(trh->daddr, dev->dev_addr, TR_ALEN)) |
skb->pkt_type=PACKET_OTHERHOST; |
} |
|
if ((skb->pkt_type != PACKET_BROADCAST) && |
(skb->pkt_type != PACKET_MULTICAST)) |
tr_add_rif_info(trh,dev) ; |
|
/* |
* Strip the SNAP header from ARP packets since we don't |
* pass them through to the 802.2/SNAP layers. |
*/ |
|
if (trllc->dsap == EXTENDED_SAP && |
(trllc->ethertype == ntohs(ETH_P_IP) || |
trllc->ethertype == ntohs(ETH_P_IPV6) || |
trllc->ethertype == ntohs(ETH_P_ARP))) |
{ |
skb_pull(skb, sizeof(struct trllc)); |
return trllc->ethertype; |
} |
|
return ntohs(ETH_P_802_2); |
} |
|
/* |
* We try to do source routing... |
*/ |
|
void tr_source_route(struct sk_buff *skb, struct trh_hdr *trh, |
struct net_device *dev) |
{ |
int i, slack; |
unsigned int hash; |
rif_cache entry; |
unsigned char *olddata; |
unsigned char mcast_func_addr[] = {0xC0,0x00,0x00,0x04,0x00,0x00}; |
unsigned long flags ; |
|
spin_lock_irqsave(&rif_lock,flags); |
|
/* |
* Broadcasts are single route as stated in RFC 1042 |
*/ |
if( (!memcmp(&(trh->daddr[0]),&(dev->broadcast[0]),TR_ALEN)) || |
(!memcmp(&(trh->daddr[0]),&(mcast_func_addr[0]), TR_ALEN)) ) |
{ |
trh->rcf=htons((((sizeof(trh->rcf)) << 8) & TR_RCF_LEN_MASK) |
| TR_RCF_FRAME2K | TR_RCF_LIMITED_BROADCAST); |
trh->saddr[0]|=TR_RII; |
} |
else |
{ |
for(i=0,hash=0;i<TR_ALEN;hash+=trh->daddr[i++]); |
hash&=RIF_TABLE_SIZE-1; |
/* |
* Walk the hash table and look for an entry |
*/ |
for(entry=rif_table[hash];entry && memcmp(&(entry->addr[0]),&(trh->daddr[0]),TR_ALEN);entry=entry->next); |
|
/* |
* If we found an entry we can route the frame. |
*/ |
if(entry) |
{ |
#if TR_SR_DEBUG |
printk("source routing for %02X:%02X:%02X:%02X:%02X:%02X\n",trh->daddr[0], |
trh->daddr[1],trh->daddr[2],trh->daddr[3],trh->daddr[4],trh->daddr[5]); |
#endif |
if(!entry->local_ring && (ntohs(entry->rcf) & TR_RCF_LEN_MASK) >> 8) |
{ |
trh->rcf=entry->rcf; |
memcpy(&trh->rseg[0],&entry->rseg[0],8*sizeof(unsigned short)); |
trh->rcf^=htons(TR_RCF_DIR_BIT); |
trh->rcf&=htons(0x1fff); /* Issam Chehab <ichehab@madge1.demon.co.uk> */ |
|
trh->saddr[0]|=TR_RII; |
#if TR_SR_DEBUG |
printk("entry found with rcf %04x\n", entry->rcf); |
} |
else |
{ |
printk("entry found but without rcf length, local=%02x\n", entry->local_ring); |
#endif |
} |
entry->last_used=jiffies; |
} |
else |
{ |
/* |
* Without the information we simply have to shout |
* on the wire. The replies should rapidly clean this |
* situation up. |
*/ |
trh->rcf=htons((((sizeof(trh->rcf)) << 8) & TR_RCF_LEN_MASK) |
| TR_RCF_FRAME2K | TR_RCF_LIMITED_BROADCAST); |
trh->saddr[0]|=TR_RII; |
#if TR_SR_DEBUG |
printk("no entry in rif table found - broadcasting frame\n"); |
#endif |
} |
} |
|
/* Compress the RIF here so we don't have to do it in the driver(s) */ |
if (!(trh->saddr[0] & 0x80)) |
slack = 18; |
else |
slack = 18 - ((ntohs(trh->rcf) & TR_RCF_LEN_MASK)>>8); |
olddata = skb->data; |
spin_unlock_irqrestore(&rif_lock,flags); |
|
skb_pull(skb, slack); |
memmove(skb->data, olddata, sizeof(struct trh_hdr) - slack); |
} |
|
/* |
* We have learned some new RIF information for our source |
* routing. |
*/ |
|
static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev) |
{ |
int i; |
unsigned int hash, rii_p = 0; |
rif_cache entry; |
unsigned long flags; |
|
spin_lock_irqsave(&rif_lock, flags); |
|
/* |
* Firstly see if the entry exists |
*/ |
|
if(trh->saddr[0] & TR_RII) |
{ |
trh->saddr[0]&=0x7f; |
if (((ntohs(trh->rcf) & TR_RCF_LEN_MASK) >> 8) > 2) |
{ |
rii_p = 1; |
} |
} |
|
for(i=0,hash=0;i<TR_ALEN;hash+=trh->saddr[i++]); |
hash&=RIF_TABLE_SIZE-1; |
for(entry=rif_table[hash];entry && memcmp(&(entry->addr[0]),&(trh->saddr[0]),TR_ALEN);entry=entry->next); |
|
if(entry==NULL) |
{ |
#if TR_SR_DEBUG |
printk("adding rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n", |
trh->saddr[0],trh->saddr[1],trh->saddr[2], |
trh->saddr[3],trh->saddr[4],trh->saddr[5], |
ntohs(trh->rcf)); |
#endif |
/* |
* Allocate our new entry. A failure to allocate loses |
* use the information. This is harmless. |
* |
* FIXME: We ought to keep some kind of cache size |
* limiting and adjust the timers to suit. |
*/ |
entry=kmalloc(sizeof(struct rif_cache_s),GFP_ATOMIC); |
|
if(!entry) |
{ |
printk(KERN_DEBUG "tr.c: Couldn't malloc rif cache entry !\n"); |
spin_unlock_irqrestore(&rif_lock,flags); |
return; |
} |
|
memcpy(&(entry->addr[0]),&(trh->saddr[0]),TR_ALEN); |
entry->iface = dev->ifindex; |
entry->next=rif_table[hash]; |
entry->last_used=jiffies; |
rif_table[hash]=entry; |
|
if (rii_p) |
{ |
entry->rcf = trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK); |
memcpy(&(entry->rseg[0]),&(trh->rseg[0]),8*sizeof(unsigned short)); |
entry->local_ring = 0; |
trh->saddr[0]|=TR_RII; /* put the routing indicator back for tcpdump */ |
} |
else |
{ |
entry->local_ring = 1; |
} |
} |
else /* Y. Tahara added */ |
{ |
/* |
* Update existing entries |
*/ |
if (!entry->local_ring) |
if (entry->rcf != (trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK)) && |
!(trh->rcf & htons(TR_RCF_BROADCAST_MASK))) |
{ |
#if TR_SR_DEBUG |
printk("updating rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n", |
trh->saddr[0],trh->saddr[1],trh->saddr[2], |
trh->saddr[3],trh->saddr[4],trh->saddr[5], |
ntohs(trh->rcf)); |
#endif |
entry->rcf = trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK); |
memcpy(&(entry->rseg[0]),&(trh->rseg[0]),8*sizeof(unsigned short)); |
} |
entry->last_used=jiffies; |
} |
spin_unlock_irqrestore(&rif_lock,flags); |
} |
|
/* |
* Scan the cache with a timer and see what we need to throw out. |
*/ |
|
static void rif_check_expire(unsigned long dummy) |
{ |
int i; |
unsigned long now=jiffies; |
unsigned long flags ; |
|
spin_lock_irqsave(&rif_lock,flags); |
|
for(i=0; i < RIF_TABLE_SIZE;i++) |
{ |
rif_cache entry, *pentry=rif_table+i; |
while((entry=*pentry)) |
{ |
/* |
* Out it goes |
*/ |
if((now-entry->last_used) > sysctl_tr_rif_timeout) |
{ |
*pentry=entry->next; |
kfree(entry); |
} |
else |
pentry=&entry->next; |
} |
} |
|
spin_unlock_irqrestore(&rif_lock,flags); |
|
/* |
* Reset the timer |
*/ |
|
mod_timer(&rif_timer, jiffies+sysctl_tr_rif_timeout); |
|
} |
|
/* |
* Generate the /proc/net information for the token ring RIF |
* routing. |
*/ |
|
#ifndef CONFIG_PROC_FS |
static int rif_get_info(char *buffer,char **start, off_t offset, int length) { return 0;} |
#else |
static int rif_get_info(char *buffer,char **start, off_t offset, int length) |
{ |
int len=0; |
off_t begin=0; |
off_t pos=0; |
int size,i,j,rcf_len,segment,brdgnmb; |
unsigned long now=jiffies; |
unsigned long flags; |
|
rif_cache entry; |
|
size=sprintf(buffer, |
"if TR address TTL rcf routing segments\n"); |
pos+=size; |
len+=size; |
|
spin_lock_irqsave(&rif_lock, flags); |
for(i=0;i < RIF_TABLE_SIZE;i++) |
{ |
for(entry=rif_table[i];entry;entry=entry->next) { |
struct net_device *dev = __dev_get_by_index(entry->iface); |
|
size=sprintf(buffer+len,"%s %02X:%02X:%02X:%02X:%02X:%02X %7li ", |
dev?dev->name:"?",entry->addr[0],entry->addr[1],entry->addr[2],entry->addr[3],entry->addr[4],entry->addr[5], |
sysctl_tr_rif_timeout-(now-entry->last_used)); |
len+=size; |
pos=begin+len; |
if (entry->local_ring) |
size=sprintf(buffer+len,"local\n"); |
else { |
size=sprintf(buffer+len,"%04X", ntohs(entry->rcf)); |
rcf_len = ((ntohs(entry->rcf) & TR_RCF_LEN_MASK)>>8)-2; |
if (rcf_len) |
rcf_len >>= 1; |
for(j = 1; j < rcf_len; j++) { |
if(j==1) { |
segment=ntohs(entry->rseg[j-1])>>4; |
len+=size; |
pos=begin+len; |
size=sprintf(buffer+len," %03X",segment); |
}; |
segment=ntohs(entry->rseg[j])>>4; |
brdgnmb=ntohs(entry->rseg[j-1])&0x00f; |
len+=size; |
pos=begin+len; |
size=sprintf(buffer+len,"-%01X-%03X",brdgnmb,segment); |
} |
len+=size; |
pos=begin+len; |
size=sprintf(buffer+len,"\n"); |
} |
len+=size; |
pos=begin+len; |
|
if(pos<offset) |
{ |
len=0; |
begin=pos; |
} |
if(pos>offset+length) |
break; |
} |
if(pos>offset+length) |
break; |
} |
spin_unlock_irqrestore(&rif_lock,flags); |
|
*start=buffer+(offset-begin); /* Start of wanted data */ |
len-=(offset-begin); /* Start slop */ |
if(len>length) |
len=length; /* Ending slop */ |
if (len<0) |
len=0; |
return len; |
} |
#endif |
|
/* |
* Called during bootup. We don't actually have to initialise |
* too much for this. |
*/ |
|
static int __init rif_init(void) |
{ |
rif_timer.expires = RIF_TIMEOUT; |
rif_timer.data = 0L; |
rif_timer.function = rif_check_expire; |
init_timer(&rif_timer); |
add_timer(&rif_timer); |
|
proc_net_create("tr_rif",0,rif_get_info); |
return 0; |
} |
|
module_init(rif_init); |
/fc.c
0,0 → 1,135
/* |
* NET3: Fibre Channel device handling subroutines |
* |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU General Public License |
* as published by the Free Software Foundation; either version |
* 2 of the License, or (at your option) any later version. |
* |
* Vineet Abraham <vma@iol.unh.edu> |
* v 1.0 03/22/99 |
*/ |
|
#include <linux/config.h> |
#include <linux/module.h> |
|
#include <asm/uaccess.h> |
#include <asm/system.h> |
#include <linux/types.h> |
#include <linux/kernel.h> |
#include <linux/sched.h> |
#include <linux/string.h> |
#include <linux/mm.h> |
#include <linux/socket.h> |
#include <linux/in.h> |
#include <linux/inet.h> |
#include <linux/netdevice.h> |
#include <linux/fcdevice.h> |
#include <linux/skbuff.h> |
#include <linux/errno.h> |
#include <linux/timer.h> |
#include <linux/net.h> |
#include <linux/proc_fs.h> |
#include <linux/init.h> |
#include <net/arp.h> |
|
/* |
* Put the headers on a Fibre Channel packet. |
*/ |
|
int fc_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, |
void *daddr, void *saddr, unsigned len) |
{ |
struct fch_hdr *fch; |
int hdr_len; |
|
/* |
* Add the 802.2 SNAP header if IP as the IPv4 code calls |
* dev->hard_header directly. |
*/ |
if (type == ETH_P_IP || type == ETH_P_ARP) |
{ |
struct fcllc *fcllc=(struct fcllc *)(fch+1); |
|
hdr_len = sizeof(struct fch_hdr) + sizeof(struct fcllc); |
fch = (struct fch_hdr *)skb_push(skb, hdr_len); |
fcllc = (struct fcllc *)(fch+1); |
fcllc->dsap = fcllc->ssap = EXTENDED_SAP; |
fcllc->llc = UI_CMD; |
fcllc->protid[0] = fcllc->protid[1] = fcllc->protid[2] = 0x00; |
fcllc->ethertype = htons(type); |
} |
else |
{ |
hdr_len = sizeof(struct fch_hdr); |
fch = (struct fch_hdr *)skb_push(skb, hdr_len); |
} |
|
if(saddr) |
memcpy(fch->saddr,saddr,dev->addr_len); |
else |
memcpy(fch->saddr,dev->dev_addr,dev->addr_len); |
|
if(daddr) |
{ |
memcpy(fch->daddr,daddr,dev->addr_len); |
return(hdr_len); |
} |
return -hdr_len; |
} |
|
/* |
* A neighbour discovery of some species (eg arp) has completed. We |
* can now send the packet. |
*/ |
|
int fc_rebuild_header(struct sk_buff *skb) |
{ |
struct fch_hdr *fch=(struct fch_hdr *)skb->data; |
struct fcllc *fcllc=(struct fcllc *)(skb->data+sizeof(struct fch_hdr)); |
if(fcllc->ethertype != htons(ETH_P_IP)) { |
printk("fc_rebuild_header: Don't know how to resolve type %04X addresses ?\n",(unsigned int)htons(fcllc->ethertype)); |
return 0; |
} |
#ifdef CONFIG_INET |
return arp_find(fch->daddr, skb); |
#else |
return 0; |
#endif |
} |
|
EXPORT_SYMBOL(fc_type_trans); |
|
unsigned short |
fc_type_trans(struct sk_buff *skb, struct net_device *dev) |
{ |
struct fch_hdr *fch = (struct fch_hdr *)skb->data; |
struct fcllc *fcllc; |
|
skb->mac.raw = skb->data; |
fcllc = (struct fcllc *)(skb->data + sizeof (struct fch_hdr) + 2); |
skb_pull(skb, sizeof (struct fch_hdr) + 2); |
|
if (*fch->daddr & 1) { |
if (!memcmp(fch->daddr, dev->broadcast, FC_ALEN)) |
skb->pkt_type = PACKET_BROADCAST; |
else |
skb->pkt_type = PACKET_MULTICAST; |
} else if (dev->flags & IFF_PROMISC) { |
if (memcmp(fch->daddr, dev->dev_addr, FC_ALEN)) |
skb->pkt_type = PACKET_OTHERHOST; |
} |
|
/* |
* Strip the SNAP header from ARP packets since we don't pass |
* them through to the 802.2/SNAP layers. |
*/ |
if (fcllc->dsap == EXTENDED_SAP && |
(fcllc->ethertype == ntohs(ETH_P_IP) || |
fcllc->ethertype == ntohs(ETH_P_ARP))) { |
skb_pull(skb, sizeof (struct fcllc)); |
return fcllc->ethertype; |
} |
|
return ntohs(ETH_P_802_2); |
} |
/llc_sendpdu.c
0,0 → 1,357
/* |
* NET An implementation of the IEEE 802.2 LLC protocol for the |
* LINUX operating system. LLC is implemented as a set of |
* state machines and callbacks for higher networking layers. |
* |
* llc_sendpdu(), llc_sendipdu(), resend() + queue handling code |
* |
* Written by Tim Alpaerts, Tim_Alpaerts@toyota-motor-europe.com |
* |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU General Public License |
* as published by the Free Software Foundation; either version |
* 2 of the License, or (at your option) any later version. |
* |
* Changes |
* Alan Cox : Chainsawed into Linux format, style |
* Added llc_ to function names |
*/ |
|
#include <linux/types.h> |
#include <linux/kernel.h> |
#include <linux/slab.h> |
#include <linux/netdevice.h> |
#include <linux/skbuff.h> |
#include <net/p8022.h> |
#include <linux/stat.h> |
#include <asm/byteorder.h> |
#include <net/llc_frame.h> |
#include <net/llc.h> |
|
static unsigned char cntl_byte_encode[] = |
{ |
0x00, /* I_CMD */ |
0x01, /* RR_CMD */ |
0x05, /* RNR_CMD */ |
0x09, /* REJ_CMD */ |
0x43, /* DISC_CMD */ |
0x7F, /* SABME_CMD */ |
0x00, /* I_RSP */ |
0x01, /* RR_RSP */ |
0x05, /* RNR_RSP */ |
0x09, /* REJ_RSP */ |
0x63, /* UA_RSP */ |
0x0F, /* DM_RSP */ |
0x87, /* FRMR_RSP */ |
0xFF, /* BAD_FRAME */ |
0x03, /* UI_CMD */ |
0xBF, /* XID_CMD */ |
0xE3, /* TEST_CMD */ |
0xBF, /* XID_RSP */ |
0xE3 /* TEST_RSP */ |
}; |
|
static unsigned char fr_length_encode[] = |
{ |
0x04, /* I_CMD */ |
0x04, /* RR_CMD */ |
0x04, /* RNR_CMD */ |
0x04, /* REJ_CMD */ |
0x03, /* DISC_CMD */ |
0x03, /* SABME_CMD */ |
0x04, /* I_RSP */ |
0x04, /* RR_RSP */ |
0x04, /* RNR_RSP */ |
0x04, /* REJ_RSP */ |
0x03, /* UA_RSP */ |
0x03, /* DM_RSP */ |
0x03, /* FRMR_RSP */ |
0x00, /* BAD_FRAME */ |
0x03, /* UI_CMD */ |
0x03, /* XID_CMD */ |
0x03, /* TEST_CMD */ |
0x03, /* XID_RSP */ |
0x03 /* TEST_RSP */ |
}; |
|
static unsigned char cr_bit_encode[] = { |
0x00, /* I_CMD */ |
0x00, /* RR_CMD */ |
0x00, /* RNR_CMD */ |
0x00, /* REJ_CMD */ |
0x00, /* DISC_CMD */ |
0x00, /* SABME_CMD */ |
0x01, /* I_RSP */ |
0x01, /* RR_RSP */ |
0x01, /* RNR_RSP */ |
0x01, /* REJ_RSP */ |
0x01, /* UA_RSP */ |
0x01, /* DM_RSP */ |
0x01, /* FRMR_RSP */ |
0x00, /* BAD_FRAME */ |
0x00, /* UI_CMD */ |
0x00, /* XID_CMD */ |
0x00, /* TEST_CMD */ |
0x01, /* XID_RSP */ |
0x01 /* TEST_RSP */ |
}; |
|
/* |
* Sendpdu() constructs an output frame in a new skb and |
* gives it to the MAC layer for transmission. |
* This function is not used to send I pdus. |
* No queues are updated here, nothing is saved for retransmission. |
* |
* Parameter pf controls both the poll/final bit and dsap |
* fields in the output pdu. |
* The dsap trick was needed to implement XID_CMD send with |
* zero dsap field as described in doc 6.6 item 1 of enum. |
*/ |
|
void llc_sendpdu(llcptr lp, char type, char pf, int data_len, char *pdu_data) |
{ |
frameptr fr; /* ptr to output pdu buffer */ |
unsigned short int fl; /* frame length == 802.3 "length" value */ |
struct sk_buff *skb; |
|
fl = data_len + fr_length_encode[(int)type]; |
skb = alloc_skb(16 + fl, GFP_ATOMIC); |
if (skb != NULL) |
{ |
skb->dev = lp->dev; |
skb_reserve(skb, 16); |
fr = (frameptr) skb_put(skb, fl); |
memset(fr, 0, fl); |
/* |
* Construct 802.2 header |
*/ |
if (pf & 0x02) |
fr->pdu_hdr.dsap = 0; |
else |
fr->pdu_hdr.dsap = lp->remote_sap; |
fr->pdu_hdr.ssap = lp->local_sap + cr_bit_encode[(int)type]; |
fr->pdu_cntl.byte1 = cntl_byte_encode[(int)type]; |
/* |
* Fill in pflag and seq nbrs: |
*/ |
if (IS_SFRAME(fr)) |
{ |
/* case S-frames */ |
if (pf & 0x01) |
fr->i_hdr.i_pflag = 1; |
fr->i_hdr.nr = lp->vr; |
} |
else |
{ |
/* case U frames */ |
if (pf & 0x01) |
fr->u_hdr.u_pflag = 1; |
} |
|
if (data_len > 0) |
{ /* append data if any */ |
if (IS_UFRAME(fr)) |
{ |
memcpy(fr->u_hdr.u_info, pdu_data, data_len); |
} |
else |
{ |
memcpy(fr->i_hdr.is_info, pdu_data, data_len); |
} |
} |
lp->dev->hard_header(skb, lp->dev, ETH_P_802_3, |
lp->remote_mac, NULL, fl); |
skb->dev=lp->dev; |
dev_queue_xmit(skb); |
} |
else |
printk(KERN_DEBUG "cl2llc: skb_alloc() in llc_sendpdu() failed\n"); |
} |
|
void llc_xid_request(llcptr lp, char opt, int ll, char * data) |
{ |
llc_sendpdu(lp, XID_CMD, opt, ll, data); |
} |
|
void llc_test_request(llcptr lp, int ll, char * data) |
{ |
llc_sendpdu(lp, TEST_CMD, 0, ll, data); |
} |
|
void llc_unit_data_request(llcptr lp, int ll, char * data) |
{ |
llc_sendpdu(lp, UI_CMD, 0, ll, data); |
} |
|
|
/* |
* llc_sendipdu() Completes an I pdu in an existing skb and gives it |
* to the MAC layer for transmission. |
* Parameter "type" must be either I_CMD or I_RSP. |
* The skb is not freed after xmit, it is kept in case a retransmission |
* is requested. If needed it can be picked up again from the rtq. |
*/ |
|
void llc_sendipdu(llcptr lp, char type, char pf, struct sk_buff *skb) |
{ |
frameptr fr; /* ptr to output pdu buffer */ |
struct sk_buff *tmp; |
|
fr = (frameptr) skb->data; |
|
fr->pdu_hdr.dsap = lp->remote_sap; |
fr->pdu_hdr.ssap = lp->local_sap + cr_bit_encode[(int)type]; |
fr->pdu_cntl.byte1 = cntl_byte_encode[(int)type]; |
|
if (pf) |
fr->i_hdr.i_pflag = 1; /* p/f and seq numbers */ |
fr->i_hdr.nr = lp->vr; |
fr->i_hdr.ns = lp->vs; |
lp->vs++; |
if (lp->vs > 127) |
lp->vs = 0; |
lp->dev->hard_header(skb, lp->dev, ETH_P_802_3, |
lp->remote_mac, NULL, skb->len); |
ADD_TO_RTQ(skb); /* add skb to the retransmit queue */ |
tmp=skb_clone(skb, GFP_ATOMIC); |
if(tmp!=NULL) |
{ |
tmp->dev=lp->dev; |
dev_queue_xmit(tmp); |
} |
} |
|
|
/* |
* Resend_ipdu() will resend the pdus in the retransmit queue (rtq) |
* the return value is the number of pdus resend. |
* ack_nr is N(R) of 1st pdu to resent. |
* Type is I_CMD or I_RSP for 1st pdu resent. |
* p is p/f flag 0 or 1 for 1st pdu resent. |
* All subsequent pdus will be sent as I_CMDs with p/f set to 0 |
*/ |
|
int llc_resend_ipdu(llcptr lp, unsigned char ack_nr, unsigned char type, char p) |
{ |
struct sk_buff *skb,*tmp; |
int resend_count; |
frameptr fr; |
unsigned long flags; |
|
|
resend_count = 0; |
|
save_flags(flags); |
cli(); |
|
skb = skb_peek(&lp->rtq); |
|
while(skb && skb != (struct sk_buff *)&lp->rtq) |
{ |
fr = (frameptr) (skb->data + lp->dev->hard_header_len); |
if (resend_count == 0) |
{ |
/* |
* Resending 1st pdu: |
*/ |
|
if (p) |
fr->i_hdr.i_pflag = 1; |
else |
fr->i_hdr.i_pflag = 0; |
|
if (type == I_CMD) |
fr->pdu_hdr.ssap = fr->pdu_hdr.ssap & 0xfe; |
else |
fr->pdu_hdr.ssap = fr->pdu_hdr.ssap | 0x01; |
} |
else |
{ |
/* |
* Resending pdu 2...n |
*/ |
|
fr->pdu_hdr.ssap = fr->pdu_hdr.ssap & 0xfe; |
fr->i_hdr.i_pflag = 0; |
} |
fr->i_hdr.nr = lp->vr; |
fr->i_hdr.ns = lp->vs; |
lp->vs++; |
if (lp->vs > 127) |
lp->vs = 0; |
tmp=skb_clone(skb, GFP_ATOMIC); |
if(tmp!=NULL) |
{ |
tmp->dev = lp->dev; |
dev_queue_xmit(tmp); |
} |
resend_count++; |
skb = skb->next; |
} |
restore_flags(flags); |
return resend_count; |
} |
|
/* ************** internal queue management code ****************** */ |
|
|
/* |
* Remove one skb from the front of the awaiting transmit queue |
* (this is the skb longest on the queue) and return a pointer to |
* that skb. |
*/ |
|
struct sk_buff *llc_pull_from_atq(llcptr lp) |
{ |
return skb_dequeue(&lp->atq); |
} |
|
/* |
* Free_acknowledged_skbs(), remove from retransmit queue (rtq) |
* and free all skbs with an N(S) chronologicaly before 'pdu_ack'. |
* The return value is the number of pdus acknowledged. |
*/ |
|
int llc_free_acknowledged_skbs(llcptr lp, unsigned char pdu_ack) |
{ |
struct sk_buff *pp; |
frameptr fr; |
int ack_count; |
unsigned char ack; /* N(S) of most recently ack'ed pdu */ |
unsigned char ns_save; |
unsigned long flags; |
|
if (pdu_ack > 0) |
ack = pdu_ack -1; |
else |
ack = 127; |
|
ack_count = 0; |
|
save_flags(flags); |
cli(); |
|
pp = skb_dequeue(&lp->rtq); |
while (pp != NULL) |
{ |
/* |
* Locate skb with N(S) == ack |
*/ |
|
/* |
* BUG: FIXME - use skb->h.* |
*/ |
fr = (frameptr) (pp->data + lp->dev->hard_header_len); |
ns_save = fr->i_hdr.ns; |
|
kfree_skb(pp); |
ack_count++; |
|
if (ns_save == ack) |
break; |
pp = skb_dequeue(&lp->rtq); |
} |
restore_flags(flags); |
return ack_count; |
} |
|
/Makefile
0,0 → 1,61
# |
# Makefile for the Linux 802.x protocol layers. |
# |
# Note! Dependencies are done automagically by 'make dep', which also |
# removes any old dependencies. DON'T put your own dependencies here |
# unless it's something special (ie not a .c file). |
# |
# Note 2! The CFLAGS definition is now in the main makefile... |
|
O_TARGET := 802.o |
|
export-objs = llc_macinit.o p8022.o psnap.o fc.o |
|
obj-y = p8023.o |
|
obj-$(CONFIG_SYSCTL) += sysctl_net_802.o |
obj-$(CONFIG_LLC) += llc_sendpdu.o llc_utility.o cl2llc.o llc_macinit.o |
ifeq ($(CONFIG_SYSCTL),y) |
obj-y += sysctl_net_802.o |
endif |
|
ifeq ($(CONFIG_LLC),y) |
subdir-y += transit |
obj-y += llc_sendpdu.o llc_utility.o cl2llc.o llc_macinit.o |
SNAP = y |
endif |
|
ifdef CONFIG_TR |
obj-y += tr.o |
SNAP=y |
endif |
|
ifdef CONFIG_NET_FC |
obj-y += fc.o |
endif |
|
ifdef CONFIG_FDDI |
obj-y += fddi.o |
endif |
|
ifdef CONFIG_HIPPI |
obj-y += hippi.o |
endif |
|
ifdef CONFIG_IPX |
SNAP=y |
endif |
|
ifdef CONFIG_ATALK |
SNAP=y |
endif |
|
ifeq ($(SNAP),y) |
obj-y += p8022.o psnap.o |
endif |
|
include $(TOPDIR)/Rules.make |
|
cl2llc.c: cl2llc.pre |
@rm -f $@ |
sed -f ./pseudo/opcd2num.sed cl2llc.pre >cl2llc.c |
/llc_utility.c
0,0 → 1,253
/* |
* NET An implementation of the IEEE 802.2 LLC protocol for the |
* LINUX operating system. LLC is implemented as a set of |
* state machines and callbacks for higher networking layers. |
* |
* Small utilities, Linux timer handling. |
* |
* Written by Tim Alpaerts, Tim_Alpaerts@toyota-motor-europe.com |
* |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU General Public License |
* as published by the Free Software Foundation; either version |
* 2 of the License, or (at your option) any later version. |
* |
* Changes |
* Alan Cox : Chainsawed into Linux form. |
* Added llc_ function name prefixes. |
* Fixed bug in stop/start timer. |
* Added llc_cancel_timers for closing |
* down an llc |
*/ |
|
#include <linux/types.h> |
#include <linux/kernel.h> |
#include <linux/netdevice.h> |
#include <linux/skbuff.h> |
#include <linux/proc_fs.h> |
#include <linux/stat.h> |
#include <net/llc_frame.h> |
#include <net/llc.h> |
|
int llc_decode_frametype(frameptr fr) |
{ |
if (IS_UFRAME(fr)) |
{ /* unnumbered cmd/rsp */ |
switch(fr->u_mm.mm & 0x3B) |
{ |
case 0x1B: |
return(SABME_CMD); |
break; |
case 0x10: |
return(DISC_CMD); |
break; |
case 0x18: |
return(UA_RSP); |
break; |
case 0x03: |
return(DM_RSP); |
break; |
case 0x21: |
return(FRMR_RSP); |
break; |
case 0x00: |
return(UI_CMD); |
break; |
case 0x2B: |
if (IS_RSP(fr)) |
return(XID_RSP); |
else |
return(XID_CMD); |
break; |
case 0x38: |
if (IS_RSP(fr)) |
return(TEST_RSP); |
else |
return(TEST_CMD); |
break; |
default: |
return(BAD_FRAME); |
} |
} |
else if (IS_SFRAME(fr)) |
{ /* supervisory cmd/rsp */ |
switch(fr->s_hdr.ss) |
{ |
case 0x00: |
if (IS_RSP(fr)) |
return(RR_RSP); |
else |
return(RR_CMD); |
break; |
case 0x02: |
if (IS_RSP(fr)) |
return(REJ_RSP); |
else |
return(REJ_CMD); |
break; |
case 0x01: |
if (IS_RSP(fr)) |
return(RNR_RSP); |
else |
return(RNR_CMD); |
break; |
default: |
return(BAD_FRAME); |
} |
} |
else |
{ /* information xfer */ |
if (IS_RSP(fr)) |
return(I_RSP); |
else |
return(I_CMD); |
} |
} |
|
|
/* |
* Validate_seq_nos will check N(S) and N(R) to see if they are |
* invalid or unexpected. |
* "unexpected" is explained on p44 Send State Variable. |
* The return value is: |
* 4 * invalid N(R) + |
* 2 * invalid N(S) + |
* 1 * unexpected N(S) |
*/ |
|
int llc_validate_seq_nos(llcptr lp, frameptr fr) |
{ |
int res; |
|
/* |
* A U-frame is always good |
*/ |
|
if (IS_UFRAME(fr)) |
return(0); |
|
/* |
* For S- and I-frames check N(R): |
*/ |
|
if (fr->i_hdr.nr == lp->vs) |
{ /* if N(R) = V(S) */ |
res = 0; /* N(R) is good */ |
} |
else |
{ /* lp->k = transmit window size */ |
if (lp->vs >= lp->k) |
{ /* if window not wrapped around 127 */ |
if ((fr->i_hdr.nr < lp->vs) && |
(fr->i_hdr.nr > (lp->vs - lp->k))) |
res = 0; |
else |
res = 4; /* N(R) invalid */ |
} |
else |
{ /* window wraps around 127 */ |
if ((fr->i_hdr.nr < lp->vs) || |
(fr->i_hdr.nr > (128 + lp->vs - lp->k))) |
res = 0; |
else |
res = 4; /* N(R) invalid */ |
} |
} |
|
/* |
* For an I-frame, must check N(S) also: |
*/ |
|
if (IS_IFRAME(fr)) |
{ |
if (fr->i_hdr.ns == lp->vr) |
return res; /* N(S) good */ |
if (lp->vr >= lp->rw) |
{ |
/* if receive window not wrapped */ |
|
if ((fr->i_hdr.ns < lp->vr) && |
(fr->i_hdr.ns > (lp->vr - lp->k))) |
res = res +1; /* N(S) unexpected */ |
else |
res = res +2; /* N(S) invalid */ |
} |
else |
{ |
/* Window wraps around 127 */ |
|
if ((fr->i_hdr.ns < lp->vr) || |
(fr->i_hdr.ns > (128 + lp->vr - lp->k))) |
res = res +1; /* N(S) unexpected */ |
else |
res = res +2; /* N(S) invalid */ |
} |
} |
return(res); |
} |
|
/* **************** timer management routines ********************* */ |
|
static void llc_p_timer_expired(unsigned long ulp) |
{ |
llc_timer_expired((llcptr) ulp, P_TIMER); |
} |
|
static void llc_rej_timer_expired(unsigned long ulp) |
{ |
llc_timer_expired((llcptr) ulp, REJ_TIMER); |
} |
|
static void llc_ack_timer_expired(unsigned long ulp) |
{ |
llc_timer_expired((llcptr) ulp, ACK_TIMER); |
} |
|
static void llc_busy_timer_expired(unsigned long ulp) |
{ |
llc_timer_expired((llcptr) ulp, BUSY_TIMER); |
} |
|
/* exp_fcn is an array holding the 4 entry points of the |
timer expiry routines above. |
It is required to keep start_timer() generic. |
Thank you cdecl. |
*/ |
|
static void (* exp_fcn[])(unsigned long) = |
{ |
llc_p_timer_expired, |
llc_rej_timer_expired, |
llc_ack_timer_expired, |
llc_busy_timer_expired |
}; |
|
void llc_start_timer(llcptr lp, int t) |
{ |
if (lp->timer_state[t] == TIMER_IDLE) |
{ |
lp->tl[t].expires = jiffies + lp->timer_interval[t]; |
lp->tl[t].data = (unsigned long) lp; |
lp->tl[t].function = exp_fcn[t]; |
add_timer(&lp->tl[t]); |
lp->timer_state[t] = TIMER_RUNNING; |
} |
} |
|
void llc_stop_timer(llcptr lp, int t) |
{ |
if (lp->timer_state[t] == TIMER_RUNNING) |
{ |
del_timer(&lp->tl[t]); |
lp->timer_state[t] = TIMER_IDLE; |
} |
} |
|
void llc_cancel_timers(llcptr lp) |
{ |
llc_stop_timer(lp, P_TIMER); |
llc_stop_timer(lp, REJ_TIMER); |
llc_stop_timer(lp, ACK_TIMER); |
llc_stop_timer(lp, BUSY_TIMER); |
} |
|