Date: Tue, 23 Dec 2008 15:35:35 +0300 (MSK) From: Eygene Ryabinkin <rea-fbsd@codelabs.ru> To: FreeBSD-gnats-submit@freebsd.org Subject: ports/129881: [patch] net/openospfd: update to 4.3 and fix some bugs Message-ID: <20081223123535.663791AF425@void.codelabs.ru> Resent-Message-ID: <200812231240.mBNCe1RI085301@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 129881 >Category: ports >Synopsis: [patch] net/openospfd: update to 4.3 and fix some bugs >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Tue Dec 23 12:40:01 UTC 2008 >Closed-Date: >Last-Modified: >Originator: Eygene Ryabinkin >Release: FreeBSD 7.1-PRERELEASE i386 >Organization: Code Labs >Environment: System: FreeBSD 7.1-PRERELEASE i386 >Description: OpenOSPFD 4.3 is out, ftp://ftp.openbsd.org/pub/OpenBSD/OpenBGPD/openospfd-4.3.tgz >How-To-Repeat: Look at the above URL. Moreover, issue with libevent's processing in OpenOSPFD was found by Remko Lodder, the provided patchset fixes it as well. >Fix: The following patches update the port to 4.3 and fix some important problems, most notably -- libevent-related issue Remko Lodder was trouble with. Update to 4.3 itself: --- update-to-4.3-pack1.diff begins here --- >From e2c61733ea1201a1709779aa26f2b243fa206a1d Mon Sep 17 00:00:00 2001 From: Eygene Ryabinkin <rea-fbsd@codelabs.ru> Date: Fri, 19 Dec 2008 18:30:30 +0300 Signed-off-by: Eygene Ryabinkin <rea-fbsd@codelabs.ru> --- net/openospfd/Makefile | 6 +- net/openospfd/distinfo | 6 +- net/openospfd/files/patch-ospfd_kroute.c | 48 +++++++---- net/openospfd/files/patch-ospfd_parse.y | 16 ++-- net/openospfd/files/patch-ospfd_rde_spf.c | 133 ----------------------------- 5 files changed, 46 insertions(+), 163 deletions(-) delete mode 100644 net/openospfd/files/patch-ospfd_rde_spf.c diff --git a/net/openospfd/Makefile b/net/openospfd/Makefile index 512932c..56b919d 100644 --- a/net/openospfd/Makefile +++ b/net/openospfd/Makefile @@ -6,11 +6,11 @@ # PORTNAME= openospfd -PORTVERSION= 4.2 +PORTVERSION= 4.3 CATEGORIES= net -MASTER_SITES= ftp://ftp.dkuug.dk/pub/OpenBSD/OpenBGPD/:openbsd \ +MASTER_SITES= ${MASTER_SITE_OPENBSD:S/$/:openbsd/g} \ ${MASTER_SITE_LOCAL:S/$/:freebsd/g} -MASTER_SITE_SUBDIR= flz/openospfd/:freebsd +MASTER_SITE_SUBDIR= flz/openospfd/:freebsd OpenBGPD/:openbsd DISTFILES= ${PORTNAME}-${PORTVERSION}.tgz:openbsd \ if_media.h:freebsd hash.h:freebsd DIST_SUBDIR= ${PORTNAME} diff --git a/net/openospfd/distinfo b/net/openospfd/distinfo index 870d644..50f62f0 100644 --- a/net/openospfd/distinfo +++ b/net/openospfd/distinfo @@ -1,6 +1,6 @@ -MD5 (openospfd/openospfd-4.2.tgz) = ac919e4883105b28a846106e7c60bb80 -SHA256 (openospfd/openospfd-4.2.tgz) = 896a9e29447d7da46a1c7c1717e1527b3770425840e8f0180419ec313d3d7b00 -SIZE (openospfd/openospfd-4.2.tgz) = 93661 +MD5 (openospfd/openospfd-4.3.tgz) = dffeb5cf21cbd4f15534e658682cb6ee +SHA256 (openospfd/openospfd-4.3.tgz) = 8fd4ffb393cc06f5936e9eb444b54f72d3fb7ec27285d0d746de5e8050959a66 +SIZE (openospfd/openospfd-4.3.tgz) = 97515 MD5 (openospfd/if_media.h) = 4ff9297f5c133425dafe3ca565c0f811 SHA256 (openospfd/if_media.h) = 58225d0ed363c2beb23426f0f8254089d4541c3334776f3750ba434d4491a1d1 SIZE (openospfd/if_media.h) = 23762 diff --git a/net/openospfd/files/patch-ospfd_kroute.c b/net/openospfd/files/patch-ospfd_kroute.c index 2b1bd77..2e270f4 100644 --- a/net/openospfd/files/patch-ospfd_kroute.c +++ b/net/openospfd/files/patch-ospfd_kroute.c @@ -1,6 +1,6 @@ ---- ospfd/kroute.c.orig 2008-02-07 18:58:38.000000000 +0300 -+++ ospfd/kroute.c 2008-02-07 19:09:58.000000000 +0300 -@@ -955,9 +955,11 @@ +--- ospfd/kroute.c.orig 2007-10-18 00:52:42.000000000 +0400 ++++ ospfd/kroute.c 2008-12-19 18:07:06.000000000 +0300 +@@ -1024,9 +1024,11 @@ struct sockaddr_in prefix; struct sockaddr_in nexthop; struct sockaddr_in mask; @@ -13,7 +13,23 @@ if (kr_state.fib_sync == 0) return (0); -@@ -1011,6 +1013,7 @@ +@@ -1035,9 +1037,14 @@ + bzero(&hdr, sizeof(hdr)); + hdr.rtm_version = RTM_VERSION; + hdr.rtm_type = action; ++#if !defined(__FreeBSD__) + hdr.rtm_flags = RTF_PROTO2|RTF_MPATH; ++#else ++ /* No multipath routing in FreeBSD yet */ ++ hdr.rtm_flags = RTF_PROTO2; ++#endif /* !defined(__FreeBSD__) */ + if (action == RTM_CHANGE) /* force PROTO2 reset the other flags */ +- hdr.rtm_fmask = RTF_PROTO2|RTF_PROTO1|RTF_REJECT|RTF_BLACKHOLE; ++ hdr.rtm_use = RTF_PROTO2|RTF_PROTO1|RTF_REJECT|RTF_BLACKHOLE; + hdr.rtm_seq = kr_state.rtseq++; /* overflow doesn't matter */ + hdr.rtm_msglen = sizeof(hdr); + /* adjust iovec */ +@@ -1080,6 +1087,7 @@ iov[iovcnt].iov_base = &mask; iov[iovcnt++].iov_len = sizeof(mask); @@ -21,7 +37,7 @@ if (kroute->rtlabel != 0) { sa_rl.sr_len = sizeof(sa_rl); sa_rl.sr_family = AF_UNSPEC; -@@ -1027,6 +1030,7 @@ +@@ -1096,6 +1104,7 @@ iov[iovcnt].iov_base = &sa_rl; iov[iovcnt++].iov_len = sizeof(sa_rl); } @@ -29,7 +45,7 @@ retry: -@@ -1069,7 +1073,9 @@ +@@ -1138,7 +1147,9 @@ struct rt_msghdr *rtm; struct sockaddr *sa, *rti_info[RTAX_MAX]; struct sockaddr_in *sa_in; @@ -39,7 +55,7 @@ struct kroute_node *kr; mib[0] = CTL_NET; -@@ -1078,9 +1084,13 @@ +@@ -1147,9 +1158,13 @@ mib[3] = AF_INET; mib[4] = NET_RT_DUMP; mib[5] = 0; @@ -53,7 +69,7 @@ log_warn("sysctl"); return (-1); } -@@ -1098,7 +1098,11 @@ +@@ -1157,7 +1172,11 @@ log_warn("fetchtable"); return (-1); } @@ -65,7 +81,7 @@ log_warn("sysctl"); free(buf); return (-1); -@@ -1157,6 +1163,7 @@ +@@ -1228,6 +1247,7 @@ send_rtmsg(kr_state.fd, RTM_DELETE, &kr->r); free(kr); } else { @@ -73,7 +89,7 @@ if ((label = (struct sockaddr_rtlabel *) rti_info[RTAX_LABEL]) != NULL) { kr->r.rtlabel = -@@ -1164,6 +1171,7 @@ +@@ -1235,6 +1255,7 @@ kr->r.ext_tag = rtlabel_id2tag(kr->r.rtlabel); } @@ -81,7 +97,7 @@ kroute_insert(kr); } -@@ -1257,7 +1265,9 @@ +@@ -1328,7 +1349,9 @@ struct ifa_msghdr *ifam; struct sockaddr *sa, *rti_info[RTAX_MAX]; struct sockaddr_in *sa_in; @@ -91,7 +107,7 @@ struct kroute_node *kr, *okr; struct in_addr prefix, nexthop; u_int8_t prefixlen; -@@ -1289,8 +1299,10 @@ +@@ -1362,8 +1385,10 @@ sa = (struct sockaddr *)(rtm + 1); get_rtaddrs(rtm->rtm_addrs, sa, rti_info); @@ -102,7 +118,7 @@ if (rtm->rtm_pid == kr_state.pid) /* caused by us */ continue; -@@ -1385,6 +1397,7 @@ +@@ -1458,6 +1483,7 @@ rtlabel_unref(kr->r.rtlabel); kr->r.rtlabel = 0; kr->r.ext_tag = 0; @@ -110,7 +126,7 @@ if ((label = (struct sockaddr_rtlabel *) rti_info[RTAX_LABEL]) != NULL) { kr->r.rtlabel = -@@ -1392,6 +1405,7 @@ +@@ -1465,6 +1491,7 @@ kr->r.ext_tag = rtlabel_id2tag(kr->r.rtlabel); } @@ -118,7 +134,7 @@ if (kif_validate(kr->r.ifindex)) kr->r.flags &= ~F_DOWN; -@@ -1413,6 +1427,7 @@ +@@ -1486,6 +1513,7 @@ kr->r.flags = flags; kr->r.ifindex = ifindex; @@ -126,7 +142,7 @@ if ((label = (struct sockaddr_rtlabel *) rti_info[RTAX_LABEL]) != NULL) { kr->r.rtlabel = -@@ -1420,6 +1435,7 @@ +@@ -1493,6 +1521,7 @@ kr->r.ext_tag = rtlabel_id2tag(kr->r.rtlabel); } diff --git a/net/openospfd/files/patch-ospfd_parse.y b/net/openospfd/files/patch-ospfd_parse.y index 7023a9d..6c40c3e 100644 --- a/net/openospfd/files/patch-ospfd_parse.y +++ b/net/openospfd/files/patch-ospfd_parse.y @@ -1,6 +1,6 @@ ---- ospfd/parse.y.orig 2008-02-07 18:34:22.000000000 +0300 -+++ ospfd/parse.y 2008-02-07 18:37:46.000000000 +0300 -@@ -485,6 +485,11 @@ +--- ospfd/parse.y.orig 2008-02-26 13:09:58.000000000 +0300 ++++ ospfd/parse.y 2008-12-19 17:52:39.000000000 +0300 +@@ -503,6 +503,11 @@ areaoptsl : interface | DEMOTE STRING demotecount { @@ -9,10 +9,10 @@ + free($2); + YYERROR; +#else - if ($3 > 255) { - yyerror("demote count too big: max 255"); + if ($3 < 1 || $3 > 255) { + yyerror("demote count out of range (1-255)"); free($2); -@@ -505,6 +510,7 @@ +@@ -523,6 +528,7 @@ area->demote_group); YYERROR; } @@ -20,7 +20,7 @@ } | defaults ; -@@ -581,6 +587,11 @@ +@@ -599,6 +605,11 @@ interfaceoptsl : PASSIVE { iface->passive = 1; } | DEMOTE STRING { @@ -32,7 +32,7 @@ if (strlcpy(iface->demote_group, $2, sizeof(iface->demote_group)) >= sizeof(iface->demote_group)) { -@@ -595,6 +606,7 @@ +@@ -613,6 +624,7 @@ iface->demote_group); YYERROR; } diff --git a/net/openospfd/files/patch-ospfd_rde_spf.c b/net/openospfd/files/patch-ospfd_rde_spf.c deleted file mode 100644 index e0391f3..0000000 --- a/net/openospfd/files/patch-ospfd_rde_spf.c +++ /dev/null @@ -1,133 +0,0 @@ ---- ospfd/rde_spf.c 2007/08/06 11:32:34 1.63 -+++ ospfd/rde_spf.c 2007/09/16 15:00:11 1.64 -@@ -1,4 +1,4 @@ --/* $OpenBSD: rde_spf.c,v 1.63 2007/08/06 11:32:34 claudio Exp $ */ -+/* $OpenBSD: rde_spf.c,v 1.64 2007/09/16 15:00:11 claudio Exp $ */ - - /* - * Copyright (c) 2005 Esben Norby <norby@openbsd.org> -@@ -37,7 +37,8 @@ - - void calc_nexthop_clear(struct vertex *); - void calc_nexthop_add(struct vertex *, struct vertex *, u_int32_t); --void calc_nexthop(struct vertex *, struct vertex *); -+void calc_nexthop(struct vertex *, struct vertex *, -+ struct area *, struct lsa_rtr_link *); - void rt_nexthop_clear(struct rt_node *); - void rt_nexthop_add(struct rt_node *, struct v_nexthead *, - struct in_addr); -@@ -134,7 +135,7 @@ - if (d < w->cost) { - w->cost = d; - calc_nexthop_clear(w); -- calc_nexthop(w, v); -+ calc_nexthop(w, v, area, rtr_link); - /* - * need to readd to candidate list - * because the list is sorted -@@ -143,12 +144,12 @@ - cand_list_add(w); - } else - /* equal cost path */ -- calc_nexthop(w, v); -+ calc_nexthop(w, v, area, rtr_link); - } else if (w->cost == LS_INFINITY && d < LS_INFINITY) { - w->cost = d; - - calc_nexthop_clear(w); -- calc_nexthop(w, v); -+ calc_nexthop(w, v, area, rtr_link); - cand_list_add(w); - } - } -@@ -384,54 +385,51 @@ - } - - void --calc_nexthop(struct vertex *dst, struct vertex *parent) -+calc_nexthop(struct vertex *dst, struct vertex *parent, -+ struct area *area, struct lsa_rtr_link *rtr_link) - { -- struct lsa_rtr_link *rtr_link = NULL; - struct v_nexthop *vn; -+ struct iface *iface; - int i; - - /* case 1 */ - if (parent == spf_root) { - switch (dst->type) { - case LSA_TYPE_ROUTER: -- for (i = 0; i < lsa_num_links(dst); i++) { -- rtr_link = get_rtr_link(dst, i); -- if (rtr_link->type == LINK_TYPE_POINTTOPOINT && -- ntohl(rtr_link->id) == parent->ls_id) { -+ if (rtr_link->type != LINK_TYPE_POINTTOPOINT) -+ fatalx("inconsistent SPF tree"); -+ LIST_FOREACH(iface, &area->iface_list, entry) { -+ if (rtr_link->data == iface->addr.s_addr) { - calc_nexthop_add(dst, parent, -- rtr_link->data); -- break; -+ iface->dst.s_addr); -+ return; - } - } -- return; -+ fatalx("no interface found for interface"); - case LSA_TYPE_NETWORK: -- for (i = 0; i < lsa_num_links(parent); i++) { -- rtr_link = get_rtr_link(parent, i); -- switch (rtr_link->type) { -- case LINK_TYPE_POINTTOPOINT: -- /* ignore */ -- break; -- case LINK_TYPE_TRANSIT_NET: -- if ((htonl(dst->ls_id) & -- dst->lsa->data.net.mask) == -- (rtr_link->data & -- dst->lsa->data.net.mask)) { -- calc_nexthop_add(dst, parent, -- rtr_link->data); -- } -- break; -- case LINK_TYPE_STUB_NET: -- break; -- -- default: -- fatalx("calc_nexthop: invalid link " -- "type"); -+ switch (rtr_link->type) { -+ case LINK_TYPE_POINTTOPOINT: -+ case LINK_TYPE_STUB_NET: -+ /* ignore */ -+ break; -+ case LINK_TYPE_TRANSIT_NET: -+ if ((htonl(dst->ls_id) & -+ dst->lsa->data.net.mask) == -+ (rtr_link->data & -+ dst->lsa->data.net.mask)) { -+ calc_nexthop_add(dst, parent, -+ rtr_link->data); - } -+ break; -+ default: -+ fatalx("calc_nexthop: invalid link " -+ "type"); - } - return; - default: - fatalx("calc_nexthop: invalid dst type"); - } -+ return; - } - - /* case 2 */ -@@ -459,7 +457,7 @@ - - /* case 3 */ - TAILQ_FOREACH(vn, &parent->nexthop, entry) -- calc_nexthop_add(dst, parent, vn->nexthop.s_addr); -+ calc_nexthop_add(dst, parent, vn->nexthop.s_addr); - } - - /* candidate list */ -- 1.6.0.5 --- update-to-4.3-pack1.diff ends here --- Add comments to all patches to give an idea why they are needed: --- update-to-4.3-pack2.diff begins here --- >From 6155fa523818154876ddae5c54da8e825cff0d82 Mon Sep 17 00:00:00 2001 From: Eygene Ryabinkin <rea-fbsd@codelabs.ru> Date: Sun, 21 Dec 2008 16:31:31 +0300 Subject: [PATCH 2/3] net/openospfd: add comments to the FreeBSD patches for OpenOSPFD Signed-off-by: Eygene Ryabinkin <rea-fbsd@codelabs.ru> --- net/openospfd/files/patch-ospfctl_parser.c | 6 ++++++ net/openospfd/files/patch-ospfctl_parser.h | 6 ++++++ net/openospfd/files/patch-ospfd_carp.c | 2 ++ net/openospfd/files/patch-ospfd_kroute.c | 9 +++++++++ net/openospfd/files/patch-ospfd_ospfd.c | 2 ++ net/openospfd/files/patch-ospfd_ospfd.h | 2 ++ net/openospfd/files/patch-ospfd_packet.c | 7 +++++++ net/openospfd/files/patch-ospfd_parse.y | 2 ++ 8 files changed, 36 insertions(+), 0 deletions(-) diff --git a/net/openospfd/files/patch-ospfctl_parser.c b/net/openospfd/files/patch-ospfctl_parser.c index ad85723..ddbf159 100644 --- a/net/openospfd/files/patch-ospfctl_parser.c +++ b/net/openospfd/files/patch-ospfctl_parser.c @@ -1,3 +1,9 @@ +Move 'struct token' and 'enum token_type' definitions from parser.c +to parser.h + +We need this because parser.h references 'struct token' and it is in turn +references 'enum token_type'. + --- ospfctl/parser.c.orig 2008-02-07 19:13:50.000000000 +0300 +++ ospfctl/parser.c 2008-02-07 19:15:47.000000000 +0300 @@ -32,23 +32,6 @@ diff --git a/net/openospfd/files/patch-ospfctl_parser.h b/net/openospfd/files/patch-ospfctl_parser.h index 677bee2..ad0aa42 100644 --- a/net/openospfd/files/patch-ospfctl_parser.h +++ b/net/openospfd/files/patch-ospfctl_parser.h @@ -1,3 +1,9 @@ +Move 'struct token' and 'enum token_type' definitions from parser.c +to parser.h + +We need this because parser.h references 'struct token' and it is in turn +references 'enum token_type'. + --- ospfctl/parser.h.orig 2008-02-07 19:12:58.000000000 +0300 +++ ospfctl/parser.h 2008-02-07 19:15:45.000000000 +0300 @@ -50,6 +50,16 @@ diff --git a/net/openospfd/files/patch-ospfd_carp.c b/net/openospfd/files/patch-ospfd_carp.c index 798643b..a4c66a5 100644 --- a/net/openospfd/files/patch-ospfd_carp.c +++ b/net/openospfd/files/patch-ospfd_carp.c @@ -1,3 +1,5 @@ +Disable CARP demotion support + --- ospfd/carp.c.orig 2008-02-07 18:26:32.000000000 +0300 +++ ospfd/carp.c 2008-02-07 18:39:58.000000000 +0300 @@ -29,6 +29,13 @@ diff --git a/net/openospfd/files/patch-ospfd_kroute.c b/net/openospfd/files/patch-ospfd_kroute.c index 2e270f4..b5f0d22 100644 --- a/net/openospfd/files/patch-ospfd_kroute.c +++ b/net/openospfd/files/patch-ospfd_kroute.c @@ -1,3 +1,12 @@ +Disable some stuff that is absent in FreeBSD + +- route labeling; +- multipath routing flag; +- multiple routing tables support. + +And use FreeBSD-specific names for route-related structures +instead of OpenBSD-specific ones. + --- ospfd/kroute.c.orig 2007-10-18 00:52:42.000000000 +0400 +++ ospfd/kroute.c 2008-12-19 18:07:06.000000000 +0300 @@ -1024,9 +1024,11 @@ diff --git a/net/openospfd/files/patch-ospfd_ospfd.c b/net/openospfd/files/patch-ospfd_ospfd.c index 419eb4f..58e7ddd 100644 --- a/net/openospfd/files/patch-ospfd_ospfd.c +++ b/net/openospfd/files/patch-ospfd_ospfd.c @@ -1,3 +1,5 @@ +Disable CARP demotion support + --- ospfd/ospfd.c.orig 2008-02-07 18:31:27.000000000 +0300 +++ ospfd/ospfd.c 2008-02-07 18:41:46.000000000 +0300 @@ -300,7 +300,9 @@ diff --git a/net/openospfd/files/patch-ospfd_ospfd.h b/net/openospfd/files/patch-ospfd_ospfd.h index bcd1f6d..363712d 100644 --- a/net/openospfd/files/patch-ospfd_ospfd.h +++ b/net/openospfd/files/patch-ospfd_ospfd.h @@ -1,3 +1,5 @@ +Define macro LINK_STATE_IS_UP + --- ospfd/ospfd.h.orig 2008-02-07 18:57:03.000000000 +0300 +++ ospfd/ospfd.h 2008-02-07 18:56:54.000000000 +0300 @@ -320,6 +320,10 @@ diff --git a/net/openospfd/files/patch-ospfd_packet.c b/net/openospfd/files/patch-ospfd_packet.c index cceb302..c490034 100644 --- a/net/openospfd/files/patch-ospfd_packet.c +++ b/net/openospfd/files/patch-ospfd_packet.c @@ -1,3 +1,10 @@ +Add some FreeBSD/NetBSD specifics + +- FreeBSD/NetBSD require IP packet length to be in the host's byte order; +- FreeBSD/NetBSD substracts IP header length from the packet length, + (see sys/netinet/ip_input.c, routine ip_input); OpenBSD wants to see + the unmodified length. + --- ospfd/packet.c.orig 2006-11-17 11:55:31.000000000 +0300 +++ ospfd/packet.c 2008-02-13 22:13:04.000000000 +0300 @@ -36,7 +36,7 @@ diff --git a/net/openospfd/files/patch-ospfd_parse.y b/net/openospfd/files/patch-ospfd_parse.y index 6c40c3e..7cf7fc2 100644 --- a/net/openospfd/files/patch-ospfd_parse.y +++ b/net/openospfd/files/patch-ospfd_parse.y @@ -1,3 +1,5 @@ +Disable CARP demotion support + --- ospfd/parse.y.orig 2008-02-26 13:09:58.000000000 +0300 +++ ospfd/parse.y 2008-12-19 17:52:39.000000000 +0300 @@ -503,6 +503,11 @@ -- 1.6.0.5 --- update-to-4.3-pack2.diff ends here --- Patch for libevent-related issue and fix for ARP-v2 stuff in 8-CURRENT: --- update-to-4.3-pack3.diff begins here --- >From b7c9024649187eabede98eb12cc7d0bc8e5fa24b Mon Sep 17 00:00:00 2001 From: Eygene Ryabinkin <rea-fbsd@codelabs.ru> Date: Tue, 23 Dec 2008 14:53:47 +0300 Subject: [PATCH 3/3] More fixes to OpenOSPFD Add patch for libevent 'event' argument processing: both read and write flags could be set for a single event. Add patch for FreeBSD 8-CURRENT ARP-v2 rework: ARP addresses are now moved from the main routing table, so there is no need to check RTF_LLINFO flag. Signed-off-by: Eygene Ryabinkin <rea-fbsd@codelabs.ru> --- net/openospfd/files/patch-RTF_LLINFO-ARP-v2-fix | 50 ++++ net/openospfd/files/patch-fix-libevent-READ-WRITE | 300 +++++++++++++++++++++ 2 files changed, 350 insertions(+), 0 deletions(-) create mode 100644 net/openospfd/files/patch-RTF_LLINFO-ARP-v2-fix create mode 100644 net/openospfd/files/patch-fix-libevent-READ-WRITE diff --git a/net/openospfd/files/patch-RTF_LLINFO-ARP-v2-fix b/net/openospfd/files/patch-RTF_LLINFO-ARP-v2-fix new file mode 100644 index 0000000..f333795 --- /dev/null +++ b/net/openospfd/files/patch-RTF_LLINFO-ARP-v2-fix @@ -0,0 +1,50 @@ +From 1138f09b72a42ddb7b35780da0e51a0b378bea1b Mon Sep 17 00:00:00 2001 +From: Eygene Ryabinkin <rea-fbsd@codelabs.ru> +Date: Mon, 22 Dec 2008 12:13:13 +0300 +Subject: [PATCH] Fix usage of RTF_LLINFO due to the ARP-v2 changes + +ARP-v2, commited in SVN rev 186119, eliminated RTF_WASCLONE, +RTF_CLONING and RTF_LLINFO, + http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/net/route.h?rev=1.77 + +The latter flag was used in OpenOSPFD to skip ARP entries from the +routing table. We're just conditionalizing the code on the existence of +RTF_LLINFO variable. Perhaps checking __FreeBSD__ value will be better: +errors due to the non-included net/route.h won't be spotted in the +former case. But since many RTF_* constants are used in kroute.c, this +shouldn't be a problem, at least now. + +Signed-off-by: Eygene Ryabinkin <rea-fbsd@codelabs.ru> +--- + ospfd/kroute.c | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/ospfd/kroute.c b/ospfd/kroute.c +index b46fa30..acc2a32 100644 +--- ospfd/kroute.c ++++ ospfd/kroute.c +@@ -1174,8 +1174,10 @@ fetchtable(void) + if ((sa = rti_info[RTAX_DST]) == NULL) + continue; + ++#if defined(RTF_LLINFO) /* FreeBSD dropped RTF_LLINFO after ARP-v2 rework */ + if (rtm->rtm_flags & RTF_LLINFO) /* arp cache */ + continue; ++#endif /* defined(RTF_LLINFO) */ + + if ((kr = calloc(1, sizeof(struct kroute_node))) == NULL) { + log_warn("fetchtable"); +@@ -1371,8 +1373,10 @@ dispatch_rtmsg(void) + if (rtm->rtm_errno) /* failed attempts... */ + continue; + ++#if defined(RTF_LLINFO) /* FreeBSD dropped RTF_LLINFO after ARP-v2 rework */ + if (rtm->rtm_flags & RTF_LLINFO) /* arp cache */ + continue; ++#endif /* defined(RTF_LLINFO) */ + + #ifdef RTF_MPATH + if (rtm->rtm_flags & RTF_MPATH) +-- +1.6.0.4 + diff --git a/net/openospfd/files/patch-fix-libevent-READ-WRITE b/net/openospfd/files/patch-fix-libevent-READ-WRITE new file mode 100644 index 0000000..d74e804 --- /dev/null +++ b/net/openospfd/files/patch-fix-libevent-READ-WRITE @@ -0,0 +1,300 @@ +From 490cb06ef878bff1e45acf313105205df7baced1 Mon Sep 17 00:00:00 2001 +From: Eygene Ryabinkin <rea-fbsd@codelabs.ru> +Date: Sun, 21 Dec 2008 15:18:11 +0300 +Subject: [PATCH] Add processing of both READ and WRITE events inside libevent handlers + +If both read and write descriptors are ready, then libevent will set +both EV_READ and EV_WRITE. Original OpenOSPFD sources were not ready to +handle such situations, but OpenBSD's libevent (1.3e with some local +tweaks) and even libevent 1.0 can also produce combined read/write +events (if manual page is correct ;). + +Such errors were seen in the wild, for example Remko Lodder had been +biten by this issue. + +I had created inline function that will be called from both 6 places +that are handling READ/WRITE events to eliminate code duplication. + +Signed-off-by: Eygene Ryabinkin <rea-fbsd@codelabs.ru> +--- + ospfd/libevent_helpers.h | 81 ++++++++++++++++++++++++++++++++++++++++++++++ + ospfd/ospfd.c | 31 ++---------------- + ospfd/ospfe.c | 39 ++++----------------- + ospfd/rde.c | 31 ++---------------- + 4 files changed, 95 insertions(+), 87 deletions(-) + create mode 100644 ospfd/libevent_helpers.h + +diff --git a/ospfd/libevent_helpers.h b/ospfd/libevent_helpers.h +new file mode 100644 +index 0000000..46f743d +--- /dev/null ++++ ospfd/libevent_helpers.h +@@ -0,0 +1,81 @@ ++/* ++ * Copyright (c) 2008 Eygene Ryabinkin <rea-fbsd@codelabs.ru> ++ * ++ * Permission to use, copy, modify, and distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++ ++#ifndef _LIBEVENT_HELPERS_H_ ++#define _LIBEVENT_HELPERS_H_ ++ ++#include <stdio.h> ++#include <sys/types.h> ++ ++#include "log.h" ++#include "ospfd.h" ++ ++/* Inline functions */ ++ ++/* ++ * A support function that processes libevent notification in the ++ * following way: ++ * - if we are ready to write, we will try to flush the queue; ++ * - if we are ready to read, we will read the input buffer and ++ * prepare variables 'n' and 'shut' accordingly. ++ * ++ * Such handling occurs at least 6 times within the OSPFD sources, ++ * so this inline function is just an alternative to the preprocessor ++ * macros. ++ * ++ * Function returns 0 if everything was handled and no further ++ * processing is needed; it returns EV_READ if the read processing ++ * was prepared to take place. ++ */ ++static inline short ++dispatch_read_write_event(short _event, struct imsgbuf *_ibuf, ++ ssize_t *_n, int *_shut) __attribute__((always_inline)); ++ ++static inline short ++dispatch_read_write_event(short event, struct imsgbuf *ibuf, ++ ssize_t *n, int *shut) ++{ ++ static char errbuf[128]; ++ ++ /* ++ * We can have both EV_READ and EV_WRITE, since we can be ++ * subscribed to both event types. Handle write readiness ++ * first (flush the queue) and then handle reads. ++ */ ++ if ((event & ~(EV_WRITE|EV_READ))) { ++ snprintf(errbuf, sizeof(errbuf), ++ "unknown event 0x%hx", (unsigned short)event); ++ fatalx(errbuf); ++ } ++ ++ if ((event & EV_WRITE)) { ++ if (msgbuf_write(&ibuf->w) == -1) ++ fatal("msgbuf_write"); ++ imsg_event_add(ibuf); ++ } ++ if ((event & EV_READ)) { ++ if ((*n = imsg_read(ibuf)) == -1) ++ fatal("imsg_read error"); ++ if (*n == 0) /* connection closed */ ++ *shut = 1; ++ return EV_READ; ++ } else { ++ return 0; ++ } ++ /* NOTREACHED */ ++} ++ ++#endif /* _LIBEVENT_HELPERS_H_ */ +diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c +index be69cab..4e62d09 100644 +--- ospfd/ospfd.c ++++ ospfd/ospfd.c +@@ -46,6 +46,7 @@ + #include "control.h" + #include "log.h" + #include "rde.h" ++#include "libevent_helpers.h" + + void main_sig_handler(int, short, void *); + __dead void usage(void); +@@ -355,21 +356,8 @@ main_dispatch_ospfe(int fd, short event, void *bula) + ssize_t n; + int shut = 0; + +- switch (event) { +- case EV_READ: +- if ((n = imsg_read(ibuf)) == -1) +- fatal("imsg_read error"); +- if (n == 0) /* connection closed */ +- shut = 1; +- break; +- case EV_WRITE: +- if (msgbuf_write(&ibuf->w) == -1) +- fatal("msgbuf_write"); +- imsg_event_add(ibuf); ++ if (dispatch_read_write_event(event, ibuf, &n, &shut) != EV_READ) + return; +- default: +- fatalx("unknown event"); +- } + + for (;;) { + if ((n = imsg_get(ibuf, &imsg)) == -1) +@@ -434,21 +422,8 @@ main_dispatch_rde(int fd, short event, void *bula) + ssize_t n; + int count, shut = 0; + +- switch (event) { +- case EV_READ: +- if ((n = imsg_read(ibuf)) == -1) +- fatal("imsg_read error"); +- if (n == 0) /* connection closed */ +- shut = 1; +- break; +- case EV_WRITE: +- if (msgbuf_write(&ibuf->w) == -1) +- fatal("msgbuf_write"); +- imsg_event_add(ibuf); ++ if (dispatch_read_write_event(event, ibuf, &n, &shut) != EV_READ) + return; +- default: +- fatalx("unknown event"); +- } + + for (;;) { + if ((n = imsg_get(ibuf, &imsg)) == -1) +diff --git a/ospfd/ospfe.c b/ospfd/ospfe.c +index af7a406..d6a6aa9 100644 +--- ospfd/ospfe.c ++++ ospfd/ospfe.c +@@ -42,6 +42,7 @@ + #include "rde.h" + #include "control.h" + #include "log.h" ++#include "libevent_helpers.h" + + void ospfe_sig_handler(int, short, void *); + void ospfe_shutdown(void); +@@ -257,23 +258,11 @@ ospfe_dispatch_main(int fd, short event, void *bula) + struct iface *iface = NULL; + struct kif *kif; + struct auth_md md; +- int n, link_ok, stub_changed, shut = 0; +- +- switch (event) { +- case EV_READ: +- if ((n = imsg_read(ibuf)) == -1) +- fatal("imsg_read error"); +- if (n == 0) /* connection closed */ +- shut = 1; +- break; +- case EV_WRITE: +- if (msgbuf_write(&ibuf->w) == -1) +- fatal("msgbuf_write"); +- imsg_event_add(ibuf); ++ int link_ok, stub_changed, shut = 0; ++ ssize_t n; ++ ++ if (dispatch_read_write_event(event, ibuf, &n, &shut) != EV_READ) + return; +- default: +- fatalx("unknown event"); +- } + + for (;;) { + if ((n = imsg_get(ibuf, &imsg)) == -1) +@@ -401,24 +390,12 @@ ospfe_dispatch_rde(int fd, short event, void *bula) + struct lsa_entry *le; + struct imsg imsg; + struct abr_rtr ar; +- int n, noack = 0, shut = 0; ++ int noack = 0, shut = 0; + u_int16_t l, age; ++ ssize_t n; + +- switch (event) { +- case EV_READ: +- if ((n = imsg_read(ibuf)) == -1) +- fatal("imsg_read error"); +- if (n == 0) /* connection closed */ +- shut = 1; +- break; +- case EV_WRITE: +- if (msgbuf_write(&ibuf->w) == -1) +- fatal("msgbuf_write"); +- imsg_event_add(ibuf); ++ if (dispatch_read_write_event(event, ibuf, &n, &shut) != EV_READ) + return; +- default: +- fatalx("unknown event"); +- } + + for (;;) { + if ((n = imsg_get(ibuf, &imsg)) == -1) +diff --git a/ospfd/rde.c b/ospfd/rde.c +index 5dd0623..faa0c23 100644 +--- ospfd/rde.c ++++ ospfd/rde.c +@@ -37,6 +37,7 @@ + #include "ospfe.h" + #include "log.h" + #include "rde.h" ++#include "libevent_helpers.h" + + void rde_sig_handler(int sig, short, void *); + void rde_shutdown(void); +@@ -239,21 +240,8 @@ rde_dispatch_imsg(int fd, short event, void *bula) + int r, state, self, shut = 0; + u_int16_t l; + +- switch (event) { +- case EV_READ: +- if ((n = imsg_read(ibuf)) == -1) +- fatal("imsg_read error"); +- if (n == 0) /* connection closed */ +- shut = 1; +- break; +- case EV_WRITE: +- if (msgbuf_write(&ibuf->w) == -1) +- fatal("msgbuf_write"); +- imsg_event_add(ibuf); ++ if (dispatch_read_write_event(event, ibuf, &n, &shut) != EV_READ) + return; +- default: +- fatalx("unknown event"); +- } + + clock_gettime(CLOCK_MONOTONIC, &tp); + now = tp.tv_sec; +@@ -584,21 +572,8 @@ rde_dispatch_parent(int fd, short event, void *bula) + ssize_t n; + int shut = 0; + +- switch (event) { +- case EV_READ: +- if ((n = imsg_read(ibuf)) == -1) +- fatal("imsg_read error"); +- if (n == 0) /* connection closed */ +- shut = 1; +- break; +- case EV_WRITE: +- if (msgbuf_write(&ibuf->w) == -1) +- fatal("msgbuf_write"); +- imsg_event_add(ibuf); ++ if (dispatch_read_write_event(event, ibuf, &n, &shut) != EV_READ) + return; +- default: +- fatalx("unknown event"); +- } + + for (;;) { + if ((n = imsg_get(ibuf, &imsg)) == -1) +-- +1.6.0.5 + -- 1.6.0.5 --- update-to-4.3-pack3.diff ends here --- ARP-v2 is added here: http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/net/route.h?rev=1.77 And ARP-v2 patch for OpenOSPFD was slightly discuissed here: http://lists.freebsd.org/pipermail/freebsd-current/2008-December/001447.html >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20081223123535.663791AF425>