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 */
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)
%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
| 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:
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
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) {
#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;
+ }
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;
+ }
++
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;
}