ofp segment fault的原因

1. 创建线程不要直接用pthread_create,而要用odph_odpthreads_create。
2. 每个线程函数的开始处都要调用ofp_init_local初始化。
3. 之前调用系统socket和epoll之类的函数都要替换成ofp定义的,包括宏和结构体。如

1
2
//	sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	sock = ofp_socket(OFP_AF_INET, OFP_SOCK_STREAM, OFP_IPPROTO_TCP);

ofp中的慢平面

默认编译OpenFastPath时慢平面是启用的,慢平面的功能之一是通过netlink方式向内核查询路由表,这是用内核公开的接口,不需要另开发内核驱动。

慢平面的一个局限,比方电脑只有一张网卡,而这块网卡已被dpdk绑定,网络包就不会在内核中被解析,此时慢平面的路由功能也就无效,所以干脆通过

1
./configure ... --enable-sp=no

将慢平面功能去掉。

而此时我们跑在ofp上的应用就没有路由表了么?
不是的。首先应用的本机ip地址是通过

1
myApp -i 0 -f ofp.cli

中的ofp.cli配置的。如

1
2
3
debug 0
loglevel set debug
ifconfig fp0 192.168.56.33/24

中的192.168.56.33就是本机地址。
而通过arp协议获取其它机器ip与mac关系的路由表是由

1
	ofp_start_cli_thread(instance, app_init_params.linux_core_id, params.cli_file);

这个线程在dpdk绑定的网卡上进行解析维护。

一个很好的例子就是ofp/example/webserver。

ofp和dpdk都可完全编译成静态库运行,不要为了LD_PRELOAD的那一点便利一门心思去编译出动态库。在自已的源码中加一层宏翻译,静态库与epoll api兼容性也很好。

github上的odp与dpdk-odp的区别是前者现在只包含了odp-linux,一种对linux系统api的包装,后者是对dpdk的包装,所以高性能选后者。原话见
doc/users-guide/users-guide.adoc

refer to:
https://github.com/OpenFastPath/ofp
https://github.com/OpenDataPlane/odp-dpdk
https://my.oschina.net/u/4361425/blog/3269917

odp禁止ipsec

1
2
3
4
5
6
7
8
9
10
11
12
13
	odp_init_t init_param;
 
	odp_init_param_init(&init_param);
	init_param.not_used.feat.ipsec = 1;
	init_param.not_used.feat.crypto = 1;
	init_param.not_used.feat.compress = 1;
	init_param.not_used.feat.tm = 1;
 
	if (0 != odp_init_global(&instance, &init_param, NULL))
	{
		DBG(("init odp global failed.\n"));
		return 0;
	}

5G备忘录

EPS中的PDN连接(搜不到原贴地址)
https://www.txrjy.com/thread-1134059-1-1.html

LTE基础知识概述
https://max.book118.com/html/2016/0706/47457520.shtm

MR数据应用
https://www.txrjy.com/thread-926805-1-1.html

LTEMR分析经验共享
https://www.docin.com/p-1543277673.html

FDD LTE无线网PCI和TA的设计
https://wenku.baidu.com/view/3a6903712e3f5727a5e96299.html

5G系统——5G QoS
https://blog.csdn.net/u010178611/article/details/81746532

5G边缘计算之会话及业务连续性(SSC)介绍
https://blog.csdn.net/openinfra/article/details/109812315

https://www.toutiao.com/article/7098596919232102949

Terms,

1
2
3
Turbo码
LDPC码
Polar code极化码,Erdal Arıkan

OpenCV备忘录

mat的遍历方法
refer to: https://blog.csdn.net/koibiki/article/details/85954121

如何使用opencv给视频添加水印并保存
refer to: https://blog.csdn.net/weixin_44903147/article/details/102969715

bool solvePnP(InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec, bool useExtrinsicGuess=false, int flags=ITERATIVE )

objectPoints为特征点的世界坐标,特征点通常为4个,坐标值需为float型,不能为double型,可以输入mat类型,也可以直接输入vector
imagePoints为特征点在图像中的坐标,需要与前面的输入一一对应。同样可以输入mat类型,也可以直接输入vector
cameraMatrix为相机内参数矩阵,大小为3×3。事先通过OpenCV自带例程求出相机标定参数。
distCoeffs输入为相机的畸变参数,为1×5的矩阵。事先通过OpenCV自带例程求出相机标定参数。
rvec输出解得的旋转向量。
tvec输出平移向量。
useExtrinsicGuess为true后似乎会对输出进行优化。
flags:
CV_ITERATIVE,默认值,它通过迭代求出重投影误差最小的解作为问题的最优解。
CV_P3P则是使用非常经典的Gao的P3P问题求解算法。
CV_EPNP使用文章《EPnP: Efficient Perspective-n-Point Camera Pose Estimation》中的方法求解。

