UPnP Support

This commit is contained in:
obscuren 2014-02-02 19:44:47 +01:00
parent 3f503ffc7f
commit 48b41862ef
1 changed files with 14 additions and 18 deletions

View File

@ -54,24 +54,19 @@ type Ethereum struct {
nat NAT nat NAT
} }
func New(caps Caps) (*Ethereum, error) { func New(caps Caps, usePnp bool) (*Ethereum, error) {
//db, err := ethdb.NewLDBDatabase()
db, err := ethdb.NewMemDatabase() db, err := ethdb.NewMemDatabase()
if err != nil { if err != nil {
return nil, err return nil, err
} }
/* var nat NAT
gateway := net.ParseIP("192.168.192.1") if usePnp {
nat := NewNatPMP(gateway) nat, err = Discover()
port, err := nat.AddPortMapping("tcp", 30303, 30303, "", 60) if err != nil {
log.Println(port, err) log.Println("UPnP failed", err)
*/ return nil, err
}
nat, err := Discover()
if err != nil {
log.Println("UPnP failed", err)
return nil, err
} }
ethutil.Config.Db = db ethutil.Config.Db = db
@ -229,14 +224,15 @@ func (s *Ethereum) Start() {
if err != nil { if err != nil {
log.Println("Connection listening disabled. Acting as client") log.Println("Connection listening disabled. Acting as client")
} else { } else {
s.Addr = ln.Addr()
// Starting accepting connections // Starting accepting connections
log.Println("Ready and accepting connections") log.Println("Ready and accepting connections")
// Start the peer handler // Start the peer handler
go s.peerHandler(ln) go s.peerHandler(ln)
} }
go s.upnpUpdateThread() if s.nat != nil {
go s.upnpUpdateThread()
}
// Start the reaping processes // Start the reaping processes
go s.ReapDeadPeerHandler() go s.ReapDeadPeerHandler()
@ -288,18 +284,18 @@ out:
for { for {
select { select {
case <-timer.C: case <-timer.C:
listenPort, err := s.nat.AddPortMapping("TCP", int(lport), int(lport), "eth listen port", 20*60) var err error
_, err = s.nat.AddPortMapping("TCP", int(lport), int(lport), "eth listen port", 20*60)
if err != nil { if err != nil {
log.Println("can't add UPnP port mapping:", err) log.Println("can't add UPnP port mapping:", err)
break out break out
} }
if first && err == nil { if first && err == nil {
externalip, err := s.nat.GetExternalAddress() _, err = s.nat.GetExternalAddress()
if err != nil { if err != nil {
log.Println("UPnP can't get external address:", err) log.Println("UPnP can't get external address:", err)
continue out continue out
} }
log.Println("Successfully bound via UPnP to", externalip, listenPort)
first = false first = false
} }
timer.Reset(time.Minute * 15) timer.Reset(time.Minute * 15)