mirror of
				https://github.com/yggdrasil-network/yggdrasil-go.git
				synced 2025-11-04 03:05:07 +03:00 
			
		
		
		
	Add setTunTap
This commit is contained in:
		
							parent
							
								
									2b48fd1fce
								
							
						
					
					
						commit
						fdd32b9571
					
				
					 2 changed files with 55 additions and 2 deletions
				
			
		| 
						 | 
					@ -6,6 +6,7 @@ import "bytes"
 | 
				
			||||||
import "fmt"
 | 
					import "fmt"
 | 
				
			||||||
import "sort"
 | 
					import "sort"
 | 
				
			||||||
import "strings"
 | 
					import "strings"
 | 
				
			||||||
 | 
					import "strconv"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO? Make all of this JSON
 | 
					// TODO? Make all of this JSON
 | 
				
			||||||
// TODO: Add authentication
 | 
					// TODO: Add authentication
 | 
				
			||||||
| 
						 | 
					@ -55,13 +56,47 @@ func (a *admin) init(c *Core, listenaddr string) {
 | 
				
			||||||
	a.addHandler("getSessions", nil, func(out *[]byte, _ ...string) {
 | 
						a.addHandler("getSessions", nil, func(out *[]byte, _ ...string) {
 | 
				
			||||||
		*out = []byte(a.printInfos(a.getData_getSessions()))
 | 
							*out = []byte(a.printInfos(a.getData_getSessions()))
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	a.addHandler("addPeer", nil, func(out *[]byte, saddr ...string) {
 | 
						a.addHandler("addPeer", []string{"<peer>"}, func(out *[]byte, saddr ...string) {
 | 
				
			||||||
		if a.addPeer(saddr[0]) == nil {
 | 
							if a.addPeer(saddr[0]) == nil {
 | 
				
			||||||
			*out = []byte("Adding peer: " + saddr[0] + "\n")
 | 
								*out = []byte("Adding peer: " + saddr[0] + "\n")
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			*out = []byte("Failed to add peer: " + saddr[0] + "\n")
 | 
								*out = []byte("Failed to add peer: " + saddr[0] + "\n")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
						a.addHandler("setTunTap", []string{"<ifname|auto|none>", "[<tun|tap>]", "[<mtu>]"}, func(out *[]byte, ifparams ...string) {
 | 
				
			||||||
 | 
							// Check parameters
 | 
				
			||||||
 | 
							if (ifparams[0] != "none" && len(ifparams) != 3) ||
 | 
				
			||||||
 | 
								(ifparams[0] == "none" && len(ifparams) != 1) {
 | 
				
			||||||
 | 
								*out = []byte("Invalid number of parameters given\n")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// Set sane defaults
 | 
				
			||||||
 | 
							iftapmode := false
 | 
				
			||||||
 | 
							ifmtu := 1280
 | 
				
			||||||
 | 
							var err error
 | 
				
			||||||
 | 
							if len(ifparams) > 1 {
 | 
				
			||||||
 | 
								// Is it a TAP adapter?
 | 
				
			||||||
 | 
								if ifparams[1] == "tap" {
 | 
				
			||||||
 | 
									iftapmode = true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								// Make sure the MTU is sane
 | 
				
			||||||
 | 
								ifmtu, err = strconv.Atoi(ifparams[2])
 | 
				
			||||||
 | 
								if err != nil || ifmtu < 1280 || ifmtu > 65535 {
 | 
				
			||||||
 | 
									ifmtu = 1280
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// Start the TUN adapter
 | 
				
			||||||
 | 
							if err := a.startTunWithMTU(ifparams[0], iftapmode, ifmtu); err != nil {
 | 
				
			||||||
 | 
								*out = []byte(fmt.Sprintf("Failed to set TUN: %v\n", err))
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								info := admin_nodeInfo{
 | 
				
			||||||
 | 
									{"Interface name", ifparams[0]},
 | 
				
			||||||
 | 
									{"TAP mode", strconv.FormatBool(iftapmode)},
 | 
				
			||||||
 | 
									{"MTU", strconv.Itoa(ifmtu)},
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								*out = []byte(a.printInfos([]admin_nodeInfo{info}))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
	go a.listen()
 | 
						go a.listen()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -183,6 +218,23 @@ func (a *admin) addPeer(p string) error {
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (a *admin) startTunWithMTU(ifname string, iftapmode bool, ifmtu int) error {
 | 
				
			||||||
 | 
						// Close the TUN first if open
 | 
				
			||||||
 | 
						_ = a.core.tun.close()
 | 
				
			||||||
 | 
						// Then reconfigure and start it
 | 
				
			||||||
 | 
						addr := a.core.router.addr
 | 
				
			||||||
 | 
						straddr := fmt.Sprintf("%s/%v", net.IP(addr[:]).String(), 8*len(address_prefix))
 | 
				
			||||||
 | 
						if ifname != "none" {
 | 
				
			||||||
 | 
							err := a.core.tun.setup(ifname, iftapmode, straddr, ifmtu)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							go a.core.tun.read()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						go a.core.tun.write()
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (a *admin) getData_getSelf() *admin_nodeInfo {
 | 
					func (a *admin) getData_getSelf() *admin_nodeInfo {
 | 
				
			||||||
	table := a.core.switchTable.table.Load().(lookupTable)
 | 
						table := a.core.switchTable.table.Load().(lookupTable)
 | 
				
			||||||
	addr := a.core.router.addr
 | 
						addr := a.core.router.addr
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,7 +66,8 @@ func (tun *tunDevice) read() error {
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		n, err := tun.iface.Read(buf)
 | 
							n, err := tun.iface.Read(buf)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			panic(err)
 | 
								// panic(err)
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		o := 0
 | 
							o := 0
 | 
				
			||||||
		if tun.iface.IsTAP() {
 | 
							if tun.iface.IsTAP() {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue