]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Merge commit 'ef4a50be10c6dd0abffd957132cd146029c3d79d' into integrated
authorOndrej Zajicek <santiago@crfreenet.org>
Tue, 30 Jul 2013 21:48:07 +0000 (23:48 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Tue, 30 Jul 2013 21:48:07 +0000 (23:48 +0200)
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

1  2 
lib/socket.h
nest/config.Y
proto/ospf/config.Y
proto/ospf/iface.c
proto/ospf/ospf.h
proto/rip/config.Y
proto/rip/rip.c
proto/rip/rip.h
sysdep/bsd/sysio.h
sysdep/linux/sysio.h
sysdep/unix/io.c

diff --cc lib/socket.h
index 353e9573e21231c3b229beb1a0b612589fdbbd6c,fbddfb4c667edf214717dd5f77cbcf1418b25cd9..a68ef490ece3277d891e666e1e8e6aebf1f144c8
@@@ -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 171a23c792f4462a70c0084aaafaae8ec7cd0da7,b85a57336c9f1f2ff89e3c19203729605644a2cf..791db8883264f1644181ea36604db7387f85d708
@@@ -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 <ro> roa_args
  %type <rot> roa_table_arg
  %type <sd> sym_args
- %type <i> 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 <i> 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 <i> 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 <ps> proto_patt proto_patt2
  %type <g> limit_spec
  
index b43ef8a88c0a1048c242ed29a76d46fbd16a0db0,d9379a7cf25e1725d7efb63edb8302afad77dbfb..2350deaf1cad2c49b3db08be989df2e9349db0d6
@@@ -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"); } 
 - | password_list
+  | TX tos { OSPF_PATT->tx_tos = $2; }
+  | TX PRIORITY expr { OSPF_PATT->tx_priority = $3; }
 + | password_list { ospf_check_auth(); }
   ;
  
  pref_list:
Simple merge
Simple merge
index ad41ffab01c08b1ec845d7d3728f7b60f689a0e0,ec82aa3d40c3425a155a47cd0a69a63175b8784a..4b57a9bf1f4a036b6d03d549b68ad27b14f99c6d
@@@ -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 <i> rip_mode rip_auth
diff --cc proto/rip/rip.c
index 6de712b2c8de783f37fa20d0746cd4e108201c87,c09eae79f5e821244563083ecbb0c3057b71ee5f..f59487ddd069e5bd39ecf428028088633502c3bf
@@@ -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 proto/rip/rip.h
Simple merge
index 607d28ffba6067c14e2ac549c8fa898fd35822cc,085f16fad13692411f870769fd116191ef46ccd7..3506f56fc83aca49b286252818e8b19dd0582a3f
@@@ -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;
+ }
index e6daa31f8633e26f4289e2a759c464ac54ba54f5,41287e7121eeda6a51ac0d189f158db99025aa3f..13f3713e4b8f4c1b733c36fe05994d645e0c9956
@@@ -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;
+ }
++
index c45e586608461bffb821c3f80e0d235e9af90a67,434a05bed53883b394a57659fb6fa26e46b0aa79..93fe06e9968ba210ca4318f39392d9bd4ffebded
@@@ -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");
  
 -#ifdef IPV6
 -  int v = 1;
 -  if ((s->flags & SKF_V6ONLY) && setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &v, sizeof(v)) < 0)
 -    WARN("IPV6_V6ONLY");
 -#endif
 -
+   if (s->priority >= 0)
+     sk_set_priority(s, s->priority);
 +  // 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;
  }