diff --git a/htlcswitch/switch.go b/htlcswitch/switch.go index 659db5b6e..6fabb3ef5 100644 --- a/htlcswitch/switch.go +++ b/htlcswitch/switch.go @@ -470,7 +470,28 @@ func (s *Switch) SendHTLC(firstHop lnwire.ShortChannelID, paymentID uint64, // Send packet to link. packet.circuit = circuit - return s.route(packet) + // User has created the htlc update therefore we should find the + // appropriate channel link and send the payment over this link. + link, linkErr := s.handleLocalAddHTLC(packet, htlc) + if linkErr != nil { + // Notify the htlc notifier of a link failure on our + // outgoing link. Incoming timelock/amount values are + // not set because they are not present for local sends. + s.cfg.HtlcNotifier.NotifyLinkFailEvent( + newHtlcKey(packet), + HtlcInfo{ + OutgoingTimeLock: htlc.Expiry, + OutgoingAmt: htlc.Amount, + }, + HtlcEventTypeSend, + linkErr, + false, + ) + + return linkErr + } + + return link.HandleSwitchPacket(packet) } // UpdateForwardingPolicies sends a message to the switch to update the @@ -702,28 +723,6 @@ func (s *Switch) proxyFwdErrs(num *int, wg *sync.WaitGroup, } } -// route sends a single htlcPacket through the switch and synchronously awaits a -// response. -func (s *Switch) route(packet *htlcPacket) error { - command := &plexPacket{ - pkt: packet, - err: make(chan error, 1), - } - - select { - case s.htlcPlex <- command: - case <-s.quit: - return ErrSwitchExiting - } - - select { - case err := <-command.err: - return err - case <-s.quit: - return ErrSwitchExiting - } -} - // routeAsync sends a packet through the htlc switch, using the provided err // chan to propagate errors back to the caller. The link's quit channel is // provided so that the send can be canceled if either the link or the switch @@ -747,39 +746,6 @@ func (s *Switch) routeAsync(packet *htlcPacket, errChan chan error, } } -// handleLocalUpdateAddDispatch is used at the start of the htlc update life -// cycle. It is used to send the htlc to the channel link without creation of -// circuit. -func (s *Switch) handleLocalUpdateAddDispatch(pkt *htlcPacket) error { - htlc, ok := pkt.htlc.(*lnwire.UpdateAddHTLC) - if !ok { - return errors.New("not an UpdateAdd packet") - } - - // User have created the htlc update therefore we should find the - // appropriate channel link and send the payment over this link. - link, err := s.handleLocalAddHTLC(pkt, htlc) - if err != nil { - // Notify the htlc notifier of a link failure on our - // outgoing link. Incoming timelock/amount values are - // not set because they are not present for local sends. - s.cfg.HtlcNotifier.NotifyLinkFailEvent( - newHtlcKey(pkt), - HtlcInfo{ - OutgoingTimeLock: htlc.Expiry, - OutgoingAmt: htlc.Amount, - }, - HtlcEventTypeSend, - err, - false, - ) - - return err - } - - return link.HandleSwitchPacket(pkt) -} - // handleLocalAddHTLC handles the addition of a htlc for a send that // originates from our node. It returns the link that the htlc should // be forwarded outwards on, and a link error if the htlc cannot be @@ -1014,7 +980,7 @@ func (s *Switch) handlePacketForward(packet *htlcPacket) error { case *lnwire.UpdateAddHTLC: // Check if the node is set to reject all onward HTLCs and also make // sure that HTLC is not from the source node. - if s.cfg.RejectHTLC && packet.incomingChanID != hop.Source { + if s.cfg.RejectHTLC { failure := NewDetailedLinkError( &lnwire.FailChannelDisabled{}, OutgoingFailureForwardsDisabled, @@ -1023,12 +989,6 @@ func (s *Switch) handlePacketForward(packet *htlcPacket) error { return s.failAddPacket(packet, failure) } - if packet.incomingChanID == hop.Source { - // A blank incomingChanID indicates that this is - // a pending user-initiated payment. - return s.handleLocalUpdateAddDispatch(packet) - } - // Before we attempt to find a non-strict forwarding path for // this htlc, check whether the htlc is being routed over the // same incoming and outgoing channel. If our node does not