init update
This commit is contained in:
1 parent
a9fb0727c6
commit
2ed23df9a0
15 files changed
+898
No files matched your search
@@ -0,0 +1,2 @@
|
||||
.idea/
|
||||
go.sum
|
||||
@@ -0,0 +1,13 @@
|
||||
module ip-tunnel
|
||||
|
||||
go 1.16
|
||||
|
||||
require (
|
||||
github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8
|
||||
github.com/urfave/cli/v2 v2.3.0 // indirect
|
||||
golang.org/x/sys v0.0.0-20210915083310-ed5796bab164 // indirect
|
||||
gopkg.in/ini.v1 v1.63.2 // indirect
|
||||
minlib v0.0.0
|
||||
)
|
||||
|
||||
replace minlib v0.0.0 => ../minlib
|
||||
+173
@@ -0,0 +1,173 @@
|
||||
// Package iptun
|
||||
// @Author: Jianming Que
|
||||
// @Description:
|
||||
// @Version: 1.0.0
|
||||
// @Date: 2021/9/19 9:56 下午
|
||||
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
||||
//
|
||||
package iptun
|
||||
|
||||
import (
|
||||
"github.com/songgao/water"
|
||||
"github.com/songgao/water/waterutil"
|
||||
"log"
|
||||
"minlib/common"
|
||||
"net"
|
||||
"os/exec"
|
||||
"strconv"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
InterfaceName string // The interface name want to create
|
||||
IPv4Addr string // The IPv4 address assign to created interface
|
||||
MTU int // The MTU assign to created interface
|
||||
Mask string // The network mask assign to created interface
|
||||
Route []string
|
||||
}
|
||||
|
||||
type IPPacket struct {
|
||||
Src net.IP // 源ip地址
|
||||
Dst net.IP // 目的ip地址
|
||||
RawPackets []byte // 原始IP包
|
||||
}
|
||||
|
||||
type IPTun struct {
|
||||
iface *water.Interface // TUN网卡对象,用于收发包
|
||||
packets []byte // 缓存队列,用于保存从TUN收到的IP包
|
||||
}
|
||||
|
||||
// NewIPTun 创建一个 IPTun
|
||||
//
|
||||
// @Description:
|
||||
// @param config
|
||||
//
|
||||
func NewIPTun(config Config) (*IPTun, error) {
|
||||
ipTun := new(IPTun)
|
||||
if err := ipTun.Init(config); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return ipTun, nil
|
||||
}
|
||||
|
||||
// Init 初始化 IPTun
|
||||
//
|
||||
// @Description:
|
||||
// @receiver i
|
||||
// @param config
|
||||
// @return error
|
||||
//
|
||||
func (i *IPTun) Init(config Config) error {
|
||||
// 根据 MTU 设置抓包大小
|
||||
i.packets = make([]byte, config.MTU+200)
|
||||
|
||||
// 创建一个 TUN 网卡
|
||||
iface, err := water.New(water.Config{
|
||||
DeviceType: water.TUN,
|
||||
PlatformSpecificParams: water.PlatformSpecificParams{
|
||||
Name: config.InterfaceName,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
i.iface = iface
|
||||
|
||||
// 设置IP地址
|
||||
cmd := exec.Command("ifconfig", config.InterfaceName,
|
||||
config.IPv4Addr, "netmask", config.Mask, "mtu", strconv.Itoa(config.MTU))
|
||||
err = cmd.Run()
|
||||
if err != nil {
|
||||
log.Fatalln("Assign ip addr failed: ", err)
|
||||
}
|
||||
|
||||
// 添加路由
|
||||
for i := 0; i < len(config.Route); i++ {
|
||||
cmd = exec.Command("route", "add", "-net", config.Route[i], "dev", config.InterfaceName)
|
||||
err = cmd.Run()
|
||||
if err != nil {
|
||||
common.LogFatal("add route error. cmd: ", cmd.String(), " ", err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ReadIPPacketFromTun 从TUN中读取一个IP包
|
||||
//
|
||||
// @Description:
|
||||
// @receiver i
|
||||
// @param needCopy
|
||||
// @return *IPPacket
|
||||
// @return error
|
||||
//
|
||||
func (i *IPTun) ReadIPPacketFromTun(needCopy bool) (*IPPacket, error) {
|
||||
n, err := i.iface.Read(i.packets)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ipPacket := new(IPPacket)
|
||||
ipPacket.Src = waterutil.IPv4Source(i.packets)
|
||||
ipPacket.Dst = waterutil.IPv4Destination(i.packets)
|
||||
if needCopy {
|
||||
ipPacket.RawPackets = make([]byte, n)
|
||||
copy(ipPacket.RawPackets, i.packets)
|
||||
} else {
|
||||
ipPacket.RawPackets = i.packets[:n]
|
||||
}
|
||||
return ipPacket, nil
|
||||
}
|
||||
|
||||
// WriteIPPacketToTun 将一个 IP 包写入 TUN
|
||||
//
|
||||
// @Description:
|
||||
// @receiver i
|
||||
// @param packet
|
||||
// @return error
|
||||
//
|
||||
func (i *IPTun) WriteIPPacketToTun(packet []byte) (int, error) {
|
||||
return i.iface.Write(packet)
|
||||
}
|
||||
|
||||
// StartTunnel 启动隧道
|
||||
//
|
||||
// @Description:
|
||||
// @receiver i
|
||||
// @param adapter
|
||||
//
|
||||
func (i *IPTun) StartTunnel(adapter TunnelAdapter) {
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(2)
|
||||
|
||||
// 在一个单独的协程里面接收来自 TUN 的IP包
|
||||
go func(done func()) {
|
||||
defer done()
|
||||
for {
|
||||
ipPacket, err := i.ReadIPPacketFromTun(false)
|
||||
if err != nil {
|
||||
common.LogError(err)
|
||||
}
|
||||
if err := adapter.OnReceiveIPPktFromTun(ipPacket); err != nil {
|
||||
common.LogError(err)
|
||||
}
|
||||
}
|
||||
}(wg.Done)
|
||||
|
||||
// 在单独的协程里面接收CPacket,并从中提取出 IP 包写入到TUN当中
|
||||
go func(done func()) {
|
||||
defer wg.Done()
|
||||
for {
|
||||
if ipPacket, err := adapter.ReadIPPkt(); err != nil {
|
||||
common.LogError(err)
|
||||
} else {
|
||||
if _, err := i.WriteIPPacketToTun(ipPacket.RawPackets); err != nil {
|
||||
common.LogError(err)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}(wg.Done)
|
||||
|
||||
// 等待两个协程结束
|
||||
wg.Wait()
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
// Package iptun
|
||||
// @Author: Jianming Que
|
||||
// @Description:
|
||||
// @Version: 1.0.0
|
||||
// @Date: 2021/9/21 10:18 上午
|
||||
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
||||
//
|
||||
package iptun
|
||||
|
||||
// TunnelAdapter IP隧道适配器,定义了实现IP隧道所需要实现的方法
|
||||
// @Description:
|
||||
//
|
||||
type TunnelAdapter interface {
|
||||
// OnReceiveIPPktFromTun 每当从 TUN 收到一个IP包时,会调用这个回调进行处理
|
||||
//
|
||||
// @Description:
|
||||
// 1. 基于MIN或者NDN实现隧道时,要在这个回调里面对生成一个新的网络包,携带这个网络分组并通过 MIN/NDN 网络隧道到另一个边界路由器
|
||||
// @param packet
|
||||
//
|
||||
OnReceiveIPPktFromTun(packet *IPPacket) error
|
||||
|
||||
// ReadIPPkt 从 MIN/NDN 中读取一个隧道过来的 IP 包
|
||||
//
|
||||
// @Description:
|
||||
// 1. 基于MIN或者NDN实现隧道时,需要在其中实现从 MIN/NDN 网络中接收一个携带有IP包的网络分组,并提取出其中的IP包
|
||||
// @return *IPPacket
|
||||
// @return error
|
||||
//
|
||||
ReadIPPkt() (*IPPacket, error)
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
// Package iptun
|
||||
// @Author: Jianming Que
|
||||
// @Description:
|
||||
// @Version: 1.0.0
|
||||
// @Date: 2021/9/20 11:42 上午
|
||||
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
||||
//
|
||||
package iptun
|
||||
|
||||
import "gopkg.in/ini.v1"
|
||||
|
||||
type IPTunnelConfig struct {
|
||||
TunConfig `ini:"Tun"`
|
||||
MirConfig `ini:"Mir"`
|
||||
LogConfig `ini:"Log"`
|
||||
}
|
||||
|
||||
func (i *IPTunnelConfig) Init() {
|
||||
i.TunConfig.InterfaceName = "tun0"
|
||||
i.TunConfig.IPv4Addr = "192.168.88.1"
|
||||
i.TunConfig.Mtu = 1500
|
||||
i.TunConfig.Mask = "255.255.255.0"
|
||||
i.TunConfig.Route = make([]string, 0)
|
||||
|
||||
i.MirConfig.UnixSocketPath = "/tmp/mir.sock"
|
||||
i.MirConfig.ListenIdentifier = ""
|
||||
i.MirConfig.TargetIdentifier = ""
|
||||
}
|
||||
|
||||
type TunConfig struct {
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//// Tun
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
InterfaceName string `ini:"InterfaceName"`
|
||||
IPv4Addr string `ini:"IPv4Addr"`
|
||||
Mtu int `ini:"Mtu"`
|
||||
Mask string `ini:"Mask"`
|
||||
Route []string `ini:"Route"`
|
||||
}
|
||||
|
||||
type MirConfig struct {
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//// Mir
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
UnixSocketPath string `ini:"UnixSocketPath"`
|
||||
ListenIdentifier string `ini:"ListenIdentifier"`
|
||||
TargetIdentifier string `ini:"TargetIdentifier"`
|
||||
}
|
||||
|
||||
type LogConfig struct {
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//// Log
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
LogLevel string `ini:"LogLevel"`
|
||||
}
|
||||
|
||||
// ParseConfig
|
||||
// 解析配置文件
|
||||
//
|
||||
// @Description:
|
||||
// @receiver m
|
||||
// @param configPath
|
||||
// @return error
|
||||
//
|
||||
func ParseConfig(configPath string) (*IPTunnelConfig, error) {
|
||||
cfg, err := ini.Load(configPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mirConfig := new(IPTunnelConfig)
|
||||
// 初始化配置,给所有的配置项设置默认值
|
||||
mirConfig.Init()
|
||||
// 加载配置文件中的配置
|
||||
if err = cfg.MapTo(&mirConfig); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return mirConfig, nil
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
// Package min
|
||||
// @Author: Jianming Que
|
||||
// @Description:
|
||||
// @Version: 1.0.0
|
||||
// @Date: 2021/9/21 10:27 上午
|
||||
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
||||
//
|
||||
package min
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/songgao/water/waterutil"
|
||||
"ip-tunnel/iptun"
|
||||
"minlib/common"
|
||||
"minlib/component"
|
||||
"minlib/logicface"
|
||||
"minlib/packet"
|
||||
)
|
||||
|
||||
type MINTunnelAdapter struct {
|
||||
logicFace logicface.LogicFace
|
||||
config *iptun.IPTunnelConfig
|
||||
}
|
||||
|
||||
// NewMINTunnelAdapter 创建一个 MINTunnelAdapter
|
||||
//
|
||||
// @Description:
|
||||
// @param config
|
||||
// @return *MINTunnelAdapter
|
||||
// @return error
|
||||
//
|
||||
func NewMINTunnelAdapter(config *iptun.IPTunnelConfig) (*MINTunnelAdapter, error) {
|
||||
adapter := new(MINTunnelAdapter)
|
||||
adapter.config = config
|
||||
return adapter, adapter.Init(config)
|
||||
}
|
||||
|
||||
// Init 初始化 MINTunnelAdapter
|
||||
//
|
||||
// @Description:
|
||||
// @receiver M
|
||||
// @param config
|
||||
// @return error
|
||||
//
|
||||
func (M *MINTunnelAdapter) Init(config *iptun.IPTunnelConfig) error {
|
||||
// 连接上 MIR
|
||||
if err := M.logicFace.InitWithUnixSocket(config.MirConfig.UnixSocketPath); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 注册前缀监听
|
||||
if listenIdentifier, err := component.CreateIdentifierByString(config.MirConfig.ListenIdentifier); err != nil {
|
||||
return err
|
||||
} else {
|
||||
if err := M.logicFace.RegisterIdentifier(listenIdentifier, 1000); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// OnReceiveIPPktFromTun 处理从TUN网卡接收到的IP包
|
||||
//
|
||||
// @Description:
|
||||
// 1. 生成一个 CPacket,将IP包放进去
|
||||
// 2. 然后将 CPacket 发出即可
|
||||
// @receiver M
|
||||
// @param packet
|
||||
//
|
||||
func (M *MINTunnelAdapter) OnReceiveIPPktFromTun(ipPacket *iptun.IPPacket) error {
|
||||
srcIdentifier, err := component.CreateIdentifierByString(M.config.ListenIdentifier)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dstIdentifier, err := component.CreateIdentifierByString(M.config.TargetIdentifier)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 在这边构造CPacket发出
|
||||
cPacket := new(packet.CPacket)
|
||||
cPacket.SetTtl(5)
|
||||
cPacket.SetSrcIdentifier(srcIdentifier)
|
||||
cPacket.SetDstIdentifier(dstIdentifier)
|
||||
cPacket.Payload.SetValue(ipPacket.RawPackets)
|
||||
|
||||
common.LogDebug(fmt.Sprintf("Packet Received: %v -> %v \t %x\n", ipPacket.Src.String(), ipPacket.Dst.String(),
|
||||
ipPacket.RawPackets))
|
||||
if err := M.logicFace.SendCPacket(cPacket); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ReadIPPkt 从MIN网络中接收携带 IP 包的 CPacket,并
|
||||
//
|
||||
// @Description:
|
||||
// @receiver M
|
||||
// @return *IPPacket
|
||||
// @return error
|
||||
//
|
||||
func (M *MINTunnelAdapter) ReadIPPkt() (*iptun.IPPacket, error) {
|
||||
cPacket, err := M.logicFace.ReceiveCPacket(4000)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
common.LogDebug(fmt.Sprintf("Write %d bytes, %s -> %s, %x", len(cPacket.Payload.GetValue()),
|
||||
waterutil.IPv4Source(cPacket.Payload.GetValue()),
|
||||
waterutil.IPv4Destination(cPacket.Payload.GetValue()), cPacket.Payload.GetValue()))
|
||||
}
|
||||
return &iptun.IPPacket{
|
||||
Src: waterutil.IPv4Source(cPacket.Payload.GetValue()),
|
||||
Dst: waterutil.IPv4Destination(cPacket.Payload.GetValue()),
|
||||
RawPackets: cPacket.Payload.GetValue(),
|
||||
}, nil
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
// Package ndn
|
||||
// @Author: Jianming Que
|
||||
// @Description:
|
||||
// @Version: 1.0.0
|
||||
// @Date: 2021/9/21 5:23 下午
|
||||
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
||||
//
|
||||
package ndn
|
||||
|
||||
import (
|
||||
"ip-tunnel/iptun"
|
||||
)
|
||||
|
||||
type NDNTunnelAdapter struct {
|
||||
receivePktFromTunChannel chan *iptun.IPPacket
|
||||
receivePktFromNDN chan *iptun.IPPacket
|
||||
}
|
||||
|
||||
func (N *NDNTunnelAdapter) Init() {
|
||||
N.receivePktFromTunChannel = make(chan *iptun.IPPacket, 10)
|
||||
N.receivePktFromNDN = make(chan *iptun.IPPacket, 10)
|
||||
}
|
||||
|
||||
func (N *NDNTunnelAdapter) GetPktFromTun() *iptun.IPPacket {
|
||||
return <-N.receivePktFromTunChannel
|
||||
}
|
||||
|
||||
func (N *NDNTunnelAdapter) OnReceivePktFromNDN(packet *iptun.IPPacket) {
|
||||
N.receivePktFromNDN <- packet
|
||||
}
|
||||
|
||||
// OnReceiveIPPktFromTun 从 TUN 接收到IP包时,调用本回调
|
||||
//
|
||||
// @Description:
|
||||
// @receiver N
|
||||
// @param packet
|
||||
// @return error
|
||||
//
|
||||
func (N *NDNTunnelAdapter) OnReceiveIPPktFromTun(packet *iptun.IPPacket) error {
|
||||
// 通过 chan 传递
|
||||
N.receivePktFromTunChannel <- packet
|
||||
return nil
|
||||
}
|
||||
|
||||
// ReadIPPkt 从NDN接收隧道过来的IP包
|
||||
//
|
||||
// @Description:
|
||||
// @receiver N
|
||||
// @return *iptun.IPPacket
|
||||
// @return error
|
||||
//
|
||||
func (N *NDNTunnelAdapter) ReadIPPkt() (*iptun.IPPacket, error) {
|
||||
ipPacket := <-N.receivePktFromNDN
|
||||
return ipPacket, nil
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
[Tun]
|
||||
InterfaceName = tun0
|
||||
IPv4Addr = 192.168.88.1
|
||||
Mtu = 1500
|
||||
Mask = 255.255.255.0
|
||||
Route = 192.168.90.0/24
|
||||
|
||||
[Mir]
|
||||
UnixSocketPath = /tmp/mir.sock
|
||||
ListenIdentifier = /pkusz/B
|
||||
TargetIdentifier = /pkusz/C
|
||||
|
||||
[Log]
|
||||
# NONE:不输出日志
|
||||
# ERROR:输出错误信息
|
||||
# WARN:输出警告信息
|
||||
# INFO:输出正常运行的信息
|
||||
# DEBUG:输出调试信息
|
||||
# TRACE:输出追踪信息
|
||||
# ALL:输出所有信息
|
||||
LogLevel = DEBUG
|
||||
@@ -0,0 +1,77 @@
|
||||
// Package ip_tunnel
|
||||
// @Author: Jianming Que
|
||||
// @Description:
|
||||
// @Version: 1.0.0
|
||||
// @Date: 2021/9/15 9:00 下午
|
||||
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
||||
//
|
||||
package main
|
||||
|
||||
import "C"
|
||||
import (
|
||||
"github.com/urfave/cli/v2"
|
||||
"ip-tunnel/iptun"
|
||||
"ip-tunnel/iptun/min"
|
||||
"minlib/common"
|
||||
"os"
|
||||
)
|
||||
|
||||
// StartIPTunnel 启动 IP Tunnel
|
||||
//
|
||||
// @Description:
|
||||
// @param ipTunnelConfig
|
||||
//
|
||||
func StartIPTunnel(ipTunnelConfig *iptun.IPTunnelConfig) {
|
||||
ipTun, err := iptun.NewIPTun(iptun.Config{
|
||||
InterfaceName: ipTunnelConfig.TunConfig.InterfaceName,
|
||||
IPv4Addr: ipTunnelConfig.TunConfig.IPv4Addr,
|
||||
MTU: ipTunnelConfig.TunConfig.Mtu,
|
||||
Mask: ipTunnelConfig.TunConfig.Mask,
|
||||
Route: ipTunnelConfig.TunConfig.Route,
|
||||
})
|
||||
|
||||
// 创建一个 MIN 隧道适配器
|
||||
minAdapter, err := min.NewMINTunnelAdapter(ipTunnelConfig)
|
||||
if err != nil {
|
||||
common.LogFatal(err)
|
||||
}
|
||||
|
||||
// 启动IP隧道程序
|
||||
ipTun.StartTunnel(minAdapter)
|
||||
}
|
||||
|
||||
const defaultConfigFilePath = "/usr/local/etc/mir/iptunconf.ini"
|
||||
|
||||
func main() {
|
||||
var configFilePath string
|
||||
mirApp := cli.NewApp()
|
||||
mirApp.Name = "miniptunnel"
|
||||
mirApp.Usage = " A IP tunnel over MIN "
|
||||
mirApp.Flags = []cli.Flag{
|
||||
&cli.StringFlag{
|
||||
Name: "f",
|
||||
Value: defaultConfigFilePath,
|
||||
Usage: "Config file path for MIR",
|
||||
Destination: &configFilePath,
|
||||
Required: true,
|
||||
},
|
||||
}
|
||||
mirApp.Action = func(context *cli.Context) error {
|
||||
ipTunnelConfig, err := iptun.ParseConfig(configFilePath)
|
||||
if err != nil {
|
||||
common.LogFatal(err)
|
||||
}
|
||||
|
||||
// 初始化日志模块
|
||||
var loggerParameters common.LoggerParameters
|
||||
loggerParameters.LogLevel = ipTunnelConfig.LogConfig.LogLevel
|
||||
loggerParameters.ReportCaller = true
|
||||
common.InitLogger(&loggerParameters)
|
||||
StartIPTunnel(ipTunnelConfig)
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := mirApp.Run(os.Args); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
//
|
||||
// @Author: Wei Guohua
|
||||
// @Description:
|
||||
// @Version: 1.0.0
|
||||
// @Date: 2021-02-03 09:13
|
||||
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
||||
//
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "bridge.h"
|
||||
#include "mNetIO.h"
|
||||
|
||||
static MNetIO mNetIO ;
|
||||
|
||||
int sendInterest(char *buf, int size, char *name){
|
||||
return mNetIO.sendInterest(buf, size, name) ;
|
||||
}
|
||||
int start(char *buf, int size){
|
||||
char prefix[2000] ;
|
||||
memcpy(prefix, buf, size) ;
|
||||
prefix[size] = 0;
|
||||
return mNetIO.start(buf) ;
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// @Author: Wei Guohua
|
||||
// @Description:
|
||||
// @Version: 1.0.0
|
||||
// @Date: 2021-02-03 09:13
|
||||
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
||||
//
|
||||
#ifndef _BRIDGE_H_
|
||||
#define _BRIDGE_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int sendInterest(char *buf, int size, char *name) ;
|
||||
int start(char *buf, int size) ;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,25 @@
|
||||
//
|
||||
// @Author: Wei Guohua
|
||||
// @Description:
|
||||
// @Version: 1.0.0
|
||||
// @Date: 2021-02-03 09:13
|
||||
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
||||
//
|
||||
#ifndef _COMMON_H_
|
||||
#define _COMMON_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//void OnData(char*);
|
||||
void GoOnData(char *buf, int size) ;
|
||||
void GoOnInterest(char *buf, int size) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,94 @@
|
||||
//
|
||||
// @Author: Wei Guohua
|
||||
// @Description:
|
||||
// @Version: 1.0.0
|
||||
// @Date: 2021-02-03 09:13
|
||||
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
||||
//
|
||||
#include <iostream>
|
||||
#include "mNetIO.h"
|
||||
#include "common.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
//void GoOnData(char *buf, int size) ;
|
||||
//void GoOnInterest(char *buf, int size) ;
|
||||
|
||||
MNetIO::MNetIO (){
|
||||
}
|
||||
MNetIO::~MNetIO (){
|
||||
|
||||
}
|
||||
int MNetIO::sendInterest(char *buf, int size, char *name) {
|
||||
static uint64_t interestSeq = 0;
|
||||
Name interestName(name) ;
|
||||
interestName.appendSequenceNumber(interestSeq++);
|
||||
Interest interest(interestName);
|
||||
interest.setInterestLifetime(4_s);
|
||||
// interest.setMustBeFresh(true);
|
||||
interest.setApplicationParameters((const uint8_t*)buf, size);
|
||||
// mKeyChain.sign(interest) ;
|
||||
mFace.expressInterest(interest,
|
||||
bind(&MNetIO::onData, this, _1, _2),
|
||||
bind(&MNetIO::onNack, this, _1, _2),
|
||||
bind(&MNetIO::onTimeout, this, _1));
|
||||
mFace.removeAllPendingInterests();
|
||||
// std::cout << "send interest : " << interestSeq << std::endl;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
void MNetIO::onData(const Interest& interest, const Data& data){
|
||||
// std::cout << "onData : " << std::endl;
|
||||
}
|
||||
|
||||
void MNetIO::onNack(const Interest& interest, const lp::Nack& nack){
|
||||
// std::cout << "onNack : " << nack.getReason() << std::endl;
|
||||
}
|
||||
|
||||
|
||||
void MNetIO::onTimeout(const Interest& interest){
|
||||
// std::cout << "onTimeout : " << interest << std::endl;
|
||||
}
|
||||
|
||||
int MNetIO::start(char *prefix) {
|
||||
mFace.setInterestFilter(prefix,
|
||||
bind(&MNetIO::onInterest, this, _1, _2),
|
||||
RegisterPrefixSuccessCallback(),
|
||||
bind(&MNetIO::onRegisterFailed, this, _1, _2));
|
||||
mFace.processEvents(ndn::time::milliseconds::zero(), true) ;
|
||||
return -1 ;
|
||||
}
|
||||
|
||||
void MNetIO::onInterest(const InterestFilter& filter, const Interest& interest){
|
||||
char buf[9000];
|
||||
if(!interest.hasApplicationParameters() ||
|
||||
interest.getApplicationParameters().value_size() <= 0) return ;
|
||||
int payloadSz = interest.getApplicationParameters().value_size();
|
||||
memcpy(buf, interest.getApplicationParameters().value(), payloadSz);
|
||||
string tmp(buf, payloadSz) ;
|
||||
//onInterest(buf, payloadSz) ;
|
||||
GoOnInterest(buf, payloadSz);
|
||||
|
||||
// Create Data packet
|
||||
auto data = make_shared<Data>(interest.getName());
|
||||
data->setFreshnessPeriod(0_s);
|
||||
|
||||
string dsha = "id:/localhost/identity/digest-sha256";
|
||||
ndn::security::SigningInfo si(dsha);
|
||||
// Sign Data packet with default identity
|
||||
mKeyChain.sign(*data, si);
|
||||
// m_keyChain.sign(*data, signingByIdentity(<identityName>));
|
||||
// m_keyChain.sign(*data, signingByKey(<keyName>));
|
||||
// m_keyChain.sign(*data, signingByCertificate(<certName>));
|
||||
// m_keyChain.sign(*data, signingWithSha256());
|
||||
// Return Data packet to the requester
|
||||
// std::cout << "<< D: " << *data << std::endl;
|
||||
mFace.put(*data);
|
||||
}
|
||||
void MNetIO::onRegisterFailed(const Name& prefix, const std::string& reason) {
|
||||
std::cerr << "ERROR: Failed to register prefix \""
|
||||
<< prefix << "\" in local hub's daemon (" << reason << ")"
|
||||
<< std::endl;
|
||||
mFace.shutdown();
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
//
|
||||
// @Author: Wei Guohua
|
||||
// @Description:
|
||||
// @Version: 1.0.0
|
||||
// @Date: 2021-02-03 09:13
|
||||
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
||||
//
|
||||
#ifndef _MNETIO_H_
|
||||
#define _MNETIO_H_
|
||||
#include <ndn-cxx/face.hpp>
|
||||
#include <iostream>
|
||||
#include <deque>
|
||||
using namespace std ;
|
||||
using namespace ndn ;
|
||||
|
||||
class MNetIO
|
||||
{
|
||||
public:
|
||||
MNetIO ();
|
||||
~MNetIO ();
|
||||
int sendInterest(char *buf, int size, char* name) ;
|
||||
int start(char *prefix) ;
|
||||
|
||||
private:
|
||||
void onInterest(const InterestFilter& filter, const Interest& interest);
|
||||
void onRegisterFailed(const Name& prefix, const std::string& reason);
|
||||
|
||||
void onData(const Interest& interest, const Data& data);
|
||||
void onNack(const Interest& interest, const lp::Nack& nack);
|
||||
void onTimeout(const Interest& interest);
|
||||
private:
|
||||
Face mFace;
|
||||
KeyChain mKeyChain;
|
||||
/* data */
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,130 @@
|
||||
// Package main
|
||||
// @Author: Jianming Que
|
||||
// @Description:
|
||||
// @Version: 1.0.0
|
||||
// @Date: 2021/9/21 5:58 下午
|
||||
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
||||
//
|
||||
package main
|
||||
|
||||
/*
|
||||
#cgo CXXFLAGS: -std=c++14
|
||||
#cgo LDFLAGS: -lpthread -ljsoncpp -lpcap -lndn-cxx -lboost_system -lboost_thread -lcrypto
|
||||
#include "bridge.h"
|
||||
#include "common.h"
|
||||
*/
|
||||
import "C"
|
||||
import (
|
||||
"github.com/songgao/water/waterutil"
|
||||
"github.com/urfave/cli/v2"
|
||||
"ip-tunnel/iptun"
|
||||
"ip-tunnel/iptun/ndn"
|
||||
"minlib/common"
|
||||
"os"
|
||||
"strconv"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var ipTun iptun.IPTun
|
||||
var adapter ndn.NDNTunnelAdapter
|
||||
|
||||
//export GoOnData
|
||||
func GoOnData(cstr *C.char, size C.int) {
|
||||
//fmt.Println("GoOnData")
|
||||
}
|
||||
|
||||
//export GoOnInterest
|
||||
func GoOnInterest(cstr *C.char, size C.int) {
|
||||
// 接收到兴趣包,提取出其中携带的 IP 并传递给 adapter
|
||||
data := C.GoBytes(unsafe.Pointer(cstr), size)
|
||||
adapter.OnReceivePktFromNDN(&iptun.IPPacket{
|
||||
Src: waterutil.IPv4Source(data),
|
||||
Dst: waterutil.IPv4Destination(data),
|
||||
RawPackets: data,
|
||||
})
|
||||
}
|
||||
|
||||
//int sendInterest(char *buf, int size, char *name) ;
|
||||
func sendPacket(pkt []byte, name string) error {
|
||||
cstr := C.CString(name)
|
||||
C.sendInterest((*C.char)(unsafe.Pointer(&pkt[0])), C.int(len(pkt)), cstr)
|
||||
C.free(unsafe.Pointer(cstr))
|
||||
return nil
|
||||
}
|
||||
|
||||
// StartIPTunnel 启动 IP Tunnel
|
||||
//
|
||||
// @Description:
|
||||
// @param ipTunnelConfig
|
||||
//
|
||||
func StartIPTunnel(ipTunnelConfig *iptun.IPTunnelConfig) error {
|
||||
if err := ipTun.Init(iptun.Config{
|
||||
InterfaceName: ipTunnelConfig.TunConfig.InterfaceName,
|
||||
IPv4Addr: ipTunnelConfig.TunConfig.IPv4Addr,
|
||||
MTU: ipTunnelConfig.TunConfig.Mtu,
|
||||
Mask: ipTunnelConfig.TunConfig.Mask,
|
||||
Route: ipTunnelConfig.TunConfig.Route,
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
adapter.Init()
|
||||
|
||||
// 在单独的协程里面处理从TUN读取IP包,构造一个Interest并发出
|
||||
go func() {
|
||||
count := 0
|
||||
for {
|
||||
// 从 TUN 中读取IP包,并通过CPacket发出
|
||||
ipPacket := adapter.GetPktFromTun()
|
||||
sendPacket(ipPacket.RawPackets, ipTunnelConfig.TargetIdentifier+"/"+strconv.Itoa(count))
|
||||
count++
|
||||
}
|
||||
}()
|
||||
|
||||
// 在单独的协程里面处理接收兴趣包
|
||||
go func() {
|
||||
cstr := C.CString(ipTunnelConfig.MirConfig.ListenIdentifier)
|
||||
ret := C.start(cstr, C.int(len(ipTunnelConfig.MirConfig.ListenIdentifier)))
|
||||
C.free(unsafe.Pointer(cstr))
|
||||
if ret < 0 {
|
||||
common.LogFatal("start face fail")
|
||||
}
|
||||
}()
|
||||
// 启动IP隧道程序
|
||||
ipTun.StartTunnel(&adapter)
|
||||
return nil
|
||||
}
|
||||
|
||||
const defaultConfigFilePath = "/usr/local/etc/mir/iptunconf.ini"
|
||||
|
||||
func main() {
|
||||
var configFilePath string
|
||||
mirApp := cli.NewApp()
|
||||
mirApp.Name = "miniptunnel"
|
||||
mirApp.Usage = " A IP tunnel over MIN "
|
||||
mirApp.Flags = []cli.Flag{
|
||||
&cli.StringFlag{
|
||||
Name: "f",
|
||||
Value: defaultConfigFilePath,
|
||||
Usage: "Config file path for MIR",
|
||||
Destination: &configFilePath,
|
||||
Required: true,
|
||||
},
|
||||
}
|
||||
mirApp.Action = func(context *cli.Context) error {
|
||||
ipTunnelConfig, err := iptun.ParseConfig(configFilePath)
|
||||
if err != nil {
|
||||
common.LogFatal(err)
|
||||
}
|
||||
|
||||
// 初始化日志模块
|
||||
var loggerParameters common.LoggerParameters
|
||||
loggerParameters.LogLevel = ipTunnelConfig.LogConfig.LogLevel
|
||||
loggerParameters.ReportCaller = true
|
||||
common.InitLogger(&loggerParameters)
|
||||
return StartIPTunnel(ipTunnelConfig)
|
||||
}
|
||||
|
||||
if err := mirApp.Run(os.Args); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user