protocol isis issues(续1)

来源:互联网 发布:手机淘宝充值怎么退款 编辑:程序博客网 时间:2024/04/30 10:17

在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

intisis_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;    }    ...}
0 0
原创粉丝点击