Mercurial > hg > freeDiameter
comparison libfdproto/dictionary_functions.c @ 1136:140450615773
Revert changeset 1122 (ADDRESS_AVP_INCLUDE_PORT) as this will create too much interop issues. The Host-IP-Address AVP is not normally used to discover peer address, but only for validation of the addresses where a packet is received from -- which is quite useless with a connected transport connection, but anyway...
author | Sebastien Decugis <sdecugis@freediameter.net> |
---|---|
date | Thu, 16 May 2013 14:56:31 +0800 |
parents | d4371b7aa0ff |
children | 1020da0ea4bc |
comparison
equal
deleted
inserted
replaced
1135:90e0382e6579 | 1136:140450615773 |
---|---|
71 /* We are encoding an IP address */ | 71 /* We are encoding an IP address */ |
72 sSA4 * sin = (sSA4 *)ss; | 72 sSA4 * sin = (sSA4 *)ss; |
73 | 73 |
74 AddressType = 1;/* see http://www.iana.org/assignments/address-family-numbers/ */ | 74 AddressType = 1;/* see http://www.iana.org/assignments/address-family-numbers/ */ |
75 size = 6; /* 2 for AddressType + 4 for data */ | 75 size = 6; /* 2 for AddressType + 4 for data */ |
76 #ifdef ADDRESS_AVP_INCLUDE_PORT | |
77 if (sin->sin_port != 0) | |
78 size += 2; | |
79 #endif /* ADDRESS_AVP_INCLUDE_PORT */ | |
80 | 76 |
81 CHECK_MALLOC( buf = malloc(size) ); | 77 CHECK_MALLOC( buf = malloc(size) ); |
82 | 78 |
83 /* may not work because of alignment: *(uint32_t *)(buf+2) = htonl(sin->sin_addr.s_addr); */ | 79 /* may not work because of alignment: *(uint32_t *)(buf+2) = htonl(sin->sin_addr.s_addr); */ |
84 memcpy(buf + 2, &sin->sin_addr.s_addr, 4); | 80 memcpy(buf + 2, &sin->sin_addr.s_addr, 4); |
85 | |
86 #ifdef ADDRESS_AVP_INCLUDE_PORT | |
87 if (sin->sin_port != 0) | |
88 memcpy(buf + 6, &sin->sin_port, 2); | |
89 #endif /* ADDRESS_AVP_INCLUDE_PORT */ | |
90 } | 81 } |
91 break; | 82 break; |
92 | 83 |
93 case AF_INET6: | 84 case AF_INET6: |
94 { | 85 { |
95 /* We are encoding an IPv6 address */ | 86 /* We are encoding an IPv6 address */ |
96 sSA6 * sin6 = (sSA6 *)ss; | 87 sSA6 * sin6 = (sSA6 *)ss; |
97 | 88 |
98 AddressType = 2;/* see http://www.iana.org/assignments/address-family-numbers/ */ | 89 AddressType = 2;/* see http://www.iana.org/assignments/address-family-numbers/ */ |
99 size = 18; /* 2 for AddressType + 16 for data */ | 90 size = 18; /* 2 for AddressType + 16 for data */ |
100 #ifdef ADDRESS_AVP_INCLUDE_PORT | |
101 if (sin6->sin6_port != 0) | |
102 size += 2; | |
103 #endif /* ADDRESS_AVP_INCLUDE_PORT */ | |
104 | 91 |
105 CHECK_MALLOC( buf = malloc(size) ); | 92 CHECK_MALLOC( buf = malloc(size) ); |
106 | 93 |
107 /* The order is already good here */ | 94 /* The order is already good here */ |
108 memcpy(buf + 2, &sin6->sin6_addr.s6_addr, 16); | 95 memcpy(buf + 2, &sin6->sin6_addr.s6_addr, 16); |
109 | 96 |
110 #ifdef ADDRESS_AVP_INCLUDE_PORT | |
111 if (sin6->sin6_port != 0) | |
112 memcpy(buf + 18, &sin6->sin6_port, 2); | |
113 #endif /* ADDRESS_AVP_INCLUDE_PORT */ | |
114 } | 97 } |
115 break; | 98 break; |
116 | 99 |
117 default: | 100 default: |
118 CHECK_PARAMS( AddressType = 0 ); | 101 CHECK_PARAMS( AddressType = 0 ); |
141 switch (AddressType) { | 124 switch (AddressType) { |
142 case 1 /* IP */: | 125 case 1 /* IP */: |
143 { | 126 { |
144 sSA4 * sin = (sSA4 *)interpreted; | 127 sSA4 * sin = (sSA4 *)interpreted; |
145 | 128 |
146 CHECK_PARAMS( avp_value->os.len >= 6 ); | 129 CHECK_PARAMS( avp_value->os.len == 6 ); |
147 | 130 |
148 sin->sin_family = AF_INET; | 131 sin->sin_family = AF_INET; |
149 /* sin->sin_addr.s_addr = ntohl( * (uint32_t *) buf); -- may not work because of bad alignment */ | 132 /* sin->sin_addr.s_addr = ntohl( * (uint32_t *) buf); -- may not work because of bad alignment */ |
150 memcpy(&sin->sin_addr.s_addr, buf, 4); | 133 memcpy(&sin->sin_addr.s_addr, buf, 4); |
151 | |
152 if (avp_value->os.len == 8) | |
153 memcpy(&sin->sin_port, buf + 4, 2); | |
154 } | 134 } |
155 break; | 135 break; |
156 | 136 |
157 case 2 /* IP6 */: | 137 case 2 /* IP6 */: |
158 { | 138 { |
159 sSA6 * sin6 = (sSA6 *)interpreted; | 139 sSA6 * sin6 = (sSA6 *)interpreted; |
160 | 140 |
161 CHECK_PARAMS( avp_value->os.len >= 18 ); | 141 CHECK_PARAMS( avp_value->os.len == 18 ); |
162 | 142 |
163 sin6->sin6_family = AF_INET6; | 143 sin6->sin6_family = AF_INET6; |
164 memcpy(&sin6->sin6_addr.s6_addr, buf, 16); | 144 memcpy(&sin6->sin6_addr.s6_addr, buf, 16); |
165 | |
166 if (avp_value->os.len == 20) | |
167 memcpy(&sin6->sin6_port, buf + 16, 2); | |
168 | 145 |
169 } | 146 } |
170 break; | 147 break; |
171 | 148 |
172 default: | 149 default: |