Ping_protocol.java 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package de.tu_darmstadt.tk.SmartHomeNetworkSim.core.protocols;
  2. import java.util.Collection;
  3. import java.util.LinkedList;
  4. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Packet;
  5. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Port;
  6. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Protocol;
  7. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.protocols.packets.Ping_packet;
  8. import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.util.Pair;
  9. /**
  10. * Ping Protocol which sends simple Ping requests to the target
  11. *
  12. * @author Andreas T. Meyer-Berg
  13. */
  14. public class Ping_protocol implements Protocol {
  15. /**
  16. * Sender / Source of the Ping Request
  17. */
  18. private Port sender;
  19. /**
  20. * Target / Destination of the Ping Request
  21. */
  22. private Port target;
  23. /**
  24. * Creates a new Ping Protocol
  25. */
  26. public Ping_protocol(){
  27. sender = null;
  28. target = null;
  29. }
  30. /**
  31. * Ping sequence number
  32. */
  33. private short sequence = 0;
  34. @Override
  35. public Collection<Packet> generateNextPackets(Port port, long timestep, boolean packetLost) {
  36. /**
  37. * Packets which are generated during this timestep
  38. */
  39. LinkedList<Packet> packets = new LinkedList<>();
  40. if(port == null || port.getStatus() != Port.SENDING)
  41. return packets;
  42. /**
  43. * Update trigger time
  44. */
  45. port.setLastTrigger(timestep);
  46. if(port == sender && target != null){
  47. packets.add(new Ping_packet(timestep, sender, target, Ping_packet.EchoRequest, sequence));
  48. long delay = sender.getTransmissionDelayTo(target);
  49. if(target.getStatus() >= Port.OPEN && !packetLost && delay != Long.MAX_VALUE){
  50. packets.add(new Ping_packet(timestep+target.getResponseTime()+delay+(short)(target.getJitter()*Math.random()), target, sender, Ping_packet.EchoReply, sequence++));
  51. }
  52. }
  53. else if(port == target){
  54. /**
  55. * Target should not initialize ping
  56. */
  57. }
  58. return packets;
  59. }
  60. @Override
  61. public String[] getRoles() {
  62. return new String[]{"Sender", "Target"};
  63. }
  64. @Override
  65. public Collection<Port> getDevicesWithRole(int role) {
  66. /**
  67. * Devices of the given Role
  68. */
  69. LinkedList<Port> devicesOfRole = new LinkedList<Port>();
  70. switch (role) {
  71. case 0:
  72. if(sender != null)
  73. devicesOfRole.add(sender);
  74. break;
  75. case 1:
  76. if(target != null)
  77. devicesOfRole.add(target);
  78. break;
  79. default:
  80. return null;
  81. }
  82. return devicesOfRole;
  83. }
  84. @Override
  85. public boolean addDeviceOfRole(Port device, int role) {
  86. if(role == 0 &&sender == null)
  87. sender = device;
  88. else if(role == 1 && target == null)
  89. target = device;
  90. else
  91. return false;
  92. return true;
  93. }
  94. @Override
  95. public void removeDevice(Port device) {
  96. if(sender == device)
  97. sender = null;
  98. if(target == device)
  99. target = null;
  100. }
  101. @Override
  102. public String getName() {
  103. return "Ping";
  104. }
  105. @Override
  106. public Collection<Pair<Port, Port>> getDeletedTopology() {
  107. return new LinkedList<Pair<Port, Port>>();
  108. }
  109. }