1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
|
--- ospfd/ospf_asbr.c.orig 2016-10-18 13:03:52 UTC
+++ ospfd/ospf_asbr.c
@@ -122,6 +122,7 @@ ospf_reset_route_map_set_values (struct
{
values->metric = -1;
values->metric_type = -1;
+ values->nexthop.s_addr = -1;
}
int
--- ospfd/ospf_asbr.h.orig 2016-10-18 13:03:52 UTC
+++ ospfd/ospf_asbr.h
@@ -27,6 +27,7 @@ struct route_map_set_values
{
int32_t metric;
int32_t metric_type;
+ struct in_addr nexthop;
};
/* Redistributed external information. */
@@ -50,6 +51,7 @@ struct external_info
struct route_map_set_values route_map_set;
#define ROUTEMAP_METRIC(E) (E)->route_map_set.metric
#define ROUTEMAP_METRIC_TYPE(E) (E)->route_map_set.metric_type
+#define ROUTEMAP_NEXTHOP(E) (E)->route_map_set.nexthop
};
#define OSPF_ASBR_CHECK_DELAY 30
--- ospfd/ospf_lsa.c.orig 2016-10-18 13:03:52 UTC
+++ ospfd/ospf_lsa.c
@@ -1644,7 +1644,8 @@ ospf_external_lsa_body_set (struct strea
stream_put_ospf_metric (s, mvalue);
/* Get forwarding address to nexthop if on the Connection List, else 0. */
- fwd_addr = ospf_external_lsa_nexthop_get (ospf, ei->nexthop);
+ fwd_addr = (ei->route_map_set.nexthop.s_addr != -1) ?
+ ROUTEMAP_NEXTHOP (ei) : ospf_external_lsa_nexthop_get (ospf, ei->nexthop);
/* Put forwarding address. */
stream_put_ipv4 (s, fwd_addr.s_addr);
--- ospfd/ospf_routemap.c.orig 2016-10-18 13:03:52 UTC
+++ ospfd/ospf_routemap.c
@@ -668,6 +668,62 @@ struct route_map_rule_cmd route_set_tag_
route_set_tag_free,
};
+/* `set ip next-hop IP_ADDRESS' */
+/* Set nexthop to object. */
+static route_map_result_t
+route_set_ip_nexthop (void *rule, struct prefix *prefix,
+ route_map_object_t type, void *object)
+{
+ struct in_addr *address;
+ struct external_info *ei;
+
+ if (type == RMAP_OSPF)
+ {
+ /* Fetch routemap's rule information. */
+ address = rule;
+ ei = object;
+
+ /* Set metric out value. */
+ ei->route_map_set.nexthop = *address;
+ }
+ return RMAP_OKAY;
+}
+
+/* set ip next-hop compilation. */
+static void *
+route_set_ip_nexthop_compile (const char *arg)
+{
+ struct in_addr *address = NULL;
+ int ret;
+
+ address = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct in_addr));
+ ret = inet_aton (arg, address);
+
+ if (ret == 0)
+ {
+ XFREE (MTYPE_ROUTE_MAP_COMPILED, address);
+ return NULL;
+ }
+
+ return address;
+}
+
+/* Free route map's compiled `set ip next-hop' value. */
+static void
+route_set_ip_nexthop_free (void *rule)
+{
+ XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
+}
+
+/* Set ip next-hop rule structure. */
+struct route_map_rule_cmd route_set_ip_nexthop_cmd =
+{
+ "ip next-hop",
+ route_set_ip_nexthop,
+ route_set_ip_nexthop_compile,
+ route_set_ip_nexthop_free,
+};
+
DEFUN (match_ip_nexthop,
match_ip_nexthop_cmd,
"match ip next-hop (<1-199>|<1300-2699>|WORD)",
@@ -984,6 +1040,49 @@ ALIAS (no_set_tag,
"Tag value for routing protocol\n"
"Tag value\n")
+DEFUN (set_ip_nexthop,
+ set_ip_nexthop_cmd,
+ "set ip next-hop A.B.C.D",
+ SET_STR
+ IP_STR
+ "Next hop address\n"
+ "IP address of next hop\n")
+{
+ union sockunion su;
+ int ret;
+
+ ret = str2sockunion (argv[0], &su);
+ if (ret < 0)
+ {
+ vty_out (vty, "%% Malformed Next-hop address%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ return ospf_route_set_add (vty, vty->index, "ip next-hop", argv[0]);
+}
+
+DEFUN (no_set_ip_nexthop,
+ no_set_ip_nexthop_cmd,
+ "no set ip next-hop",
+ NO_STR
+ SET_STR
+ "Next hop address\n")
+{
+ if (argc == 0)
+ return ospf_route_set_delete (vty, vty->index, "ip next-hop", NULL);
+
+ return ospf_route_set_delete (vty, vty->index, "ip next-hop", argv[0]);
+}
+
+ALIAS (no_set_ip_nexthop,
+ no_set_ip_nexthop_val_cmd,
+ "no set ip next-hop A.B.C.D",
+ NO_STR
+ SET_STR
+ IP_STR
+ "Next hop address\n"
+ "IP address of next hop\n")
+
/* Route-map init */
void
ospf_route_map_init (void)
@@ -1005,6 +1104,7 @@ ospf_route_map_init (void)
route_map_install_set (&route_set_metric_cmd);
route_map_install_set (&route_set_metric_type_cmd);
route_map_install_set (&route_set_tag_cmd);
+ route_map_install_set (&route_set_ip_nexthop_cmd);
install_element (RMAP_NODE, &match_ip_nexthop_cmd);
install_element (RMAP_NODE, &no_match_ip_nexthop_cmd);
@@ -1031,6 +1131,9 @@ ospf_route_map_init (void)
install_element (RMAP_NODE, &set_metric_type_cmd);
install_element (RMAP_NODE, &no_set_metric_type_cmd);
install_element (RMAP_NODE, &no_set_metric_type_val_cmd);
+ install_element (RMAP_NODE, &set_ip_nexthop_cmd);
+ install_element (RMAP_NODE, &no_set_ip_nexthop_cmd);
+ install_element (RMAP_NODE, &no_set_ip_nexthop_val_cmd);
install_element (RMAP_NODE, &set_tag_cmd);
install_element (RMAP_NODE, &no_set_tag_cmd);
install_element (RMAP_NODE, &no_set_tag_val_cmd);
--- vtysh/extract.pl.in.orig 2016-10-20 11:59:56 UTC
+++ vtysh/extract.pl.in
@@ -180,7 +180,7 @@ foreach (@ARGV) {
}
}
-my $bad_cli_stomps = 102;
+my $bad_cli_stomps = 105;
# Currently we have $bad_cli_stomps. This was determined by
# running this script and counting up the collisions from what
# was returned.
|