1 --- a/bgpd/bgp_routemap.c
2 +++ b/bgpd/bgp_routemap.c
3 @@ -111,7 +111,8 @@ route_match_peer (void *rule, struct pre
7 - union sockunion *su2;
8 + union sockunion su_def = { .sa.sa_family = AF_INET,
9 + .sin.sin_addr.s_addr = INADDR_ANY };
10 struct peer_group *group;
12 struct listnode *node, *nnode;
13 @@ -127,8 +128,7 @@ route_match_peer (void *rule, struct pre
15 /* If su='0.0.0.0' (command 'match peer local'), and it's a NETWORK,
16 REDISTRIBUTE or DEFAULT_GENERATED route => return RMAP_MATCH */
17 - su2 = sockunion_str2su ("0.0.0.0");
18 - if ( sockunion_same (su, su2) )
19 + if (sockunion_same (su, &su_def))
22 if ( CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_NETWORK) ||
23 @@ -137,12 +137,9 @@ route_match_peer (void *rule, struct pre
28 - sockunion_free (su2);
31 - sockunion_free (su2);
34 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
36 if (sockunion_same (su, &peer->su))
37 @@ -878,7 +875,6 @@ route_set_ip_nexthop (void *rule, struct
38 route_map_object_t type, void *object)
40 struct rmap_ip_nexthop_set *rins = rule;
41 - struct in_addr peer_address;
42 struct bgp_info *bgp_info;
45 @@ -894,16 +890,14 @@ route_set_ip_nexthop (void *rule, struct
47 && sockunion_family (peer->su_remote) == AF_INET)
49 - inet_aton (sockunion_su2str (peer->su_remote), &peer_address);
50 - bgp_info->attr->nexthop = peer_address;
51 + bgp_info->attr->nexthop.s_addr = sockunion2ip (peer->su_remote);
52 bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP);
54 else if (CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT)
56 && sockunion_family (peer->su_local) == AF_INET)
58 - inet_aton (sockunion_su2str (peer->su_local), &peer_address);
59 - bgp_info->attr->nexthop = peer_address;
60 + bgp_info->attr->nexthop.s_addr = sockunion2ip (peer->su_local);
61 bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP);
66 @@ -78,23 +78,17 @@ enum connect_result
67 #define SET_IN6_LINKLOCAL_IFINDEX(a, i)
70 -/* shortcut macro to specify address field of struct sockaddr */
71 -#define sock2ip(X) (((struct sockaddr_in *)(X))->sin_addr.s_addr)
73 -#define sock2ip6(X) (((struct sockaddr_in6 *)(X))->sin6_addr.s6_addr)
74 -#endif /* HAVE_IPV6 */
76 #define sockunion_family(X) (X)->sa.sa_family
78 +#define sockunion2ip(X) (X)->sin.sin_addr.s_addr
81 extern int str2sockunion (const char *, union sockunion *);
82 extern const char *sockunion2str (union sockunion *, char *, size_t);
83 extern int sockunion_cmp (union sockunion *, union sockunion *);
84 extern int sockunion_same (union sockunion *, union sockunion *);
86 -extern char *sockunion_su2str (union sockunion *su);
87 extern union sockunion *sockunion_str2su (const char *str);
88 -extern struct in_addr sockunion_get_in_addr (union sockunion *su);
89 extern int sockunion_accept (int sock, union sockunion *);
90 extern int sockunion_stream_socket (union sockunion *);
91 extern int sockopt_reuseaddr (int);
94 @@ -597,8 +597,6 @@ bgp_stop_with_error (struct peer *peer)
96 bgp_connect_success (struct peer *peer)
102 zlog_err ("bgp_connect_success peer's fd is negative value %d",
103 @@ -612,6 +610,8 @@ bgp_connect_success (struct peer *peer)
105 if (BGP_DEBUG (normal, NORMAL))
107 + char buf1[SU_ADDRSTRLEN];
109 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
110 zlog_debug ("%s open active, local address %s", peer->host,
111 sockunion2str (peer->su_local, buf1, SU_ADDRSTRLEN));
112 --- a/bgpd/bgp_mplsvpn.c
113 +++ b/bgpd/bgp_mplsvpn.c
114 @@ -581,24 +581,25 @@ DEFUN (show_ip_bgp_vpnv4_all_neighbor_ro
115 "Neighbor to display information about\n"
116 "Display routes learned from neighbor\n")
118 - union sockunion *su;
119 + union sockunion su;
122 - su = sockunion_str2su (argv[0]);
126 + ret = str2sockunion (argv[0], &su);
129 vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
130 - return CMD_WARNING;
131 + return CMD_WARNING;
134 - peer = peer_lookup (NULL, su);
135 + peer = peer_lookup (NULL, &su);
136 if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
138 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
142 - return bgp_show_mpls_vpn (vty, NULL, bgp_show_type_neighbor, su, 0);
143 + return bgp_show_mpls_vpn (vty, NULL, bgp_show_type_neighbor, &su, 0);
146 DEFUN (show_ip_bgp_vpnv4_rd_neighbor_routes,
147 @@ -615,7 +616,7 @@ DEFUN (show_ip_bgp_vpnv4_rd_neighbor_rou
148 "Display routes learned from neighbor\n")
151 - union sockunion *su;
152 + union sockunion su;
154 struct prefix_rd prd;
156 @@ -626,21 +627,21 @@ DEFUN (show_ip_bgp_vpnv4_rd_neighbor_rou
160 - su = sockunion_str2su (argv[1]);
162 + ret = str2sockunion (argv[1], &su);
165 vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
166 - return CMD_WARNING;
167 + return CMD_WARNING;
170 - peer = peer_lookup (NULL, su);
171 + peer = peer_lookup (NULL, &su);
172 if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
174 vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
178 - return bgp_show_mpls_vpn (vty, &prd, bgp_show_type_neighbor, su, 0);
179 + return bgp_show_mpls_vpn (vty, &prd, bgp_show_type_neighbor, &su, 0);
182 DEFUN (show_ip_bgp_vpnv4_all_neighbor_advertised_routes,
183 --- a/bgpd/bgp_network.c
184 +++ b/bgpd/bgp_network.c
185 @@ -185,7 +185,7 @@ bgp_accept (struct thread *thread)
186 zlog_debug ("[Event] Make dummy peer structure until read Open packet");
189 - char buf[SU_ADDRSTRLEN + 1];
190 + char buf[SU_ADDRSTRLEN];
192 peer = peer_create_accept (peer1->bgp);
193 SET_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER);
194 --- a/bgpd/bgp_route.c
195 +++ b/bgpd/bgp_route.c
196 @@ -10202,15 +10202,18 @@ DEFUN (show_ip_bgp_neighbor_received_pre
197 "Display the prefixlist filter\n")
200 - union sockunion *su;
201 + union sockunion su;
206 - su = sockunion_str2su (argv[0]);
208 - return CMD_WARNING;
209 + ret = str2sockunion (argv[0], &su);
212 + vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
213 + return CMD_WARNING;
216 - peer = peer_lookup (NULL, su);
217 + peer = peer_lookup (NULL, &su);
221 @@ -10241,15 +10244,18 @@ DEFUN (show_ip_bgp_ipv4_neighbor_receive
222 "Display the prefixlist filter\n")
225 - union sockunion *su;
226 + union sockunion su;
231 - su = sockunion_str2su (argv[1]);
233 - return CMD_WARNING;
234 + ret = str2sockunion (argv[1], &su);
237 + vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
238 + return CMD_WARNING;
241 - peer = peer_lookup (NULL, su);
242 + peer = peer_lookup (NULL, &su);
246 @@ -10312,15 +10318,18 @@ DEFUN (show_bgp_neighbor_received_prefix
247 "Display the prefixlist filter\n")
250 - union sockunion *su;
251 + union sockunion su;
256 - su = sockunion_str2su (argv[0]);
258 - return CMD_WARNING;
259 + ret = str2sockunion (argv[0], &su);
262 + vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
263 + return CMD_WARNING;
266 - peer = peer_lookup (NULL, su);
267 + peer = peer_lookup (NULL, &su);
271 @@ -10394,10 +10403,10 @@ DEFUN (show_bgp_view_neighbor_received_p
272 "Display the prefixlist filter\n")
275 - union sockunion *su;
276 + union sockunion su;
282 /* BGP structure lookup. */
283 bgp = bgp_lookup_by_name (argv[0]);
284 @@ -10407,11 +10416,14 @@ DEFUN (show_bgp_view_neighbor_received_p
288 - su = sockunion_str2su (argv[1]);
290 - return CMD_WARNING;
291 + ret = str2sockunion (argv[1], &su);
294 + vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
295 + return CMD_WARNING;
298 - peer = peer_lookup (bgp, su);
299 + peer = peer_lookup (bgp, &su);
305 @@ -2943,7 +2943,6 @@ peer_update_source_vty (struct vty *vty,
306 const char *source_str)
309 - union sockunion *su;
311 peer = peer_and_group_lookup_vty (vty, peer_str);
313 @@ -2951,12 +2950,11 @@ peer_update_source_vty (struct vty *vty,
317 - su = sockunion_str2su (source_str);
320 - peer_update_source_addr_set (peer, su);
321 - sockunion_free (su);
323 + union sockunion su;
324 + int ret = str2sockunion (source_str, &su);
327 + peer_update_source_addr_set (peer, &su);
329 peer_update_source_if_set (peer, source_str);
331 --- a/lib/sockunion.c
332 +++ b/lib/sockunion.c
333 @@ -177,55 +177,15 @@ sockunion2str (union sockunion *su, char
335 sockunion_str2su (const char *str)
338 - union sockunion *su;
340 - su = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion));
342 - ret = inet_pton (AF_INET, str, &su->sin.sin_addr);
343 - if (ret > 0) /* Valid IPv4 address format. */
345 - su->sin.sin_family = AF_INET;
346 -#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
347 - su->sin.sin_len = sizeof(struct sockaddr_in);
348 -#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
352 - ret = inet_pton (AF_INET6, str, &su->sin6.sin6_addr);
353 - if (ret > 0) /* Valid IPv6 address format. */
355 - su->sin6.sin6_family = AF_INET6;
357 - su->sin6.sin6_len = sizeof(struct sockaddr_in6);
358 -#endif /* SIN6_LEN */
361 -#endif /* HAVE_IPV6 */
363 + union sockunion *su = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion));
365 + if (!str2sockunion (str, su))
368 XFREE (MTYPE_SOCKUNION, su);
373 -sockunion_su2str (union sockunion *su)
375 - char str[SU_ADDRSTRLEN];
377 - switch (su->sa.sa_family)
380 - inet_ntop (AF_INET, &su->sin.sin_addr, str, sizeof (str));
384 - inet_ntop (AF_INET6, &su->sin6.sin6_addr, str, sizeof (str));
386 -#endif /* HAVE_IPV6 */
388 - return XSTRDUP (MTYPE_TMP, str);
391 /* Convert IPv4 compatible IPv6 address to IPv4 address. */
393 sockunion_normalise_mapped (union sockunion *su)
394 @@ -422,7 +382,7 @@ sockunion_bind (int sock, union sockunio
395 su->sin.sin_len = size;
396 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
398 - su->sin.sin_addr.s_addr = htonl (INADDR_ANY);
399 + sockunion2ip (su) = htonl (INADDR_ANY);
402 else if (su->sa.sa_family == AF_INET6)
403 @@ -779,9 +739,9 @@ sockunion_cmp (union sockunion *su1, uni
405 if (su1->sa.sa_family == AF_INET)
407 - if (ntohl (su1->sin.sin_addr.s_addr) == ntohl (su2->sin.sin_addr.s_addr))
408 + if (ntohl (sockunion2ip (su1)) == ntohl (sockunion2ip (su2)))
410 - if (ntohl (su1->sin.sin_addr.s_addr) > ntohl (su2->sin.sin_addr.s_addr))
411 + if (ntohl (sockunion2ip (su1)) > ntohl (sockunion2ip (su2)))
417 @@ -1612,13 +1612,16 @@ vty_flush (struct thread *thread)
419 vty_create (int vty_sock, union sockunion *su)
421 + char buf[SU_ADDRSTRLEN];
424 + sockunion2str(su, buf, SU_ADDRSTRLEN);
426 /* Allocate new vty structure and set up default values. */
429 vty->type = VTY_TERM;
430 - vty->address = sockunion_su2str (su);
431 + strcpy (vty->address, buf);
432 if (no_password_check)
435 @@ -1693,7 +1696,7 @@ vty_accept (struct thread *thread)
437 struct prefix *p = NULL;
438 struct access_list *acl = NULL;
440 + char buf[SU_ADDRSTRLEN];
442 accept_sock = THREAD_FD (thread);
444 @@ -1719,10 +1722,8 @@ vty_accept (struct thread *thread)
445 if ((acl = access_list_lookup (AFI_IP, vty_accesslist_name)) &&
446 (access_list_apply (acl, p) == FILTER_DENY))
449 zlog (NULL, LOG_INFO, "Vty connection refused from %s",
450 - (buf = sockunion_su2str (&su)));
452 + sockunion2str (&su, buf, SU_ADDRSTRLEN));
455 /* continue accepting connections */
456 @@ -1741,10 +1742,8 @@ vty_accept (struct thread *thread)
457 if ((acl = access_list_lookup (AFI_IP6, vty_ipv6_accesslist_name)) &&
458 (access_list_apply (acl, p) == FILTER_DENY))
461 zlog (NULL, LOG_INFO, "Vty connection refused from %s",
462 - (buf = sockunion_su2str (&su)));
464 + sockunion2str (&su, buf, SU_ADDRSTRLEN));
467 /* continue accepting connections */
468 @@ -1767,9 +1766,7 @@ vty_accept (struct thread *thread)
469 safe_strerror (errno));
471 zlog (NULL, LOG_INFO, "Vty connection from %s",
472 - (bufp = sockunion_su2str (&su)));
474 - XFREE (MTYPE_TMP, bufp);
475 + sockunion2str (&su, buf, SU_ADDRSTRLEN));
477 vty_create (vty_sock, &su);
479 @@ -2193,8 +2190,6 @@ vty_close (struct vty *vty)
484 - XFREE (MTYPE_TMP, vty->address);
486 XFREE (MTYPE_VTY, vty->buf);
490 @@ -23,6 +23,7 @@ Software Foundation, Inc., 59 Temple Pla
494 +#include "sockunion.h"
496 #define VTY_BUFSIZ 512
497 #define VTY_MAXHIST 20
498 @@ -39,9 +40,6 @@ struct vty
499 /* Node status of this vty */
502 - /* What address is this vty comming from. */
508 @@ -118,6 +116,9 @@ struct vty
509 /* Timeout seconds and thread. */
510 unsigned long v_timeout;
511 struct thread *t_timeout;
513 + /* What address is this vty comming from. */
514 + char address[SU_ADDRSTRLEN];
517 /* Integrated configuration file. */
518 --- a/zebra/zebra_rib.c
519 +++ b/zebra/zebra_rib.c
520 @@ -678,8 +678,8 @@ rib_lookup_ipv4_route (struct prefix_ipv
521 if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
523 /* We are happy with either direct or recursive hexthop */
524 - if (nexthop->gate.ipv4.s_addr == qgate->sin.sin_addr.s_addr ||
525 - nexthop->rgate.ipv4.s_addr == qgate->sin.sin_addr.s_addr)
526 + if (nexthop->gate.ipv4.s_addr == sockunion2ip (qgate) ||
527 + nexthop->rgate.ipv4.s_addr == sockunion2ip (qgate))
528 return ZEBRA_RIB_FOUND_EXACT;
531 @@ -688,7 +688,7 @@ rib_lookup_ipv4_route (struct prefix_ipv
532 char gate_buf[INET_ADDRSTRLEN], rgate_buf[INET_ADDRSTRLEN], qgate_buf[INET_ADDRSTRLEN];
533 inet_ntop (AF_INET, &nexthop->gate.ipv4.s_addr, gate_buf, INET_ADDRSTRLEN);
534 inet_ntop (AF_INET, &nexthop->rgate.ipv4.s_addr, rgate_buf, INET_ADDRSTRLEN);
535 - inet_ntop (AF_INET, &qgate->sin.sin_addr.s_addr, qgate_buf, INET_ADDRSTRLEN);
536 + inet_ntop (AF_INET, &sockunion2ip (qgate), qgate_buf, INET_ADDRSTRLEN);
537 zlog_debug ("%s: qgate == %s, gate == %s, rgate == %s", __func__, qgate_buf, gate_buf, rgate_buf);
539 return ZEBRA_RIB_FOUND_NOGATE;