From: Ondrej Zajicek Date: Tue, 30 Jul 2013 21:48:07 +0000 (+0200) Subject: Merge commit 'ef4a50be10c6dd0abffd957132cd146029c3d79d' into integrated X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9cf24ba8e778020f2ac037251655b3e771d6e3f5;p=thirdparty%2Fbird.git Merge commit 'ef4a50be10c6dd0abffd957132cd146029c3d79d' into integrated Conflicts: lib/ipv6.h nest/config.Y proto/ospf/config.Y proto/rip/rip.c sysdep/bsd/sysio.h sysdep/linux/sysio.h sysdep/unix/io.c --- 9cf24ba8e778020f2ac037251655b3e771d6e3f5 diff --cc lib/socket.h index 353e9573e,fbddfb4c6..a68ef490e --- a/lib/socket.h +++ b/lib/socket.h @@@ -70,20 -69,20 +71,21 @@@ int sk_setup_multicast(sock *s) int sk_join_group(sock *s, ip_addr maddr); int sk_leave_group(sock *s, ip_addr maddr); -#ifdef IPV6 int sk_set_ipv6_checksum(sock *s, int offset); -int sk_set_icmp_filter(sock *s, int p1, int p2); -#endif - +int sk_set_icmp6_filter(sock *s, int p1, int p2); int sk_set_broadcast(sock *s, int enable); -static inline int -sk_send_buffer_empty(sock *sk) -{ - return sk->tbuf == sk->tpos; -} +static inline int sk_send_buffer_empty(sock *sk) +{ return sk->tbuf == sk->tpos; } + +static inline int sk_is_ipv4(sock *sk) +{ return sk->af == AF_INET; } + +static inline int sk_is_ipv6(sock *sk) +{ return sk->af == AF_INET6; } + + extern int sk_priority_control; /* Suggested priority for control traffic, should be sysdep define */ /* Socket flags */ diff --cc nest/config.Y index 171a23c79,b85a57336..791db8883 --- a/nest/config.Y +++ b/nest/config.Y @@@ -44,12 -44,11 +44,12 @@@ CF_DECL CF_KEYWORDS(ROUTER, ID, PROTOCOL, TEMPLATE, PREFERENCE, DISABLED, DEBUG, ALL, OFF, DIRECT) CF_KEYWORDS(INTERFACE, IMPORT, EXPORT, FILTER, NONE, TABLE, STATES, ROUTES, FILTERS) +CF_KEYWORDS(IPV4, IPVX, VPN4, VPN6, MPLS) CF_KEYWORDS(RECEIVE, LIMIT, ACTION, WARN, BLOCK, RESTART, DISABLE, KEEP, FILTERED) CF_KEYWORDS(PASSWORD, FROM, PASSIVE, TO, ID, EVENTS, PACKETS, PROTOCOLS, INTERFACES) -CF_KEYWORDS(PRIMARY, STATS, COUNT, FOR, COMMANDS, PREEXPORT, GENERATE, ROA, MAX, FLUSH) +CF_KEYWORDS(PRIMARY, STATS, COUNT, FOR, COMMANDS, PREEXPORT, GENERATE, ROA, AS, MAX, FLUSH) CF_KEYWORDS(LISTEN, BGP, V6ONLY, DUAL, ADDRESS, PORT, PASSWORDS, DESCRIPTION, SORTED) - CF_KEYWORDS(RELOAD, IN, OUT, MRTDUMP, MESSAGES, RESTRICT, MEMORY, IGP_METRIC) + CF_KEYWORDS(RELOAD, IN, OUT, MRTDUMP, MESSAGES, RESTRICT, MEMORY, IGP_METRIC, CLASS, DSCP) CF_ENUM(T_ENUM_RTS, RTS_, DUMMY, STATIC, INHERIT, DEVICE, STATIC_DEVICE, REDIRECT, RIP, OSPF, OSPF_IA, OSPF_EXT1, OSPF_EXT2, BGP, PIPE) @@@ -66,7 -65,7 +66,7 @@@ CF_ENUM(T_ENUM_ROA, ROA_, UNKNOWN, VALI %type roa_args %type roa_table_arg %type sym_args - %type proto_start echo_mask echo_size debug_mask debug_list debug_flag mrtdump_mask mrtdump_list mrtdump_flag export_or_preexport roa_mode limit_action table_type table_sorted -%type proto_start echo_mask echo_size debug_mask debug_list debug_flag mrtdump_mask mrtdump_list mrtdump_flag export_or_preexport roa_mode limit_action tab_sorted tos ++%type proto_start echo_mask echo_size debug_mask debug_list debug_flag mrtdump_mask mrtdump_list mrtdump_flag export_or_preexport roa_mode limit_action table_type table_sorted tos %type proto_patt proto_patt2 %type limit_spec diff --cc proto/ospf/config.Y index b43ef8a88,d9379a7cf..2350deaf1 --- a/proto/ospf/config.Y +++ b/proto/ospf/config.Y @@@ -295,7 -305,9 +295,9 @@@ ospf_iface_item | RX BUFFER LARGE { OSPF_PATT->rxbuf = OSPF_RXBUF_LARGE ; } | RX BUFFER NORMAL { OSPF_PATT->rxbuf = OSPF_RXBUF_NORMAL ; } | RX BUFFER expr { OSPF_PATT->rxbuf = $3 ; if (($3 < OSPF_RXBUF_MINSIZE) || ($3 > OSPF_MAX_PKT_SIZE)) cf_error("Buffer size must be in range 256-65535"); } + | TX tos { OSPF_PATT->tx_tos = $2; } + | TX PRIORITY expr { OSPF_PATT->tx_priority = $3; } - | password_list + | password_list { ospf_check_auth(); } ; pref_list: diff --cc proto/rip/config.Y index ad41ffab0,ec82aa3d4..4b57a9bf1 --- a/proto/rip/config.Y +++ b/proto/rip/config.Y @@@ -24,10 -24,10 +24,10 @@@ CF_DEFINE CF_DECLS -CF_KEYWORDS(RIP, INFINITY, METRIC, PORT, PERIOD, GARBAGE, TIMEOUT, +CF_KEYWORDS(RIP, RIPNG, INFINITY, METRIC, PORT, PERIOD, GARBAGE, TIMEOUT, MODE, BROADCAST, MULTICAST, QUIET, NOLISTEN, VERSION1, AUTHENTICATION, NONE, PLAINTEXT, MD5, - HONOR, NEVER, NEIGHBOR, ALWAYS, + HONOR, NEVER, NEIGHBOR, ALWAYS, TX, PRIORITY, RIP_METRIC, RIP_TAG) %type rip_mode rip_auth diff --cc proto/rip/rip.c index 6de712b2c,c09eae79f..f59487ddd --- a/proto/rip/rip.c +++ b/proto/rip/rip.c @@@ -709,8 -707,9 +709,9 @@@ new_iface(struct proto *p, struct ifac if (new) { rif->sock->ttl = 1; - rif->sock->tos = IP_PREC_INTERNET_CONTROL; + rif->sock->tos = PATT->tx_tos; + rif->sock->priority = PATT->tx_priority; - rif->sock->flags = SKF_LADDR_RX; + rif->sock->flags |= SKF_LADDR_RX; } if (new) { diff --cc sysdep/bsd/sysio.h index 607d28ffb,085f16fad..3506f56fc --- a/sysdep/bsd/sysio.h +++ b/sysdep/bsd/sysio.h @@@ -219,10 -273,23 +219,19 @@@ sk_set_min_ttl4(sock *s, int ttl #endif -#else /* IPv6 */ - -static int +static inline char * sk_set_min_ttl6(sock *s, int ttl) { - log(L_ERR "IPv6 TTL security not supported"); - return -1; + errno = ENOPROTOOPT; + return "IP_MINTTL"; } -#endif - + + int sk_priority_control = -1; + + static int + sk_set_priority(sock *s, int prio UNUSED) + { + log(L_WARN "Socket priority not supported"); + return -1; + } diff --cc sysdep/linux/sysio.h index e6daa31f8,41287e712..13f3713e4 --- a/sysdep/linux/sysio.h +++ b/sysdep/linux/sysio.h @@@ -233,9 -297,35 +233,27 @@@ static inline char sk_set_min_ttl6(sock *s, int ttl) { if (setsockopt(s->fd, IPPROTO_IPV6, IPV6_MINHOPCOUNT, &ttl, sizeof(ttl)) < 0) - { - if (errno == ENOPROTOOPT) - log(L_ERR "Kernel does not support IPv6 TTL security"); - else - log(L_ERR "sk_set_min_ttl6: setsockopt: %m"); + return "IPV6_MINHOPCOUNT"; - return -1; - } - - return 0; + return NULL; } -#endif - + #ifndef IPV6_TCLASS + #define IPV6_TCLASS 67 + #endif + + int sk_priority_control = 7; + + static int + sk_set_priority(sock *s, int prio) + { + if (setsockopt(s->fd, SOL_SOCKET, SO_PRIORITY, &prio, sizeof(prio)) < 0) + { + log(L_WARN "sk_set_priority: setsockopt: %m"); + return -1; + } + + return 0; + } ++ diff --cc sysdep/unix/io.c index c45e58660,434a05bed..93fe06e99 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@@ -775,26 -781,30 +775,33 @@@ sk_setup(sock *s if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) ERR("fcntl(O_NONBLOCK)"); - if (s->type == SK_UNIX) + + if (!s->af) return NULL; -#ifdef IPV6 - if ((s->tos >= 0) && setsockopt(fd, SOL_IPV6, IPV6_TCLASS, &s->tos, sizeof(s->tos)) < 0) - WARN("IPV6_TCLASS"); -#else - if ((s->tos >= 0) && setsockopt(fd, SOL_IP, IP_TOS, &s->tos, sizeof(s->tos)) < 0) - WARN("IP_TOS"); -#endif + if (sk_is_ipv4(s) && (s->tos >= 0)) + if (setsockopt(fd, SOL_IP, IP_TOS, &s->tos, sizeof(s->tos)) < 0) + WARN("IP_TOS"); + ++ if (sk_is_ipv6(s) && (s->tos >= 0)) ++ if (setsockopt(fd, SOL_IPV6, IPV6_TCLASS, &s->tos, sizeof(s->tos)) < 0) ++ WARN("IPV6_TCLASS"); ++ + if (sk_is_ipv6(s) && (s->flags & SKF_V6ONLY)) + if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one)) < 0) + WARN("IPV6_V6ONLY"); + if (s->priority >= 0) + sk_set_priority(s, s->priority); + -#ifdef IPV6 - int v = 1; - if ((s->flags & SKF_V6ONLY) && setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &v, sizeof(v)) < 0) - WARN("IPV6_V6ONLY"); -#endif - + // XXXX better error handling if (s->ttl >= 0) - err = sk_set_ttl_int(s); + sk_set_ttl(s, s->ttl); - sysio_register_cmsgs(s); + if (sk_is_ipv4(s)) + err = sk_request_pktinfo4(s); + else + err = sk_request_pktinfo6(s); bad: return err; }