在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;
}
...
}