2014-09-02 71 views
0

我尝试使用setsockopt函数向接口的多播地址列表添加一个地址,但使用errno EINVAL失败。我把一些的printk在内核代码和它看起来像错误号最终被内核packet_setsockopt功能,因为通过了optlen值小于packet_mreq结构的大小设置。对于我的生活,我无法弄清楚为什么会发生这种情况。下面是相关代码:setsockopt为什么返回EINVAL?

您的括号
int addMulticastAddress(int ifindex, unsigned char macaddr[6]) { 

    struct packet_mreq mreq; 
    int fd; 
    int ret = -1; 


    if ((fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) { 
     return -1; 
    } 

    memset(&mreq, 0, sizeof(struct packet_mreq)); 
    mreq.mr_ifindex = ifindex; 
    mreq.mr_type = PACKET_MR_MULTICAST; 
    memcpy(mreq.mr_address, macaddr, 6); 
    mreq.mr_alen = 6; 

    if (setsockopt(fd, SOL_PACKET, 
        PACKET_ADD_MEMBERSHIP, 
        &mreq, sizeof(struct packet_mreq) < 0)) { 
     virReportSystemError(errno, 
          _("Failed to %s %s %s multicast list for '%s' interface"), 
          add ? "add" : "delete", 
          virMacAddrFormat(macaddr, macstr), 
          add ? "to" : "from", ifname); 
     goto cleanup; 
    } 

    ret = 0; 

cleanup: 
    close(fd); 
    return ret; 
} 

回答

1

一个是在错误的地方:

if (setsockopt(fd, SOL_PACKET, 
    PACKET_ADD_MEMBERSHIP, 
    &mreq, sizeof(struct packet_mreq) < 0)) { 

应该是:

if (setsockopt(fd, SOL_PACKET, 
    PACKET_ADD_MEMBERSHIP, 
    &mreq, sizeof(struct packet_mreq)) < 0) { 
+0

谢谢,大有赶超!你救了我几根头发。 – 2014-09-03 12:31:26