init update

This commit is contained in:
SunnyQjm committed 2021-09-22 10:12:52 +08:00
1 parent a9fb0727c6
commit 2ed23df9a0
15 files changed
+898

No files matched your search

+2
View File
@@ -0,0 +1,2 @@
.idea/
go.sum
+13
View File
@@ -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
View File
@@ -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()
}
+30
View File
@@ -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)
}
+78
View File
@@ -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
}
+116
View File
@@ -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
}
+55
View File
@@ -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
}
+21
View File
@@ -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
+77
View File
@@ -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
}
}
+24
View File
@@ -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) ;
}
+23
View File
@@ -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
+25
View File
@@ -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
+94
View File
@@ -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();
}
+37
View File
@@ -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
+130
View File
@@ -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
}
}