OpenDiameter 编译,安装,调试

OpenDiameter 编译,安装,调试

OpenDiameter安装指南

关于Diameter,请参照 rfc3588 和 rfc4006。OpenDiameter是实现Diameter协议的开源软件,通常需要我们自己编译运行,

从README下看可能觉得较为简易,但实际操作时远非易事。下面是我编译的过程及遇到的一些问题以及对应的解决办法。


1,软件包下载及安装过程
  
OpenDiameter的编译依赖下面几个软件包:
GUN g++
OpenSSL
ACE      
BOOST
autoconf/automake/libtool
OpenDiameter

a, OpenSSL
     下载网址: http://www.openssl.org/source/
     版本号:openssl-0.9.8g
     安装方法:cd $OpenSSL_DIR; sudo make; sudo make install
     结果:自动安装到 /usr/local/ssl 目录下
     描述: OpenSSL的编译方法和其它稍不一样,不用执行./Configure, 直接Make就行。

b, ACE
     下载网址:http://www.cs.wustl.edu/%7Eschmidt/ACE.html
     版本号:ACE-5.7.5
     安装方法:cd $ACE_Wappe; mkdir build; cd build; sudo ../configure; sudo make; sudo make install
     描述:ACE库编译时出现一些问题,后面有详述。另外,安装到系统目录比较凌乱,建议如下下次编译时,指定安装目

录。sudo ../configure --prefix=ACE。

c, BOOST
     下载网址:http://www.boost.org/
     版本号:boost_1_41_0
     安装方法:sudo apt-get install libboost-dev
     描述:并不需要自己主动安装,采用apt-get方法就行。
  
d, autoconf/automake/libtool
     安装方法:sudo apt-get install autoconf automake libtool
     描述:目前仍不知道该工具做什么用的,有TX知道的可以补充

e, OpenDiameter
     预置条件:设置 BOOST_ROOT与ACE_ROOT环境变量。export ACE_ROOT=/usr/local,export BOOST_ROOT=/usr/include
     下载网站:www.OpenDiameter.org 或者 http://sourceforge.net/projects/diameter/files/
     版本号:opendiameter-1.0.7-i
     安装方法:cd $OpenDiameter_Dir; mkdir build; cd build; sudo ../configure; sudo make; sudo make install
     描述:下载过程中出现许多问题,后面有详述。

2,编译安装过程中出现的问题及解决办法。

a, opendiameter下载问题

     当时opendiameter的官方网站不能访问,曾试过以下几个办法,花费了几天的时间,
     (1) google中搜索:但发现pudn等网站是要收费的 [未解决]
     (2) 在bbs中询问。得到http://sourceforge.net/projects/diameter/files/下载网站。[解决]
     (3) 找曾开发过的diameter的经验工程师。无果。[未解决]
    
     从上面来看,从BBS上报告问题应该是一个好的办法,尽管会有一些延迟,但通常能得到一些好的建议。

b, openssl版本较老

     80%错误都是与openssl有关,一方面旧的openssl是安装在/opt目录下,另一方面openssl太老了。导致了一系列的问题

,之后更新了openssl后,问题减少了许多。
    
     当时colinux下安装的openssl较老,在编译生成.so时,拷贝了较新的header文件,但后来libssl.a库文件中找不到