//最小二乘法,解A*X=B中的X
bool cv::solve(InputArray A, InputArray B, OutputArray X, int flags = DECOMP_LU)

refer to:
https://www.cnblogs.com/singlex/p/pose_estimation_1.html
https://www.csdn.net/tags/NtTakgysNTA0NDQtYmxvZwO0O0OO0O0O.html

vmware linux共享文件夹未启动

1
2
3
sudo dnf install open-vm-tools-desktop
umount /mnt/hgfs
sudo /usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid=1000 -o gid=1000 -o umask=022

如果还不行,比如更新内核后,就要重新安装open-vm-tools。

refer to:
https://blog.csdn.net/xcyja/article/details/117328301

Windows平台下新的文件才拷贝

Linux下的cp -u能实现只在源文件比目标文件新时才拷贝,但此命令在MinGW下不好使,我通过在网上查方法,写了以下同样功能的脚本:

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
clearBinary()
{
	local destDir=$1
	local fileName=$2
	local ext=$3
 
	rm "${destDir}/${fileName}.${ext}" 1>/dev/null 2>&1
 
	for ((j = 1; j <= 20; j++)); do
		if [ -f "${destDir}/${fileName}_$j.${ext}" ] ; then
			rm "${destDir}/${fileName}_$j.${ext}"
		fi
	done
 
	for ((j = 1; j <= 20; j++)); do
		if [ -f "${destDir}/${fileName}.${ext}" ] ; then
			mv "${destDir}/${fileName}.${ext}" "${destDir}/${fileName}_$j.${ext}"
		fi
	done
}
 
copyFile()
{
	local srcDir=$1
	local destDir=$2
	local fileName=$3
	local ext=$4
 
	local srcPath=${srcDir}/${fileName}.${ext}
	local destPath=${destDir}/${fileName}.${ext}
 
	if [ ! -f "${srcPath}" ] ; then
		return
	fi
 
	local timeFrom=`stat -c %Y "${srcPath}"`
	local timeTo=`stat -c %Y "${destPath}"`
	if [ "$timeFrom" = "$timeTo" -a "x$forceReplace" != "xforce" ]; then
		return
	fi
 
	clearBinary "${destDir}" ${fileName} ${ext}
 
	cp "${srcPath}" "${destPath}"
 
	local timeFromStr=`date -d "@$timeFrom" "+%Y-%m-%d %H:%M:%S"`
	touch -m -d "$timeFromStr" "${destPath}"
 
	echo "[${srcPath}]->[${destPath}] copied."
}
 
copyFile /e/source /c/dest hello docx

EuhatGift发布

我写的一个开源的工具库,地址:https://github.com/euhat/EuhatGift
现在包含功能:

  • Boost库里的json文件操作接口非常适合于写业务代码,但该库会把数字写成数字字符串,这是有问题的。再考虑性能及各种语言编码的兼容性,我写了一个cJSON库的c++包装类,接口类似于Boost,名叫CjsonWrapper。
  • Windows的GetPrivateProfileStringA函数要预定义接收值的Buffer大小,这是有缺点的,这会造成我们读取的值可能只读了一半我们却没有办法。我于是重写了ini操作相关的函数库,名叫IniOp,C语言风格,跨平台。

gtk user control自绘控件

ubuntu下gtk库是默认已安装的,开发部署很方便,以下是我写的自绘控件例子:

EuhatChildWnd.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
 
struct _cairo_surface;
struct _GtkWidget;
 
class EuhatChildWnd
{
public:
	EuhatChildWnd(int width, int height);
	~EuhatChildWnd();
 
	void clear();
	void drawBrush(struct _GtkWidget *widget, double x, double y);
 
	struct _GtkWidget *drawingArea_;
	struct _cairo_surface *surface_;
 
	double xFrom_;
	double yFrom_;
};

Read more

ntoskrnl.ExiAcquireFastMutex HAL.dll

在32位Win7操作系统里,运行引用我们编的动态库的应用程序,报如下错误:

无法定位程序输入点 ntoskrnl.ExiAcquireFastMutex 于动态链接库 HAL.dll 上。

用Dependency Walker查看我们编的动态库,发现引用了ntoskrnl.exe,猜测在旧有的32位win32环境中是不会从dll中去引用别的exe的。只有在64位win32环境中才会存在从dll中去引用ntoskrnl.exe。

32位动态库编译的解决办法:
链接器->输入->附加依赖项去除ucrt.lib和wdm.lib。
链接器->输入->忽略所有默认库设为否。
链接器->高级->入口点清空。