handler.go 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package nebula
  2. func (f *Interface) newHook(w func([]byte) error) InsideHandler {
  3. fn := func(hostInfo *HostInfo, ci *ConnectionState, addr *udpAddr, header *Header, out []byte, packet []byte, fwPacket *FirewallPacket, nb []byte) {
  4. f.decryptTo(w, hostInfo, header.MessageCounter, out, packet, fwPacket, nb)
  5. }
  6. return f.encrypted(fn)
  7. }
  8. func (f *Interface) encrypted(h InsideHandler) InsideHandler {
  9. return func(hostInfo *HostInfo, ci *ConnectionState, addr *udpAddr, header *Header, out []byte, packet []byte, fwPacket *FirewallPacket, nb []byte) {
  10. if !f.handleEncrypted(ci, addr, header) {
  11. return
  12. }
  13. h(hostInfo, ci, addr, header, out, packet, fwPacket, nb)
  14. f.handleHostRoaming(hostInfo, addr)
  15. f.connectionManager.In(hostInfo.hostId)
  16. }
  17. }
  18. func (f *Interface) rxMetrics(h InsideHandler) InsideHandler {
  19. return func(hostInfo *HostInfo, ci *ConnectionState, addr *udpAddr, header *Header, out []byte, packet []byte, fwPacket *FirewallPacket, nb []byte) {
  20. f.messageMetrics.Rx(header.Type, header.Subtype, 1)
  21. h(hostInfo, ci, addr, header, out, packet, fwPacket, nb)
  22. }
  23. }
  24. func (f *Interface) handleMessagePacket(hostInfo *HostInfo, ci *ConnectionState, addr *udpAddr, header *Header, out []byte, packet []byte, fwPacket *FirewallPacket, nb []byte) {
  25. f.decryptTo(f.inside.WriteRaw, hostInfo, header.MessageCounter, out, packet, fwPacket, nb)
  26. }
  27. func (f *Interface) handleLighthousePacket(hostInfo *HostInfo, ci *ConnectionState, addr *udpAddr, header *Header, out []byte, packet []byte, fwPacket *FirewallPacket, nb []byte) {
  28. d, err := f.decrypt(hostInfo, header.MessageCounter, out, packet, header, nb)
  29. if err != nil {
  30. hostInfo.logger().WithError(err).WithField("udpAddr", addr).
  31. WithField("packet", packet).
  32. Error("Failed to decrypt lighthouse packet")
  33. //TODO: maybe after build 64 is out? 06/14/2018 - NB
  34. //f.sendRecvError(net.Addr(addr), header.RemoteIndex)
  35. return
  36. }
  37. f.lightHouse.HandleRequest(addr, hostInfo.hostId, d, hostInfo.GetCert(), f)
  38. }
  39. func (f *Interface) handleTestPacket(hostInfo *HostInfo, ci *ConnectionState, addr *udpAddr, header *Header, out []byte, packet []byte, fwPacket *FirewallPacket, nb []byte) {
  40. d, err := f.decrypt(hostInfo, header.MessageCounter, out, packet, header, nb)
  41. if err != nil {
  42. hostInfo.logger().WithError(err).WithField("udpAddr", addr).
  43. WithField("packet", packet).
  44. Error("Failed to decrypt test packet")
  45. //TODO: maybe after build 64 is out? 06/14/2018 - NB
  46. //f.sendRecvError(net.Addr(addr), header.RemoteIndex)
  47. return
  48. }
  49. if header.Subtype == testRequest {
  50. // This testRequest might be from TryPromoteBest, so we should roam
  51. // to the new IP address before responding
  52. f.handleHostRoaming(hostInfo, addr)
  53. f.send(test, testReply, ci, hostInfo, hostInfo.remote, d, nb, out)
  54. }
  55. }
  56. func (f *Interface) handleHandshakePacket(hostInfo *HostInfo, ci *ConnectionState, addr *udpAddr, header *Header, out []byte, packet []byte, fwPacket *FirewallPacket, nb []byte) {
  57. HandleIncomingHandshake(f, addr, packet, header, hostInfo)
  58. }
  59. func (f *Interface) handleRecvErrorPacket(hostInfo *HostInfo, ci *ConnectionState, addr *udpAddr, header *Header, out []byte, packet []byte, fwPacket *FirewallPacket, nb []byte) {
  60. // TODO: Remove this with recv_error deprecation
  61. f.handleRecvError(addr, header)
  62. }
  63. func (f *Interface) handleCloseTunnelPacket(hostInfo *HostInfo, ci *ConnectionState, addr *udpAddr, header *Header, out []byte, packet []byte, fwPacket *FirewallPacket, nb []byte) {
  64. hostInfo.logger().WithField("udpAddr", addr).
  65. Info("Close tunnel received, tearing down.")
  66. f.closeTunnel(hostInfo)
  67. }