protocol isis issues(续1)

在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;
    }
    ...
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值