use of org.mobicents.tools.sip.balancer.KeySmpp in project load-balancer by RestComm.
the class ClientConnectionImpl method packetReceived.
@Override
public void packetReceived(Pdu packet) {
switch(clientState) {
case INITIAL:
case OPEN:
logger.error("LB received packet (" + packet + ") in initial or open state from " + channel.getRemoteAddress().toString() + " sessionId : " + sessionId);
break;
case BINDING:
Boolean correctPacket = false;
switch(config.getType()) {
case TRANSCEIVER:
if (packet.getCommandId() == SmppConstants.CMD_ID_BIND_TRANSCEIVER_RESP)
correctPacket = true;
break;
case RECEIVER:
if (packet.getCommandId() == SmppConstants.CMD_ID_BIND_RECEIVER_RESP)
correctPacket = true;
break;
case TRANSMITTER:
if (packet.getCommandId() == SmppConstants.CMD_ID_BIND_TRANSMITTER_RESP)
correctPacket = true;
break;
}
if (!correctPacket)
logger.error("Received invalid packet in binding state, packet type: " + packet.getName());
else {
if (packet.getCommandStatus() == SmppConstants.STATUS_OK) {
if (logger.isDebugEnabled())
logger.debug("LB received bind response (" + packet + ") from " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
clientState = ClientState.BOUND;
lbClientListener.bindSuccesfull(sessionId, packet);
} else {
logger.error("Binding to " + channel.getRemoteAddress().toString() + " is unsuccesful. sessionId" + sessionId + " , error code: " + packet.getCommandStatus());
lbClientListener.bindFailed(sessionId, packet);
closeChannel();
clientState = ClientState.CLOSED;
}
}
break;
case BOUND:
correctPacket = false;
switch(packet.getCommandId()) {
case SmppConstants.CMD_ID_CANCEL_SM_RESP:
case SmppConstants.CMD_ID_DATA_SM_RESP:
case SmppConstants.CMD_ID_QUERY_SM_RESP:
case SmppConstants.CMD_ID_REPLACE_SM_RESP:
case SmppConstants.CMD_ID_SUBMIT_SM_RESP:
case SmppConstants.CMD_ID_SUBMIT_MULTI_RESP:
if (logger.isDebugEnabled())
logger.debug("LB received SMPP response (" + packet + ") from " + channel.getRemoteAddress().toString() + ". sessionId: " + sessionId);
Integer originalSequence = sequenceMap.remove(packet.getSequenceNumber());
if (originalSequence != null) {
packet.setSequenceNumber(originalSequence);
correctPacket = true;
this.lbClientListener.smppEntityResponse(sessionId, packet);
}
break;
case SmppConstants.CMD_ID_GENERIC_NACK:
if (logger.isDebugEnabled())
logger.debug("LB received generic nack (" + packet + ") from " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
correctPacket = true;
this.lbClientListener.smppEntityResponse(sessionId, packet);
break;
case SmppConstants.CMD_ID_ENQUIRE_LINK_RESP:
if (logger.isDebugEnabled())
logger.debug("LB received enquire_link response from " + channel.getRemoteAddress().toString() + ". session ID : " + sessionId);
correctPacket = true;
isEnquireLinkSent = false;
connectionCheck.cancel();
// connectionCheckServerSideTimer.cancel(false);
this.lbClientListener.enquireLinkReceivedFromServer(sessionId);
break;
case SmppConstants.CMD_ID_DATA_SM:
case SmppConstants.CMD_ID_DELIVER_SM:
if (logger.isDebugEnabled())
logger.debug("LB received SMPP request (" + packet + ") from " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
correctPacket = true;
ServerTimerResponse response = new ServerTimerResponse(this, packet);
packetMap.put(packet.getSequenceNumber(), new TimerData(packet, monitorExecutor.schedule(response, timeoutResponse, TimeUnit.MILLISECONDS), response));
this.lbClientListener.smppEntityRequestFromServer(sessionId, packet);
break;
case SmppConstants.CMD_ID_ENQUIRE_LINK:
if (logger.isDebugEnabled())
logger.debug("LB received enquire_link request from " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
correctPacket = true;
EnquireLinkResp resp = new EnquireLinkResp();
resp.setSequenceNumber(packet.getSequenceNumber());
sendSmppResponse(resp);
break;
case SmppConstants.CMD_ID_UNBIND:
if (logger.isDebugEnabled())
logger.debug("LB received unbind request from " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
correctPacket = true;
response = new ServerTimerResponse(this, packet);
packetMap.put(packet.getSequenceNumber(), new TimerData(packet, monitorExecutor.schedule(response, timeoutResponse, TimeUnit.MILLISECONDS), response));
lbClientListener.unbindRequestedFromServer(sessionId, packet);
clientState = ClientState.UNBINDING;
break;
}
if (!correctPacket) {
logger.error("LB received invalid packet in bound state. sessionId : " + sessionId + ". packet : " + packet);
}
break;
case REBINDING:
switch(packet.getCommandId()) {
case SmppConstants.CMD_ID_BIND_RECEIVER_RESP:
case SmppConstants.CMD_ID_BIND_TRANSCEIVER_RESP:
case SmppConstants.CMD_ID_BIND_TRANSMITTER_RESP:
if (packet.getCommandStatus() == SmppConstants.STATUS_OK) {
if (logger.isDebugEnabled())
logger.debug("Connection reconnected to " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
this.lbClientListener.reconnectSuccesful(sessionId);
clientState = ClientState.BOUND;
if (invocationContext.activeNodeKey != null)
invocationContext.activeNodeKey = new KeySmpp((Node) new ArrayList(invocationContext.smppNodeMap.values()).get(0));
} else {
logger.debug("Reconnection to client unsuccessful. client session ID : " + sessionId + ". LB will close session!");
this.lbClientListener.unbindRequestedFromServer(sessionId, new Unbind());
}
}
break;
case UNBINDING:
correctPacket = false;
if (packet.getCommandId() == SmppConstants.CMD_ID_UNBIND_RESP)
correctPacket = true;
if (!correctPacket)
logger.error("LB received invalid packet (" + packet + ") form " + channel.getRemoteAddress().toString() + " in unbinding state. sessionId : " + sessionId);
else {
if (logger.isDebugEnabled())
logger.debug("LB received unbind response form " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
Integer originalSequence = sequenceMap.remove(packet.getSequenceNumber());
if (originalSequence != null) {
packet.setSequenceNumber(originalSequence);
this.lbClientListener.unbindSuccesfull(sessionId, packet);
}
sequenceMap.clear();
packetMap.clear();
closeChannel();
clientState = ClientState.CLOSED;
}
break;
case CLOSED:
logger.error("LB received packet (" + packet + ") in closed state from " + channel.getRemoteAddress().toString() + " sessionId : " + sessionId);
break;
}
}
use of org.mobicents.tools.sip.balancer.KeySmpp in project load-balancer by RestComm.
the class SmppToProviderActiveStandbyAlgorithm method processBindToProvider.
@Override
public Node processBindToProvider() {
if (invocationContext.smppNodeMap.size() == 0)
return null;
if (invocationContext.activeNodeKey == null) {
new ArrayList(invocationContext.smppNodeMap.values()).get(0);
invocationContext.activeNodeKey = new KeySmpp((Node) new ArrayList(invocationContext.smppNodeMap.values()).get(0));
return invocationContext.smppNodeMap.get(invocationContext.activeNodeKey);
} else
return invocationContext.smppNodeMap.get(invocationContext.activeNodeKey);
}
use of org.mobicents.tools.sip.balancer.KeySmpp in project load-balancer by RestComm.
the class ClientConnectionImpl method rebind.
@Override
public void rebind() {
if (logger.isDebugEnabled())
logger.debug("LB tried to rebind to client " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
if (invocationContext.activeNodeKey != null)
invocationContext.activeNodeKey = new KeySmpp((Node) new ArrayList(invocationContext.smppNodeMap.values()).get(0));
clientState = ClientState.REBINDING;
this.lbClientListener.connectionLost(sessionId, bindPacket, node);
}
use of org.mobicents.tools.sip.balancer.KeySmpp in project load-balancer by RestComm.
the class SmppToProviderRoundRobinAlgorithm method configurationChanged.
@Override
public void configurationChanged() {
ConcurrentHashMap<KeySmpp, Node> newSmppNodeMap = new ConcurrentHashMap<KeySmpp, Node>();
String[] s = balancerContext.lbConfig.getSmppConfiguration().getRemoteServers().split(",");
String[] sTmp = new String[2];
for (int i = 0; i < s.length; i++) {
sTmp = s[i].split(":");
Node currNode = new Node("SMPP server " + i, sTmp[0].trim());
currNode.getProperties().put("smppPort", sTmp[1].trim());
newSmppNodeMap.put(new KeySmpp(sTmp[0].trim(), Integer.parseInt(sTmp[1].trim())), currNode);
}
ConcurrentHashMap<KeySmpp, Node> removedSmppNodes = null;
ConcurrentHashMap<KeySmpp, Node> addedSmppNodes = null;
logger.info("Nodes removed : " + (removedSmppNodes = mapDifference(newSmppNodeMap, invocationContext.smppNodeMap)).values());
for (KeySmpp key : removedSmppNodes.keySet()) invocationContext.smppNodeMap.remove(key);
logger.info("Nodes added : " + (addedSmppNodes = mapDifference(invocationContext.smppNodeMap, newSmppNodeMap)).values());
invocationContext.smppNodeMap.putAll(addedSmppNodes);
logger.info("Updated SMPP node map after changing config file : " + invocationContext.smppNodeMap.values());
}
Aggregations