950 sizeof(uint64_t);
951 addr->sadb_address_exttype = SADB_EXT_ADDRESS_PROXY;
952 addr->sadb_address_proto =
953 pfkey_proto_from_xfrm(x->sel.proto);
954 addr->sadb_address_prefixlen = x->sel.prefixlen_s;
955 addr->sadb_address_reserved = 0;
956
957 pfkey_sockaddr_fill(&x->sel.saddr, x->sel.sport,
958 (struct sockaddr *) (addr + 1),
959 x->props.family);
960 }
961
962
963 if (add_keys && auth_key_size) {
964 key = (struct sadb_key *) skb_put(skb,
965 sizeof(struct sadb_key)+auth_key_size);
966 key->sadb_key_len = (sizeof(struct sadb_key) + auth_key_size) /
967 sizeof(uint64_t);
968 key->sadb_key_exttype = SADB_EXT_KEY_AUTH;
969 key->sadb_key_bits = x->aalg->alg_key_len;
970 key->sadb_key_reserved = 0;
971 memcpy(key + 1, x->aalg->alg_key, (x->aalg->alg_key_len+7)/8);
972 }
973
974 if (add_keys && encrypt_key_size) {
975 key = (struct sadb_key *) skb_put(skb,
976 sizeof(struct sadb_key)+encrypt_key_size);
977 key->sadb_key_len = (sizeof(struct sadb_key) +
978 encrypt_key_size) / sizeof(uint64_t);
979 key->sadb_key_exttype = SADB_EXT_KEY_ENCRYPT;
980 key->sadb_key_bits = x->ealg->alg_key_len;
981 key->sadb_key_reserved = 0;
982 memcpy(key + 1, x->ealg->alg_key,
983 (x->ealg->alg_key_len+7)/8);
984 }
985
986
987 sa2 = (struct sadb_x_sa2 *) skb_put(skb, sizeof(struct sadb_x_sa2));
988 sa2->sadb_x_sa2_len = sizeof(struct sadb_x_sa2)/sizeof(uint64_t);
989 sa2->sadb_x_sa2_exttype = SADB_X_EXT_SA2;
990 if ((mode = pfkey_mode_from_xfrm(x->props.mode)) < 0) {