代码之家  ›  专栏  ›  技术社区  ›  HonanLi

为什么glibc2.23更改结构sockaddr\u存储?

  •  -1
  • HonanLi  · 技术社区  · 7 年前

    https://patchwork.sourceware.org/patch/12453/ . 这一修改似乎解决了特定平台上的一个问题。 我现在开发的高通平台有很多类型,如下所示。

    struct sockaddr_storage prefix_addr
    
    (struct sockaddr_in6 *)&(prefix_addr)->sin6_addr.s6_addr 
    

    struct sockaddr_in6
    {
        sin6_family;   //0th byte
        sin6_port;     //2nd byte
        sin6_flowinfo; //4th byte
        sin6_addr;     //8th byte
    };
    
    
    struct sockaddr_storage
    {
        ss_family;    //0th byte
        __ss_align;   //4th byte
        __ss_padding; //8th byte
    };
    

    struct sockaddr_storage
    {
        ss_family;    //0th byte
        __ss_padding; //2nd byte
        __ss_align;   //124th byte
    };
    

    glibc更改了struct sockaddr\u存储,但struct sockaddr\u in6没有更改,因此此修改将在我们的平台上导致许多对齐问题,从而导致获取IPV6地址的错误。

    2 回复  |  直到 7 年前
        1
  •  1
  •   HonanLi    7 年前

    请参阅Florian的回复:

    2017年1月9日下午12:07,李写道:

    定义SASTORAGE_DATA(addr)(addr)__ss_填充

    布尔前缀info_有效; 无符号整数mtu; 结构ifa\u cacheinfo cache\u info; }qcmap\u cm\u nl\u prefix\u info\u t;

    *ipv6\u prefix\u info) {

    ...

    sin6=(struct sockaddr\u in6*)&ipv6\u prefix\u info->前缀地址; memcpy(SASTORAGE\u DATA(ipv6\u prefix\u info->prefix\u addr), sizeof(sin6->sin6_addr)); }

    https://github.com/Bigcountry907/HTC_a13_vzw_Kernel/blob/master/vendor/qcom/proprietary/data/mobileap_v2/server/src/QCMAP_ConnectionManager.cpp#L3658

    结构sockaddr_in 6 sin6;memset(&sin6,0,sizeof(sin6));
    sin6.sin6_族=AF_INET6;memcpy(&sin6.sin6\u addr,RTA\u DATA) (rta),sizeof(sin6.sin6_addr));memcpy公司 (&ipv6\u prefix\u info->prefix\u addr,&sin6,sizeof(sin6));

    这避免了任何别名问题和对 具有足够大小和对齐方式的通用结构sockaddr)。它也 初始化套接字地址的其他组件(例如 端口号和流量标签)。

    谢谢,弗洛里安

    https://books.google.com.hk/books?id=ptSC4LpwGA0C&pg=PA72&lpg=PA72&dq=alignment+sufficient&source=bl&ots=Kt0BQhjiMt&sig=HTUbm2bzVNSoMxNX98EMzORFc30&hl=zh-CN&sa=X&ved=0ahUKEwiP78iMoovWAhVLipQKHYFdCxcQ6AEIQzAF#v=onepage&q=alignment%20sufficient&f=false

        2
  •  0
  •   Alexandre Fenyo    7 年前

    我不确定这是glibc中生成对齐警告的更改:此更改对您显示的源代码没有影响。

    相反,我认为高通公司正在使用clang,从clang 4开始。x、 我看到了一个新的对齐警告 关于对齐的警告,取决于您编写代码的方式: -Waddress-of-packed-member .

    使用临时变量会使这些警告消失。

    my_function(((struct sockaddr_in6 *)&prefix_addr)->sin6_addr.s6_addr)
    

    只需写下:

    struct sockaddr_in6 p = *(struct sockaddr_in6 *) &prefix_addr;
    my_function(p.sin6_addr.s6_addr);