Skip to content

Commit

Permalink
p2p/nat: handle responses with alternative port in NAT-PMP (ethereum#…
Browse files Browse the repository at this point in the history
…26321)


Co-authored-by: Felix Lange <[email protected]>
  • Loading branch information
dbadoy and fjl authored Dec 7, 2022
1 parent f20eba4 commit 4221280
Showing 1 changed file with 16 additions and 2 deletions.
18 changes: 16 additions & 2 deletions p2p/nat/natpmp.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,22 @@ func (n *pmp) AddMapping(protocol string, extport, intport int, name string, lif
}
// Note order of port arguments is switched between our
// AddMapping and the client's AddPortMapping.
_, err := n.c.AddPortMapping(strings.ToLower(protocol), intport, extport, int(lifetime/time.Second))
return err
res, err := n.c.AddPortMapping(strings.ToLower(protocol), intport, extport, int(lifetime/time.Second))
if err != nil {
return err
}

// NAT-PMP maps an alternative available port number if the requested
// port is already mapped to another address and returns success. In this
// case, we return an error because there is no way to return the new port
// to the caller.
if uint16(extport) != res.MappedExternalPort {
// Destroy the mapping in NAT device.
n.c.AddPortMapping(strings.ToLower(protocol), intport, 0, 0)
return fmt.Errorf("port %d already mapped to another address (%s)", extport, protocol)
}

return nil
}

func (n *pmp) DeleteMapping(protocol string, extport, intport int) (err error) {
Expand Down

0 comments on commit 4221280

Please sign in to comment.