CreateTUNFromFile creates a Device from an os.File with the provided MTU.
(file *os.File, mtu int)
| 583 | |
| 584 | // CreateTUNFromFile creates a Device from an os.File with the provided MTU. |
| 585 | func CreateTUNFromFile(file *os.File, mtu int) (Device, error) { |
| 586 | tun := &NativeTun{ |
| 587 | tunFile: file, |
| 588 | events: make(chan Event, 5), |
| 589 | errors: make(chan error, 5), |
| 590 | statusListenersShutdown: make(chan struct{}), |
| 591 | tcpGROTable: newTCPGROTable(), |
| 592 | udpGROTable: newUDPGROTable(), |
| 593 | toWrite: make([]int, 0, conn.IdealBatchSize), |
| 594 | } |
| 595 | |
| 596 | name, err := tun.Name() |
| 597 | if err != nil { |
| 598 | return nil, err |
| 599 | } |
| 600 | |
| 601 | err = tun.initFromFlags(name) |
| 602 | if err != nil { |
| 603 | return nil, err |
| 604 | } |
| 605 | |
| 606 | // start event listener |
| 607 | tun.index, err = getIFIndex(name) |
| 608 | if err != nil { |
| 609 | return nil, err |
| 610 | } |
| 611 | |
| 612 | tun.netlinkSock, err = createNetlinkSocket() |
| 613 | if err != nil { |
| 614 | return nil, err |
| 615 | } |
| 616 | tun.netlinkCancel, err = rwcancel.NewRWCancel(tun.netlinkSock) |
| 617 | if err != nil { |
| 618 | unix.Close(tun.netlinkSock) |
| 619 | return nil, err |
| 620 | } |
| 621 | |
| 622 | tun.hackListenerClosed.Lock() |
| 623 | go tun.routineNetlinkListener() |
| 624 | go tun.routineHackListener() // cross namespace |
| 625 | |
| 626 | err = tun.setMTU(mtu) |
| 627 | if err != nil { |
| 628 | unix.Close(tun.netlinkSock) |
| 629 | return nil, err |
| 630 | } |
| 631 | |
| 632 | return tun, nil |
| 633 | } |
| 634 | |
| 635 | // CreateUnmonitoredTUNFromFD creates a Device from the provided file |
| 636 | // descriptor. |
no test coverage detected