File: pppbridge.go

package info (click to toggle)
golang-github-katalix-go-l2tp 0.1.8-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 632 kB
  • sloc: ansic: 127; sh: 10; makefile: 4
file content (67 lines) | stat: -rw-r--r-- 1,581 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package main

import (
	"fmt"

	"github.com/katalix/go-l2tp/l2tp"
	"golang.org/x/sys/unix"
)

var _ pseudowire = (*pppBridge)(nil)

type pppBridge struct {
	session         l2tp.Session
	pppoe, pppol2tp *pppChannel
}

func newPPPBridge(session l2tp.Session, tunnelID, sessionID, peerTunnelID, peerSessionID l2tp.ControlConnID, pppoeSessionID uint16, pppoePeerMAC [6]byte, pppoeInterfaceName string) (*pppBridge, error) {

	pppoeSk, err := socketPPPoE(pppoeSessionID, pppoePeerMAC, pppoeInterfaceName)
	if err != nil {
		return nil, fmt.Errorf("failed to create PPPoE socket: %v", err)
	}

	pppoeChan, err := newPPPChannel(pppoeSk)
	if err != nil {
		unix.Close(pppoeSk)
		return nil, fmt.Errorf("failed to create PPPoE channel: %v", err)
	}

	pppol2tpSk, err := socketPPPoL2TPv4(tunnelID, sessionID, peerTunnelID, peerSessionID)
	if err != nil {
		pppoeChan.close()
		return nil, fmt.Errorf("failed to create PPPoL2TP socket: %v", err)
	}

	pppol2tpChan, err := newPPPChannel(pppol2tpSk)
	if err != nil {
		pppoeChan.close()
		return nil, fmt.Errorf("failed to create PPPoL2TP channel: %v", err)
	}

	err = pppoeChan.bridge(pppol2tpChan)
	if err != nil {
		pppoeChan.close()
		pppol2tpChan.close()
		return nil, fmt.Errorf("failed to bridge PPPoE to PPPoL2TP channel: %v", err)
	}

	return &pppBridge{
		session:  session,
		pppoe:    pppoeChan,
		pppol2tp: pppol2tpChan,
	}, nil
}

func (pb *pppBridge) close() {
	if pb.pppoe != nil {
		pb.pppoe.close()
	}
	if pb.pppol2tp != nil {
		pb.pppol2tp.close()
	}
}

func (pb *pppBridge) getSession() l2tp.Session {
	return pb.session
}