AES_encrypt/AES_set_encrypt_key函数,事后更新openssl库文件后,问题解决了。

     错误提示:undefined reference to `AES_set_encrypt_key'

c, -lssl 找不到
    
     这个主要是由于libssl.a的文件目录路径设置不当,将/usr/local/ssl/lib加入到-L中就好了。

d, libACE_SSL.so 找不到通常的SSL_CTX_free函数等

     这个目前仍不明白为什么,实际上libssl.a已经加入到可搜索到路径中,在LIBS中增加如下一行后,问题就解决了
     LIBS = -lrt -ldl /usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a

e, 在文件中aaa_transport_ace.h:field 'm_SigRegistrar' has incomplete type

     解决办法:在aaa_transport_ace.h增加如下header文件 #include "ace/Sig_Handler.h"

f, 在文件中pana_serial_num.h:no matching function for get_local_system_time(ACE_UINT32&)

     解决办法:主要是ACE_UINT32和time_t的转换有困难

g, ACE_ROOT与BOOST_ROOT 已经配置了,但还是提示找不到
    
     解决办法:直接在./configure中hardcode了ACE_ROOT与BOOST_ROOT

3, 参考资料
      

http://www.freesoftwaremagazine.com/community_posts/my_opendiameter_experience_part_i_build_and_installation

http://www.opendiameter.org

http://www.boost.org/

http://www.openssl.org/source/

http://www.cs.wustl.edu/%7Eschmidt/ACE.html

http://sourceforge.net/projects/diameter/files/

http://www.shakthimaan.com/installs/opendiameter.html

4, 在编译安装调试过程中常用的命令

   find . -name [filetype] | xargs grep [keyword] 查找文件中内容
   nm libxxx.a/libxxx.so | grep [keyword]     查看库文件中的函数
   apt-get install [package]

5, 关于OpenDiameter的运行

    目前OpenDiameter比较好的提供了测试用例。在实际运行过程中可能会产生如下错误:

    >>>> SAX Parsing exception: Failed to open XML file

    尽管实际上服务端的xml路径及文件都没有问题,此时需要修改代码来解决该BUG,具体修改od_utl_xml_sax_parser.h和od_utl_xml_sax_parser.cxx中的characters函数接口,将其int修改成size_t的数据类型,重新编译,此问题就可以解决。

    a, 在/etc/hosts中增加如下两行:

127.0.0.1       localaaa        localaaa.localdomain1.net
127.0.0.1       localnas        localnas.localdomain2.net

    b, 拷贝修改过的配置目录到aaa_test_client1和aaa_test_server1所在的目录下。

    c, 运行它们

       ./aaa_test_server1

       ./aaa_test_client1 config/nas1.local.xml 3
  

6,下面是实际在编译过程中出现的错误及解决办法


In file included from ../../../ace/SSL/SSL_Asynch_BIO.cpp:3:
../../../ace/SSL/SSL_Asynch_BIO.h:29:25: error: openssl/bio.h: No such file or directory
make[3]: *** [libACE_SSL_la-SSL_Asynch_BIO.lo] Error 1
make[3]: Leaving directory `/home/tomtan/share-dir/ACE_wrappers/build/ace/SSL'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/tomtan/share-dir/ACE_wrappers/build/ace'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/home/tomtan/share-dir/ACE_wrappers/build/ace'
make: *** [all-recursive] Error 1

====== 解决办法:将SSL_Asynch_BIO.h文件中的 #include <openssl/bio.h> 修改为 #include <ssl/include/bio.h>

g++ -W -Wall -Wpointer-arith -g -O2 -pipe -O3 -o .libs/client client-SSL-client.o -pthread

../../../ace/SSL/.libs/libACE_SSL.so /home/tomtan/share-dir/ACE_wrappers/build/ace/.libs/libACE.so

../../../ace/.libs/libACE.so -lrt -ldl -Wl,--rpath -Wl,/usr/local/lib
client-SSL-client.o: In function `ACE_SSL_SOCK_Stream::close()':
/home/tomtan/share-

dir/ACE_wrappers/build/examples/IPC_SAP/SSL_SAP/../../../../ace/SSL/SSL_SOCK_Stream.inl:285: undefined

reference to `SSL_shutdown'
/home/tomtan/share-

dir/ACE_wrappers/build/examples/IPC_SAP/SSL_SAP/../../../../ace/SSL/SSL_SOCK_Stream.inl:287: undefined

reference to `SSL_get_error'
client-SSL-client.o: In function `ACE_SSL_SOCK_Stream::recv_i(void*, unsigned int, int, ACE_Time_Value

const*) const':

====== 解决方法是,在openssl的编译环境下找到libssl.a、libcrypto.a,让编译程序连接进去。 具体操作是
编辑 /ace- 5.5/ACE_wrappers/build/examples/IPC_SAP/SSL_SAP/Makefile和
/ace- 5.5/ACE_wrappers/build/tests/SSL/Makefile这两个文件,在里面找到"LIBS = -lrt -ldl" 这一项,将其修改为:
LIBS = -lrt -ldl /usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a
然后继续编译。问题即可解决。


configure: error: ACE_ROOT not defined, you MUST install ACE or set ACE_ROOT if already installed
tomtan@mycolinux:~/share-dir/opendiameter-1.0.7-i/build$ echo $ACE_ROOT /usr/local

====== 解决办法:在./configure中 hardcode $ACE_ROOT 和 $BOOST_ROOT


In file included from ../../libodutl/include/od_utl_xml_sax_parser.h:42,
                 from ../../libodutl/src/od_utl_xml_sax_parser.cxx:36:
/usr/local/include/ACEXML/parser/parser/Parser.h:28:25: error: ace/Obstack.h: No such file or directory

====== 解决办法:将源文件目录中的Obstack.h拷贝到系统目录中


g++ -g -O2 -o parser_test1 test/aaa_test1.o -L/usr/local/ace /opt/openssl-0.9.6g/lib/libssl.a /opt/openssl-

0.9.6g/lib/libcrypto.a -lACE_SSL -lACE -lACEXML -lACEXML_Parser ../libdiamparser/.libs/libdiamparser.a
/usr/local/lib/libACE_SSL.so: undefined reference to `SSL_CTX_free'
/usr/local/lib/libACE_SSL.so: undefined reference to `SSLv23_client_method'
/usr/local/lib/libACE_SSL.so: undefined reference to `BIO_ctrl'

====== 解决办法:参照前面


../../libdiameter/include/aaa_transport_ace.h:276: error: field 'm_SigRegistrar' has incomplete type

===== 解决办法:Modify opendiameter-1.0.7-i/libdiameter/include/aaa_transport_ace.h. Add the following:
#include "ace/Sig_Handler.h"


g++ -g -O2 -o aaa_test_client1 test/test_client1.o -L/usr/local/ace ../libdiameter/.libs/libdiameter.a

../libdiamparser/.libs/libdiamparser.a ../libodutl/.libs/libodutl.a -lssl -lcrypto -lACE_SSL -lACE -lACEXML

-lACEXML_Parser
/usr/bin/ld: cannot find -lssl
collect2: ld returned 1 exit status
make[1]: *** [aaa_test_client1] Error 1
make[1]: Leaving directory `/home/tomtan/share-dir/opendiameter-1.0.7-i/build/libdiameter'
make: *** [all-recursive] Error 1

===== 解决办法:增加-L部分如下: -L/usr/local/ace -L/usr/local/ssl/lib

../../libeap/include/eap_archie_crypto.hxx:112: error: 'AES_encrypt' was not declared in this scope

===== 解决办法:更新openssl库

/bin/sh ../libtool --tag=CXX --mode=link g++ -g -O2 -L/usr/local/ace -o archie_test tests/archie_test.o -

lACE_SSL -lACE -lACEXML -lACEXML_Parser ../libeap/libeap.la ../libeap/libeaparchie.la -lrt -ldl /opt/openssl

-0.9.6g/lib/libssl.a /opt/openssl-0.9.6g/lib/libcrypto.a
g++ -g -O2 -o archie_test tests/archie_test.o -L/usr/local/ace -lACE_SSL -lACE -lACEXML -lACEXML_Parser

../libeap/.libs/libeap.a ../libeap/.libs/libeaparchie.a -lrt -ldl /opt/openssl-0.9.6g/lib/libssl.a

/opt/openssl-0.9.6g/lib/libcrypto.a
../libeap/.libs/libeaparchie.a(eap_archie_fsm.o): In function `EapCryptoAES_CBC_MAC::operator()

(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char,

std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>,

std::allocator<char> >&, EapCryptoAES_CBC_MAC::MAC_LengthType)':
eap_archie_fsm.cxx:(.text._ZN20EapCryptoAES_CBC_MACclERSsS0_S0_NS_14MAC_LengthTypeE

[EapCryptoAES_CBC_MAC::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&,

std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char,

std::char_traits<char>, std::allocator<char> >&, EapCryptoAES_CBC_MAC::MAC_LengthType)]+0x42): undefined

reference to `AES_set_encrypt_key'
eap_archie_fsm.cxx:(.text._ZN20EapCryptoAES_CBC_MACclERSsS0_S0_NS_14MAC_LengthTypeE

[EapCryptoAES_CBC_MAC::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&,

std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char,

std::char_traits<char>, std::allocator<char> >&, EapCryptoAES_CBC_MAC::MAC_LengthType)]+0xec): undefined

reference to `AES_encrypt'
collect2: ld returned 1 exit st

===== 解决办法:同上面,更新openssl


../../libpana/include/pana_serial_num.h:208: error: no matching function for call to

'ACE_System_Time::get_local_system_time(ACE_UINT32&)'

===== 解决办法:在pana_serial_num.h文件的修改如下行
                time_t tempT = 0;
                ACE_System_Time::get_local_system_time(tempT);
                seed = (ACE_UINT32)tempT;
   


你可能感兴趣的:(OpenDiameter 编译,安装,调试)