您的位置:首页 > 产品设计 > UI/UE

protocol isis issues(续1)

2015-11-02 20:10 525 查看
在files-0(1)/var/log/*中的stdout中,打印quagga运行仿真的日志。

错误:

1. isis_pfpacket.c:130–open_packet_socket(): bind() failed: Invalid argument

2. isis_pfpacket.c:184–isis_sock_init: could not initialize the socket

错误1

memset (&s_addr, 0, sizeof (struct sockaddr_ll));
s_addr.sll_family = AF_PACKET;
s_addr.sll_protocol = htons (ETH_P_ALL);
s_addr.sll_ifindex = circuit->interface->ifindex;

if (bind (fd, (struct sockaddr *) (&s_addr),
sizeof (struct sockaddr_ll)) < 0)
{
zlog_warn ("open_packet_socket(): bind() failed: %s", safe_strerror (errno));
return ISIS_WARNING;
}


bind() -> dce_fd.cc:444(dce_bind) -> unix-socket-fd.cc:796(Bind)

-> unix-socket-fd.cc:698(PosixAddressToNs3Address)

地址转化,原程序中并没有对sa_family=AF_PACKET的处理。

添加的代码:

else if(my_addr->sa_family == AF_PACKET)
{
const struct sockaddr_ll *addr = (const struct sockaddr_ll *)my_addr;
PacketSocketAddress paaddress=PacketSocketAddress();
paaddress.SetProtocol(addr->sll_protocol);
paaddress.SetSingleDevice(addr->sll_ifindex);
Address address=Address(addr->sll_pkttype,addr->sll_addr,addr->sll_halen);
paaddress.SetPhysicalAddress(address);
return paaddress;
}


这段代码主要是把结构sockaddr_ll转化为类PacketSocketAddress的对象。其实就是把数据链路层(MAC)的地址转化为NS3中定义的地址。(详情见续1.2)

错误2

int
isis_sock_init (struct isis_circuit *circuit)
{
int retval = ISIS_OK;

if (isisd_privs.change (ZPRIVS_RAISE))
zlog_err ("%s: could not raise privs, %s", __func__, safe_strerror (errno));

retval = open_packet_socket (circuit);

if (retval != ISIS_OK)
{
zlog_warn ("%s: could not initialize the socket", __func__);
goto end;
}
...
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: