protocol.c (a432c771e2d9bc059ffe3028faf040c08b6a9f98) | protocol.c (0c5dc070ff3d6246d22ddd931f23a6266249e3db) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* SCTP kernel implementation 3 * (C) Copyright IBM Corp. 2001, 2004 4 * Copyright (c) 1999-2000 Cisco, Inc. 5 * Copyright (c) 1999-2001 Motorola, Inc. 6 * Copyright (c) 2001 Intel Corp. 7 * Copyright (c) 2001 Nokia, Inc. 8 * Copyright (c) 2001 La Monte H.P. Yarroll --- 240 unchanged lines hidden (view full) --- 249 250/* Initialize sk->sk_daddr from sctp_addr. */ 251static void sctp_v4_to_sk_daddr(union sctp_addr *addr, struct sock *sk) 252{ 253 inet_sk(sk)->inet_daddr = addr->v4.sin_addr.s_addr; 254} 255 256/* Initialize a sctp_addr from an address parameter. */ | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* SCTP kernel implementation 3 * (C) Copyright IBM Corp. 2001, 2004 4 * Copyright (c) 1999-2000 Cisco, Inc. 5 * Copyright (c) 1999-2001 Motorola, Inc. 6 * Copyright (c) 2001 Intel Corp. 7 * Copyright (c) 2001 Nokia, Inc. 8 * Copyright (c) 2001 La Monte H.P. Yarroll --- 240 unchanged lines hidden (view full) --- 249 250/* Initialize sk->sk_daddr from sctp_addr. */ 251static void sctp_v4_to_sk_daddr(union sctp_addr *addr, struct sock *sk) 252{ 253 inet_sk(sk)->inet_daddr = addr->v4.sin_addr.s_addr; 254} 255 256/* Initialize a sctp_addr from an address parameter. */ |
257static void sctp_v4_from_addr_param(union sctp_addr *addr, | 257static bool sctp_v4_from_addr_param(union sctp_addr *addr, |
258 union sctp_addr_param *param, 259 __be16 port, int iif) 260{ | 258 union sctp_addr_param *param, 259 __be16 port, int iif) 260{ |
261 if (ntohs(param->v4.param_hdr.length) < sizeof(struct sctp_ipv4addr_param)) 262 return false; 263 |
|
261 addr->v4.sin_family = AF_INET; 262 addr->v4.sin_port = port; 263 addr->v4.sin_addr.s_addr = param->v4.addr.s_addr; 264 memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero)); | 264 addr->v4.sin_family = AF_INET; 265 addr->v4.sin_port = port; 266 addr->v4.sin_addr.s_addr = param->v4.addr.s_addr; 267 memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero)); |
268 269 return true; |
|
265} 266 267/* Initialize an address parameter from a sctp_addr and return the length 268 * of the address parameter. 269 */ 270static int sctp_v4_to_addr_param(const union sctp_addr *addr, 271 union sctp_addr_param *param) 272{ --- 572 unchanged lines hidden (view full) --- 845{ 846 SCTP_INPUT_CB(skb)->encap_port = udp_hdr(skb)->source; 847 848 skb_set_transport_header(skb, sizeof(struct udphdr)); 849 sctp_rcv(skb); 850 return 0; 851} 852 | 270} 271 272/* Initialize an address parameter from a sctp_addr and return the length 273 * of the address parameter. 274 */ 275static int sctp_v4_to_addr_param(const union sctp_addr *addr, 276 union sctp_addr_param *param) 277{ --- 572 unchanged lines hidden (view full) --- 850{ 851 SCTP_INPUT_CB(skb)->encap_port = udp_hdr(skb)->source; 852 853 skb_set_transport_header(skb, sizeof(struct udphdr)); 854 sctp_rcv(skb); 855 return 0; 856} 857 |
858static int sctp_udp_err_lookup(struct sock *sk, struct sk_buff *skb) 859{ 860 struct sctp_association *asoc; 861 struct sctp_transport *t; 862 int family; 863 864 skb->transport_header += sizeof(struct udphdr); 865 family = (ip_hdr(skb)->version == 4) ? AF_INET : AF_INET6; 866 sk = sctp_err_lookup(dev_net(skb->dev), family, skb, sctp_hdr(skb), 867 &asoc, &t); 868 if (!sk) 869 return -ENOENT; 870 871 sctp_err_finish(sk, t); 872 return 0; 873} 874 |
|
853int sctp_udp_sock_start(struct net *net) 854{ 855 struct udp_tunnel_sock_cfg tuncfg = {NULL}; 856 struct udp_port_cfg udp_conf = {0}; 857 struct socket *sock; 858 int err; 859 860 udp_conf.family = AF_INET; 861 udp_conf.local_ip.s_addr = htonl(INADDR_ANY); 862 udp_conf.local_udp_port = htons(net->sctp.udp_port); 863 err = udp_sock_create(net, &udp_conf, &sock); 864 if (err) { 865 pr_err("Failed to create the SCTP UDP tunneling v4 sock\n"); 866 return err; 867 } 868 869 tuncfg.encap_type = 1; 870 tuncfg.encap_rcv = sctp_udp_rcv; | 875int sctp_udp_sock_start(struct net *net) 876{ 877 struct udp_tunnel_sock_cfg tuncfg = {NULL}; 878 struct udp_port_cfg udp_conf = {0}; 879 struct socket *sock; 880 int err; 881 882 udp_conf.family = AF_INET; 883 udp_conf.local_ip.s_addr = htonl(INADDR_ANY); 884 udp_conf.local_udp_port = htons(net->sctp.udp_port); 885 err = udp_sock_create(net, &udp_conf, &sock); 886 if (err) { 887 pr_err("Failed to create the SCTP UDP tunneling v4 sock\n"); 888 return err; 889 } 890 891 tuncfg.encap_type = 1; 892 tuncfg.encap_rcv = sctp_udp_rcv; |
871 tuncfg.encap_err_lookup = sctp_udp_v4_err; | 893 tuncfg.encap_err_lookup = sctp_udp_err_lookup; |
872 setup_udp_tunnel_sock(net, sock, &tuncfg); 873 net->sctp.udp4_sock = sock->sk; 874 875#if IS_ENABLED(CONFIG_IPV6) 876 memset(&udp_conf, 0, sizeof(udp_conf)); 877 878 udp_conf.family = AF_INET6; 879 udp_conf.local_ip6 = in6addr_any; --- 5 unchanged lines hidden (view full) --- 885 pr_err("Failed to create the SCTP UDP tunneling v6 sock\n"); 886 udp_tunnel_sock_release(net->sctp.udp4_sock->sk_socket); 887 net->sctp.udp4_sock = NULL; 888 return err; 889 } 890 891 tuncfg.encap_type = 1; 892 tuncfg.encap_rcv = sctp_udp_rcv; | 894 setup_udp_tunnel_sock(net, sock, &tuncfg); 895 net->sctp.udp4_sock = sock->sk; 896 897#if IS_ENABLED(CONFIG_IPV6) 898 memset(&udp_conf, 0, sizeof(udp_conf)); 899 900 udp_conf.family = AF_INET6; 901 udp_conf.local_ip6 = in6addr_any; --- 5 unchanged lines hidden (view full) --- 907 pr_err("Failed to create the SCTP UDP tunneling v6 sock\n"); 908 udp_tunnel_sock_release(net->sctp.udp4_sock->sk_socket); 909 net->sctp.udp4_sock = NULL; 910 return err; 911 } 912 913 tuncfg.encap_type = 1; 914 tuncfg.encap_rcv = sctp_udp_rcv; |
893 tuncfg.encap_err_lookup = sctp_udp_v6_err; | 915 tuncfg.encap_err_lookup = sctp_udp_err_lookup; |
894 setup_udp_tunnel_sock(net, sock, &tuncfg); 895 net->sctp.udp6_sock = sock->sk; 896#endif 897 898 return 0; 899} 900 901void sctp_udp_sock_stop(struct net *net) --- 247 unchanged lines hidden (view full) --- 1149 return sctp_rcv(skb); 1150} 1151 1152/* Register with IP layer. */ 1153static const struct net_protocol sctp_protocol = { 1154 .handler = sctp4_rcv, 1155 .err_handler = sctp_v4_err, 1156 .no_policy = 1, | 916 setup_udp_tunnel_sock(net, sock, &tuncfg); 917 net->sctp.udp6_sock = sock->sk; 918#endif 919 920 return 0; 921} 922 923void sctp_udp_sock_stop(struct net *net) --- 247 unchanged lines hidden (view full) --- 1171 return sctp_rcv(skb); 1172} 1173 1174/* Register with IP layer. */ 1175static const struct net_protocol sctp_protocol = { 1176 .handler = sctp4_rcv, 1177 .err_handler = sctp_v4_err, 1178 .no_policy = 1, |
1179 .netns_ok = 1, |
|
1157 .icmp_strict_tag_validation = 1, 1158}; 1159 1160/* IPv4 address related functions. */ 1161static struct sctp_af sctp_af_inet = { 1162 .sa_family = AF_INET, 1163 .sctp_xmit = sctp_v4_xmit, 1164 .setsockopt = ip_setsockopt, --- 559 unchanged lines hidden --- | 1180 .icmp_strict_tag_validation = 1, 1181}; 1182 1183/* IPv4 address related functions. */ 1184static struct sctp_af sctp_af_inet = { 1185 .sa_family = AF_INET, 1186 .sctp_xmit = sctp_v4_xmit, 1187 .setsockopt = ip_setsockopt, --- 559 unchanged lines hidden --- |