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 ---