📄 cwtpinitiator.java
字号:
upperLayer.tr_abort(CWTPAbort.ABORT_REASON_UNKNOWN);
rcr = 0;
setState(STATE_NULL);
}
}
}
});
// see declaration of w_timer above
w_timer = new javax.swing.Timer(w,
new ActionListener() {
public void actionPerformed(ActionEvent e) {
w_timer.stop();
if (state == STATE_WAIT_TIMEOUT) {
logger.debug("wait timeout");
setState(STATE_NULL);
close((short) 0x00);
}
}
});
// see declaration of w_timer above
s_timer = new javax.swing.Timer(s,
new ActionListener() {
public void actionPerformed(ActionEvent e) {
s_timer.stop();
if (segment_sended > segment_sended_max) {
if(logger.isDebugEnabled()) {
logger.debug("wait_ack timeout (" + segment_sended +
"), abort.");
}
segment_sended = 1;
setState(STATE_NULL);
close((short) 0x00);
} else {
if (state == STATE_WAIT_ACK) {
if(logger.isDebugEnabled()) {
logger.debug("wait_ack timeout (" +
segment_sended + "), re-sending segment.");
}
segment.setRID(true);
wtpSocket.send(segment);
segment_sended++;
s_timer.restart();
}
}
}
});
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
/**
* Invoked by the run()-Method of the Management-Entity CWTPManagement.
* Processes given protocol data units
* according to state machine described in section 9.5
* <b>Notice:</b> Only WTP Initiator is implemented!
*
* @param pdu the pdu to be processed in the state machine
*/
public synchronized void process(CWTPPDU pdu) throws EWTPAbortedException {
if (aborted) {
throw new EWTPAbortedException(abortCode);
}
if (logger.isDebugEnabled()) {
logger.debug("" + sendTID + ": " + CWTPPDU.types[pdu.getPDUType()] +
" in " + states[state] + " class " + classType + " holdOn " +
holdOn);
}
switch (state) {
///////////////////// NULL //////////////////////////////////////////////
case 0x00:
// because only initiator is implemented,
// we do not need to react on pdu-events in NULL state
break;
///////////////////// RESULT WAIT ///////////////////////////////////////
case 0x01:
// RcvAck in RESULT WAIT
if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_ACK) {
if (((CWTPAck) pdu).getTve_tok() &&
((classType == 1) || (classType == 2)) &&
(rcr < RCR_MAX)) {
CWTPAck send = new CWTPAck(((CWTPAck) pdu).getTID() &
0x7fff);
send.setTve_tok(true);
wtpSocket.send(send);
rcr++;
r_timer.restart();
setState(STATE_RESULT_WAIT);
} else if (((CWTPAck) pdu).getTve_tok() &&
((classType == 1) || (classType == 2))) {
setState(STATE_RESULT_WAIT);
} else if ((classType == 2) && !holdOn) {
r_timer.stop();
upperLayer.tr_process(new CWTPEvent(pdu.getPayload(),
CWTPEvent.TR_INVOKE_CNF));
this.holdOn = true;
setState(CWTPInitiator.STATE_RESULT_WAIT);
} else if ((classType == 2) && holdOn) {
setState(STATE_RESULT_WAIT);
} else if (classType == 1) {
r_timer.stop();
upperLayer.tr_process(new CWTPEvent(pdu.getPayload(),
CWTPEvent.TR_INVOKE_CNF));
setState(STATE_NULL);
}
}
// RcvAbort in RESULT WAIT
else if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_ABORT) {
short abortReason = ((CWTPAbort) pdu).getAbortReason();
close(abortReason);
upperLayer.tr_abort(abortReason);
setState(STATE_NULL);
}
// RcvResult in RESULT WAIT
else if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_RESULT && classType == 2) {
CWTPResult res = (CWTPResult) pdu;
byte nextState=STATE_RESULT_RESP_WAIT;
// Stop timer
r_timer.stop();
// Check for segmentation indication
if( !res.getTTR() )
{
logger.debug("Not last packet");
segend = 0; seglast = 0;
segdata = new ByteArrayOutputStream(64*1024); // 64kbyte segs
segTID = pdu.getTID();
try {
segdata.write(res.getPayload());
} catch (IOException e) {
logger.warn("Exception writing to ByteArrayOutputStream",e);
}
nextState=STATE_RESULT_WAIT; // We will wait for more to come
}
setState(nextState);
// if !holdOn generate TR_Invoke.cnf
if(!holdOn) {
upperLayer.tr_process(
new CWTPEvent(pdu.getPayload(), CWTPEvent.TR_INVOKE_CNF));
}
if( !res.getTTR() && res.getGTR() ) {
byte payload[] = new byte[2];
CWTPAck ack = new CWTPAck(sendTID);
payload[0] = (0x03 << 3) | 0x01; // psn, one byte length
payload[1] = 0; // Implicit sequence number 0
ack.setCON(true); // headers follow ;)
ack.setPayload(payload);
if(logger.isDebugEnabled()) {
logger.debug("sending ack:" + ack.toString());
}
wtpSocket.send(ack);
}
if( nextState != STATE_RESULT_WAIT ) {
// generate tr_result.ind
upperLayer.tr_process(
new CWTPEvent(pdu.getPayload(), CWTPEvent.TR_RESULT_IND));
}
// restart ack timer
a_timer.restart();
}
else if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_SEGM_RESULT) {
logger.debug("Segmented result");
boolean sendAck = false;
boolean sendToUpper = false;
CWTPSegmResult sres = (CWTPSegmResult) pdu;
w_timer.restart();
a_timer.restart();
if (sres.getTID() != segTID) {
logger.warn("Dumping out-of sync segment from outer space!");
return;
}
if (seglast + 1 == sres.getPSN()) {
// we are in line with stuff
seglast = sres.getPSN();
try {
segdata.write(sres.getPayload());
} catch (IOException e) {
logger.warn("Exception writing to ByteArrayOutputStream",e);
}
if (sres.getGTR()) {
logger.debug("Last packet of packet group");
// ==> ttr must be 0 -> end of group
sendAck = true;
} else if (sres.getTTR()) {
logger.debug("Last packet of message");
// EOF :)
sendAck = true;
sendToUpper = true;
setState(STATE_RESULT_RESP_WAIT);
} //else not last packet...
} else {
logger.warn(
"LOST PACKET - last "
+ seglast
+ " current psn "
+ sres.getPSN());
// @todo: send NACK
}
if (sendAck) {
byte payload[] = new byte[2];
CWTPAck send = new CWTPAck(sendTID);
payload[0] = (0x03 << 3) | 0x01; // psn, one byte length
payload[1] = (byte) (0x7f & sres.getPSN());
send.setCON(true); // headers follow ;)
send.setPayload(payload);
if(logger.isDebugEnabled()) {
logger.debug("sending ack:" + send.toString());
}
wtpSocket.send(send);
}
if (sendToUpper) {
byte[] payload = segdata.toByteArray();
upperLayer.tr_process(new CWTPEvent(payload, CWTPEvent.TR_RESULT_IND));
segdata = null;
segend = 0;
}
}
break;
///////////////////// RESULT RESP WAIT //////////////////////////////////
case 0x02:
// RcvAbort in RESULT RESP WAIT
if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_ABORT) {
short abortReason = ((CWTPAbort) pdu).getAbortReason();
close(abortReason);
upperLayer.tr_abort(abortReason);
setState(STATE_NULL);
}
// RcvResult in RESULT RESP WAIT
else if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_RESULT) {
logger.debug("blp");
setState(STATE_RESULT_RESP_WAIT);
// RcvSegmResult in RESULT RESP WAIT
} else if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_SEGM_RESULT) {
logger.debug("XXXXXX blpseg");
setState(STATE_RESULT_RESP_WAIT);
}
break;
///////////////////// WAIT TIMEOUT //////////////////////////////////////
case 0x03:
// RcvAbort in WAIT TIMEOUT
if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_ABORT) {
short abortReason = ((CWTPAbort) pdu).getAbortReason();
close(abortReason);
upperLayer.tr_abort(abortReason);
setState(STATE_NULL);
}
// RcvResult in WAIT TIMEOUT
else if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_RESULT) {
if (pdu.getRID()) {
/** @todo input TPI exitinfo if available - page 54 **/
CWTPAck send = new CWTPAck(sendTID);
wtpSocket.send(send);
setState(STATE_WAIT_TIMEOUT);
} else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -