Enet.Mod 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. MODULE Enet;
  2. IMPORT
  3. EnetBase, Interfaces := EnetInterfaces, EnetArp, EnetIcmp, EnetUdp;
  4. CONST
  5. MaxNumInterfaces* = 2; (** maximal supported number of interfaces *)
  6. MaxArpCacheSize* = 256;
  7. TYPE
  8. Int32 = EnetBase.Int32;
  9. Int16 = EnetBase.Int16;
  10. Int = EnetBase.Int;
  11. Interface* = EnetBase.Interface;
  12. VAR
  13. PROCEDURE InitInterface*(
  14. intf: Interface;
  15. dev: EnetBase.LinkDevice;
  16. VAR res: Int
  17. );
  18. BEGIN
  19. IF ~Interfaces.InitInterface(intf,dev,res) THEN RETURN; END;
  20. (*
  21. setup link device-specific locks
  22. *)
  23. intf.dev.acquireRx := AcquireDevRx;
  24. intf.dev.releaseRx := ReleaseDevRx;
  25. intf.dev.acquireTx := AcquireDevTx;
  26. intf.dev.releaseTx := ReleaseDevTx;
  27. intf.dev.rxPacketPool.acquire := AcquireDevRxPacketPool;
  28. intf.dev.rxPacketPool.release := ReleaseDevRxPacketPool;
  29. intf.dev.txPacketPool.acquire := AcquireDevTxPacketPool;
  30. intf.dev.txPacketPool.release := ReleaseDevTxPacketPool;
  31. (*
  32. setup locks for interface-specific tasks management
  33. *)
  34. intf.acquireTasks := AcquireTasks;
  35. intf.releaseTasks := ReleaseTasks;
  36. EnetArp.Install(intf);
  37. EnetIcmp.Install(intf);
  38. EnetUdp.Install(intf);
  39. (*
  40. setup locks for IP address resolution caches
  41. *)
  42. IF intf.ipv4AddrCache # NIL THEN
  43. intf.ipv4AddrCache.acquireWrite := AcquireIpv4AddrCache;
  44. intf.ipv4AddrCache.releaseWrite := ReleaseIpv4AddrCache;
  45. intf.ipv4AddrCache.acquireRead := AcquireIpv4AddrCache;
  46. intf.ipv4AddrCache.releaseRead := ReleaseIpv4AddrCache;
  47. END;
  48. IF intf.ipv6AddrCache # NIL THEN
  49. intf.ipv6AddrCache.acquireWrite := AcquireIpv6AddrCache;
  50. intf.ipv6AddrCache.releaseWrite := ReleaseIpv6AddrCache;
  51. intf.ipv6AddrCache.acquireRead := AcquireIpv6AddrCache;
  52. intf.ipv6AddrCache.releaseRead := ReleaseIpv6AddrCache;
  53. END;
  54. intf.start := Start;
  55. intf.stop := Stop;
  56. intf.reset := Reset;
  57. intf.finalize := Finalize;
  58. END InitInterface;
  59. (**
  60. Update the state of all available network interfaces
  61. *)
  62. PROCEDURE Update*;
  63. VAR i, res: Int;
  64. BEGIN
  65. FOR i := 0 TO Interfaces.numIntfs -1 DO
  66. IF ~Interfaces.Update(Interfaces.intfs[i],res) THEN
  67. END;
  68. END;
  69. END Update;
  70. PROCEDURE Start(intf: EnetBase.Interface; VAR res: Int): BOOLEAN;
  71. BEGIN
  72. RETURN intf.dev.start(intf.dev,res);
  73. END Start;
  74. PROCEDURE Stop(intf: EnetBase.Interface; VAR res: Int): BOOLEAN;
  75. BEGIN
  76. RETURN intf.dev.stop(intf.dev,res);
  77. END Stop;
  78. PROCEDURE Reset(intf: EnetBase.Interface; VAR res: Int): BOOLEAN;
  79. BEGIN
  80. RETURN intf.dev.reset(intf.dev,res);
  81. END Reset;
  82. PROCEDURE Finalize(intf: EnetBase.Interface; VAR res: Int): BOOLEAN;
  83. BEGIN
  84. IF ~intf.dev.stop(intf.dev,res) THEN END;
  85. RETURN intf.dev.finalize(intf.dev,res);
  86. END Finalize;
  87. PROCEDURE AcquireDevRx; BEGIN HALT(101); END AcquireDevRx;
  88. PROCEDURE ReleaseDevRx; BEGIN HALT(102); END ReleaseDevRx;
  89. PROCEDURE AcquireDevTx; BEGIN HALT(103); END AcquireDevTx;
  90. PROCEDURE ReleaseDevTx; BEGIN HALT(104); END ReleaseDevTx;
  91. PROCEDURE AcquireDevRxPacketPool; BEGIN HALT(105); END AcquireDevRxPacketPool;
  92. PROCEDURE ReleaseDevRxPacketPool; BEGIN HALT(106); END ReleaseDevRxPacketPool;
  93. PROCEDURE AcquireDevTxPacketPool; BEGIN HALT(107); END AcquireDevTxPacketPool;
  94. PROCEDURE ReleaseDevTxPacketPool; BEGIN HALT(108); END ReleaseDevTxPacketPool;
  95. PROCEDURE AcquireTasks; BEGIN HALT(109); END AcquireTasks;
  96. PROCEDURE ReleaseTasks; BEGIN HALT(110); END ReleaseTasks;
  97. PROCEDURE AcquireIpv4AddrCache; BEGIN HALT(111); END AcquireIpv4AddrCache;
  98. PROCEDURE ReleaseIpv4AddrCache; BEGIN HALT(112); END ReleaseIpv4AddrCache;
  99. PROCEDURE AcquireIpv6AddrCache; BEGIN HALT(113); END AcquireIpv6AddrCache;
  100. PROCEDURE ReleaseIpv6AddrCache; BEGIN HALT(114); END ReleaseIpv6AddrCache;
  101. PROCEDURE AcquireIntfsWrite(); BEGIN HALT(115); END AcquireIntfsWrite;
  102. PROCEDURE ReleaseIntfsWrite(); BEGIN HALT(116); END ReleaseIntfsWrite;
  103. PROCEDURE AcquireIntfsRead(); BEGIN HALT(117); END AcquireIntfsRead;
  104. PROCEDURE ReleaseIntfsRead(); BEGIN HALT(118); END ReleaseIntfsRead;
  105. END Enet.