Changeset 4600

Show
Ignore:
Timestamp:
11/07/08 04:38:56 (2 months ago)
Author:
andreas
Message:

SADB_X_EXT_KMADDRESS is not present in old kernels

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/charon/plugins/kernel_pfkey/kernel_pfkey_ipsec.c

    r4599 r4600  
    835835{ 
    836836    pfkey_msg_t response; 
    837     sockaddr_t *local_addr, *remote_addr; 
    838837    traffic_selector_t *src_ts, *dst_ts; 
    839838    policy_dir_t dir; 
    840     u_int32_t local_len, reqid = 0; 
    841     host_t *local, *remote
     839    u_int32_t reqid = 0; 
     840    host_t *local = NULL, *remote = NULL
    842841    job_t *job; 
    843842 
     
    851850    src_ts = sadb_address2ts(response.src); 
    852851    dst_ts = sadb_address2ts(response.dst); 
    853     local_addr  = (sockaddr_t*)&response.x_kmaddress[1]; 
    854     local = host_create_from_sockaddr(local_addr); 
    855     local_len = (local_addr->sa_family == AF_INET6)? 
    856                 sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in); 
    857     remote_addr = (sockaddr_t*)((u_int8_t*)local_addr + local_len); 
    858     remote = host_create_from_sockaddr(remote_addr); 
    859852    dir = kernel2dir(response.x_policy->sadb_x_policy_dir); 
    860853    DBG2(DBG_KNL, "  policy %R === %R %N, id %u", src_ts, dst_ts, 
    861854                     policy_dir_names, dir, response.x_policy->sadb_x_policy_id); 
    862     DBG2(DBG_KNL, "  kmaddress: %H...%H", local, remote); 
     855     
     856    /* SADB_X_EXT_KMADDRESS is not present in unpatched kernels < 2.6.28 */    
     857    if (response.x_kmaddress) 
     858    { 
     859        sockaddr_t *local_addr, *remote_addr; 
     860        u_int32_t local_len; 
     861 
     862        local_addr  = (sockaddr_t*)&response.x_kmaddress[1]; 
     863        local = host_create_from_sockaddr(local_addr); 
     864        local_len = (local_addr->sa_family == AF_INET6)? 
     865                    sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in); 
     866        remote_addr = (sockaddr_t*)((u_int8_t*)local_addr + local_len); 
     867        remote = host_create_from_sockaddr(remote_addr); 
     868        DBG2(DBG_KNL, "  kmaddress: %H...%H", local, remote); 
     869    } 
    863870     
    864871    if (src_ts && dst_ts)