Lines Matching +full:echo +full:- +full:active +full:- +full:ms
1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * (C) 2012-2014 by sysmocom - s.f.m.c. GmbH
38 /* An active session for the subscriber. */
59 } ms; member
97 } ms; member
141 return jhash_2words((__force u32)ip6->s6_addr32[0], in ipv6_hashfn()
142 (__force u32)ip6->s6_addr32[1], gtp_h_initval); in ipv6_hashfn()
151 head = >p->tid_hash[gtp0_hashfn(tid) % gtp->hash_size]; in gtp0_pdp_find()
154 if (pdp->af == family && in gtp0_pdp_find()
155 pdp->gtp_version == GTP_V0 && in gtp0_pdp_find()
156 pdp->u.v0.tid == tid) in gtp0_pdp_find()
168 head = >p->tid_hash[gtp1u_hashfn(tid) % gtp->hash_size]; in gtp1_pdp_find()
171 if (pdp->af == family && in gtp1_pdp_find()
172 pdp->gtp_version == GTP_V1 && in gtp1_pdp_find()
173 pdp->u.v1.i_tei == tid) in gtp1_pdp_find()
179 /* Resolve a PDP context based on IPv4 address of MS. */
185 head = >p->addr_hash[ipv4_hashfn(ms_addr) % gtp->hash_size]; in ipv4_pdp_find()
188 if (pdp->af == AF_INET && in ipv4_pdp_find()
189 pdp->ms.addr.s_addr == ms_addr) in ipv4_pdp_find()
196 /* 3GPP TS 29.060: PDN Connection: the association between a MS represented by
204 * than those that start with binary 000 have a 64-bit interface ID field
210 return a->s6_addr32[0] == b->s6_addr32[0] && in ipv6_pdp_addr_equal()
211 a->s6_addr32[1] == b->s6_addr32[1]; in ipv6_pdp_addr_equal()
220 head = >p->addr_hash[ipv6_hashfn(ms_addr) % gtp->hash_size]; in ipv6_pdp_find()
223 if (pdp->af == AF_INET6 && in ipv6_pdp_find()
224 ipv6_pdp_addr_equal(&pdp->ms.addr6, ms_addr)) in ipv6_pdp_find()
239 iph = (struct iphdr *)(skb->data + hdrlen); in gtp_check_ms_ipv4()
242 return iph->daddr == pctx->ms.addr.s_addr; in gtp_check_ms_ipv4()
244 return iph->saddr == pctx->ms.addr.s_addr; in gtp_check_ms_ipv4()
256 ip6h = (struct ipv6hdr *)(skb->data + hdrlen); in gtp_check_ms_ipv6()
258 if ((ipv6_addr_type(&ip6h->saddr) & IPV6_ADDR_LINKLOCAL) || in gtp_check_ms_ipv6()
259 (ipv6_addr_type(&ip6h->daddr) & IPV6_ADDR_LINKLOCAL)) in gtp_check_ms_ipv6()
263 ret = ipv6_pdp_addr_equal(&ip6h->daddr, &pctx->ms.addr6); in gtp_check_ms_ipv6()
265 ret = ipv6_pdp_addr_equal(&ip6h->saddr, &pctx->ms.addr6); in gtp_check_ms_ipv6()
295 return -1; in gtp_inner_proto()
305 return -1; in gtp_inner_proto()
315 netdev_dbg(pctx->dev, "No PDP ctx for this MS\n"); in gtp_rx()
321 !net_eq(sock_net(pctx->sk), dev_net(pctx->dev)))) { in gtp_rx()
322 pctx->dev->stats.rx_length_errors++; in gtp_rx()
326 netdev_dbg(pctx->dev, "forwarding packet from GGSN to uplink\n"); in gtp_rx()
335 skb->dev = pctx->dev; in gtp_rx()
337 dev_sw_netstats_rx_add(pctx->dev, skb->len); in gtp_rx()
343 pctx->dev->stats.rx_dropped++; in gtp_rx()
344 return -1; in gtp_rx()
352 fl4->flowi4_oif = sk->sk_bound_dev_if; in ip4_route_output_gtp()
353 fl4->daddr = daddr; in ip4_route_output_gtp()
354 fl4->saddr = saddr; in ip4_route_output_gtp()
355 fl4->flowi4_tos = inet_dscp_to_dsfield(inet_sk_dscp(inet_sk(sk))); in ip4_route_output_gtp()
356 fl4->flowi4_scope = ip_sock_rt_scope(sk); in ip4_route_output_gtp()
357 fl4->flowi4_proto = sk->sk_protocol; in ip4_route_output_gtp()
371 fl6->flowi6_oif = sk->sk_bound_dev_if; in ip6_route_output_gtp()
372 fl6->daddr = *daddr; in ip6_route_output_gtp()
373 fl6->saddr = *saddr; in ip6_route_output_gtp()
374 fl6->flowi6_proto = sk->sk_protocol; in ip6_route_output_gtp()
376 dst = ipv6_stub->ipv6_dst_lookup_flow(net, sk, fl6, NULL); in ip6_route_output_gtp()
378 return ERR_PTR(-ENETUNREACH); in ip6_route_output_gtp()
385 * - TID: is not used and shall be set to 0.
386 * - Flow Label is not used and shall be set to 0
388 * - number: this field is not yet used in signalling messages.
391 * Returns true if the echo req was correct, false otherwise.
395 return !(gtp0->tid || (gtp0->flags ^ 0x1e) || in gtp0_validate_echo_hdr()
396 gtp0->number != 0xff || gtp0->flow); in gtp0_validate_echo_hdr()
404 hdr->flags = 0x1e; /* v0, GTP-non-prime. */ in gtp0_build_echo_msg()
405 hdr->type = msg_type; in gtp0_build_echo_msg()
409 hdr->flow = 0; in gtp0_build_echo_msg()
410 hdr->tid = 0; in gtp0_build_echo_msg()
411 hdr->number = 0xff; in gtp0_build_echo_msg()
412 hdr->spare[0] = 0xff; in gtp0_build_echo_msg()
413 hdr->spare[1] = 0xff; in gtp0_build_echo_msg()
414 hdr->spare[2] = 0xff; in gtp0_build_echo_msg()
420 hdr->length = htons(len_pkt - len_hdr); in gtp0_build_echo_msg()
422 hdr->length = 0; in gtp0_build_echo_msg()
434 rt = ip4_route_output_gtp(&fl4, gtp->sk0, iph->saddr, iph->daddr); in gtp0_send_echo_resp_ip()
436 netdev_dbg(gtp->dev, "no route for echo response from %pI4\n", in gtp0_send_echo_resp_ip()
437 &iph->saddr); in gtp0_send_echo_resp_ip()
438 return -1; in gtp0_send_echo_resp_ip()
441 udp_tunnel_xmit_skb(rt, gtp->sk0, skb, in gtp0_send_echo_resp_ip()
443 iph->tos, in gtp0_send_echo_resp_ip()
444 ip4_dst_hoplimit(&rt->dst), in gtp0_send_echo_resp_ip()
447 !net_eq(sock_net(gtp->sk1u), in gtp0_send_echo_resp_ip()
448 dev_net(gtp->dev)), in gtp0_send_echo_resp_ip()
460 gtp0 = (struct gtp0_header *)(skb->data + sizeof(struct udphdr)); in gtp0_send_echo_resp()
463 return -1; in gtp0_send_echo_resp()
465 seq = gtp0->seq; in gtp0_send_echo_resp()
473 gtp0_build_echo_msg(>p_pkt->gtp0_h, GTP_ECHO_RSP); in gtp0_send_echo_resp()
479 gtp_pkt->gtp0_h.seq = seq; in gtp0_send_echo_resp()
481 gtp_pkt->ie.tag = GTPIE_RECOVERY; in gtp0_send_echo_resp()
482 gtp_pkt->ie.val = gtp->restart_count; in gtp0_send_echo_resp()
484 switch (gtp->sk0->sk_family) { in gtp0_send_echo_resp()
487 return -1; in gtp0_send_echo_resp()
490 return -1; in gtp0_send_echo_resp()
497 int flags, u32 type, struct echo_info echo) in gtp_genl_fill_echo() argument
506 if (nla_put_u32(skb, GTPA_VERSION, echo.gtp_version) || in gtp_genl_fill_echo()
507 nla_put_be32(skb, GTPA_PEER_ADDRESS, echo.peer.addr.s_addr) || in gtp_genl_fill_echo()
508 nla_put_be32(skb, GTPA_MS_ADDRESS, echo.ms.addr.s_addr)) in gtp_genl_fill_echo()
516 return -EMSGSIZE; in gtp_genl_fill_echo()
519 static void gtp0_handle_echo_resp_ip(struct sk_buff *skb, struct echo_info *echo) in gtp0_handle_echo_resp_ip() argument
523 echo->ms.addr.s_addr = iph->daddr; in gtp0_handle_echo_resp_ip()
524 echo->peer.addr.s_addr = iph->saddr; in gtp0_handle_echo_resp_ip()
525 echo->gtp_version = GTP_V0; in gtp0_handle_echo_resp_ip()
531 struct echo_info echo; in gtp0_handle_echo_resp() local
535 gtp0 = (struct gtp0_header *)(skb->data + sizeof(struct udphdr)); in gtp0_handle_echo_resp()
538 return -1; in gtp0_handle_echo_resp()
540 switch (gtp->sk0->sk_family) { in gtp0_handle_echo_resp()
542 gtp0_handle_echo_resp_ip(skb, &echo); in gtp0_handle_echo_resp()
545 return -1; in gtp0_handle_echo_resp()
550 return -ENOMEM; in gtp0_handle_echo_resp()
552 ret = gtp_genl_fill_echo(msg, 0, 0, 0, GTP_CMD_ECHOREQ, echo); in gtp0_handle_echo_resp()
558 return genlmsg_multicast_netns(>p_genl_family, dev_net(gtp->dev), in gtp0_handle_echo_resp()
577 /* 1 means pass up to the stack, -1 means drop and 0 means decapsulated. */
587 return -1; in gtp0_udp_encap_recv()
589 gtp0 = (struct gtp0_header *)(skb->data + sizeof(struct udphdr)); in gtp0_udp_encap_recv()
591 if ((gtp0->flags >> 5) != GTP_V0) in gtp0_udp_encap_recv()
596 * handle echo request. in gtp0_udp_encap_recv()
598 if (gtp0->type == GTP_ECHO_REQ && gtp->sk_created) in gtp0_udp_encap_recv()
601 if (gtp0->type == GTP_ECHO_RSP && gtp->sk_created) in gtp0_udp_encap_recv()
604 if (gtp0->type != GTP_TPDU) in gtp0_udp_encap_recv()
608 netdev_dbg(gtp->dev, "GTP packet does not encapsulate an IP packet\n"); in gtp0_udp_encap_recv()
609 return -1; in gtp0_udp_encap_recv()
612 pctx = gtp0_pdp_find(gtp, be64_to_cpu(gtp0->tid), in gtp0_udp_encap_recv()
615 netdev_dbg(gtp->dev, "No PDP ctx to decap skb=%p\n", skb); in gtp0_udp_encap_recv()
619 return gtp_rx(pctx, skb, hdrlen, gtp->role, inner_proto); in gtp0_udp_encap_recv()
628 hdr->flags = 0x32; /* v1, GTP-non-prime. */ in gtp1u_build_echo_msg()
629 hdr->type = msg_type; in gtp1u_build_echo_msg()
630 /* 3GPP TS 29.281 5.1 - TEID has to be set to 0 */ in gtp1u_build_echo_msg()
631 hdr->tid = 0; in gtp1u_build_echo_msg()
642 hdr->length = htons(len_pkt - len_hdr); in gtp1u_build_echo_msg()
648 hdr->length = htons(len_pkt - len_hdr); in gtp1u_build_echo_msg()
660 gtp1u = (struct gtp1_header_long *)(skb->data + sizeof(struct udphdr)); in gtp1u_send_echo_resp()
662 /* 3GPP TS 29.281 5.1 - For the Echo Request, Echo Response, in gtp1u_send_echo_resp()
666 if (!(gtp1u->flags & GTP1_F_SEQ) || gtp1u->tid) in gtp1u_send_echo_resp()
667 return -1; in gtp1u_send_echo_resp()
676 gtp1u_build_echo_msg(>p_pkt->gtp1u_h, GTP_ECHO_RSP); in gtp1u_send_echo_resp()
678 /* 3GPP TS 29.281 7.7.2 - The Restart Counter value in the in gtp1u_send_echo_resp()
684 gtp_pkt->ie.tag = GTPIE_RECOVERY; in gtp1u_send_echo_resp()
685 gtp_pkt->ie.val = 0; in gtp1u_send_echo_resp()
692 rt = ip4_route_output_gtp(&fl4, gtp->sk1u, iph->saddr, iph->daddr); in gtp1u_send_echo_resp()
694 netdev_dbg(gtp->dev, "no route for echo response from %pI4\n", in gtp1u_send_echo_resp()
695 &iph->saddr); in gtp1u_send_echo_resp()
696 return -1; in gtp1u_send_echo_resp()
699 udp_tunnel_xmit_skb(rt, gtp->sk1u, skb, in gtp1u_send_echo_resp()
701 iph->tos, in gtp1u_send_echo_resp()
702 ip4_dst_hoplimit(&rt->dst), in gtp1u_send_echo_resp()
705 !net_eq(sock_net(gtp->sk1u), in gtp1u_send_echo_resp()
706 dev_net(gtp->dev)), in gtp1u_send_echo_resp()
714 struct echo_info echo; in gtp1u_handle_echo_resp() local
719 gtp1u = (struct gtp1_header_long *)(skb->data + sizeof(struct udphdr)); in gtp1u_handle_echo_resp()
721 /* 3GPP TS 29.281 5.1 - For the Echo Request, Echo Response, in gtp1u_handle_echo_resp()
725 if (!(gtp1u->flags & GTP1_F_SEQ) || gtp1u->tid) in gtp1u_handle_echo_resp()
726 return -1; in gtp1u_handle_echo_resp()
729 echo.ms.addr.s_addr = iph->daddr; in gtp1u_handle_echo_resp()
730 echo.peer.addr.s_addr = iph->saddr; in gtp1u_handle_echo_resp()
731 echo.gtp_version = GTP_V1; in gtp1u_handle_echo_resp()
735 return -ENOMEM; in gtp1u_handle_echo_resp()
737 ret = gtp_genl_fill_echo(msg, 0, 0, 0, GTP_CMD_ECHOREQ, echo); in gtp1u_handle_echo_resp()
743 return genlmsg_multicast_netns(>p_genl_family, dev_net(gtp->dev), in gtp1u_handle_echo_resp()
764 if (!gtp_exthdr || !gtp_exthdr->len) in gtp_parse_exthdrs()
765 return -1; in gtp_parse_exthdrs()
767 offset += gtp_exthdr->len * 4; in gtp_parse_exthdrs()
772 next_type = skb_header_pointer(skb, offset - 1, in gtp_parse_exthdrs()
775 return -1; in gtp_parse_exthdrs()
793 return -1; in gtp1u_udp_encap_recv()
795 gtp1 = (struct gtp1_header *)(skb->data + sizeof(struct udphdr)); in gtp1u_udp_encap_recv()
797 if ((gtp1->flags >> 5) != GTP_V1) in gtp1u_udp_encap_recv()
802 * handle echo request. in gtp1u_udp_encap_recv()
804 if (gtp1->type == GTP_ECHO_REQ && gtp->sk_created) in gtp1u_udp_encap_recv()
807 if (gtp1->type == GTP_ECHO_RSP && gtp->sk_created) in gtp1u_udp_encap_recv()
810 if (gtp1->type != GTP_TPDU) in gtp1u_udp_encap_recv()
819 if (gtp1->flags & GTP1_F_MASK) in gtp1u_udp_encap_recv()
824 return -1; in gtp1u_udp_encap_recv()
827 netdev_dbg(gtp->dev, "GTP packet does not encapsulate an IP packet\n"); in gtp1u_udp_encap_recv()
828 return -1; in gtp1u_udp_encap_recv()
831 gtp1 = (struct gtp1_header *)(skb->data + sizeof(struct udphdr)); in gtp1u_udp_encap_recv()
833 pctx = gtp1_pdp_find(gtp, ntohl(gtp1->tid), in gtp1u_udp_encap_recv()
836 netdev_dbg(gtp->dev, "No PDP ctx to decap skb=%p\n", skb); in gtp1u_udp_encap_recv()
840 if (gtp1->flags & GTP1_F_EXTHDR && in gtp1u_udp_encap_recv()
842 return -1; in gtp1u_udp_encap_recv()
844 return gtp_rx(pctx, skb, hdrlen, gtp->role, inner_proto); in gtp1u_udp_encap_recv()
852 gtp = sk->sk_user_data; in __gtp_encap_destroy()
854 if (gtp->sk0 == sk) in __gtp_encap_destroy()
855 gtp->sk0 = NULL; in __gtp_encap_destroy()
857 gtp->sk1u = NULL; in __gtp_encap_destroy()
858 WRITE_ONCE(udp_sk(sk)->encap_type, 0); in __gtp_encap_destroy()
884 if (gtp->sk_created) { in gtp_encap_disable()
885 udp_tunnel_sock_release(gtp->sk0->sk_socket); in gtp_encap_disable()
886 udp_tunnel_sock_release(gtp->sk1u->sk_socket); in gtp_encap_disable()
887 gtp->sk_created = false; in gtp_encap_disable()
888 gtp->sk0 = NULL; in gtp_encap_disable()
889 gtp->sk1u = NULL; in gtp_encap_disable()
891 gtp_encap_disable_sock(gtp->sk0); in gtp_encap_disable()
892 gtp_encap_disable_sock(gtp->sk1u); in gtp_encap_disable()
908 netdev_dbg(gtp->dev, "encap_recv sk=%p\n", sk); in gtp_encap_recv()
910 switch (READ_ONCE(udp_sk(sk)->encap_type)) { in gtp_encap_recv()
912 netdev_dbg(gtp->dev, "received GTP0 packet\n"); in gtp_encap_recv()
916 netdev_dbg(gtp->dev, "received GTP1U packet\n"); in gtp_encap_recv()
920 ret = -1; /* Shouldn't happen. */ in gtp_encap_recv()
925 netdev_dbg(gtp->dev, "pass up to the process\n"); in gtp_encap_recv()
929 case -1: in gtp_encap_recv()
930 netdev_dbg(gtp->dev, "GTP packet has been dropped\n"); in gtp_encap_recv()
948 int payload_len = skb->len; in gtp0_push_header()
953 gtp0->flags = 0x1e; /* v0, GTP-non-prime. */ in gtp0_push_header()
954 gtp0->type = GTP_TPDU; in gtp0_push_header()
955 gtp0->length = htons(payload_len); in gtp0_push_header()
956 gtp0->seq = htons((atomic_inc_return(&pctx->tx_seq) - 1) % 0xffff); in gtp0_push_header()
957 gtp0->flow = htons(pctx->u.v0.flow); in gtp0_push_header()
958 gtp0->number = 0xff; in gtp0_push_header()
959 gtp0->spare[0] = gtp0->spare[1] = gtp0->spare[2] = 0xff; in gtp0_push_header()
960 gtp0->tid = cpu_to_be64(pctx->u.v0.tid); in gtp0_push_header()
965 int payload_len = skb->len; in gtp1_push_header()
971 * +--+--+--+--+--+--+--+--+ in gtp1_push_header()
973 * +--+--+--+--+--+--+--+--+ in gtp1_push_header()
976 gtp1->flags = 0x30; /* v1, GTP-non-prime. */ in gtp1_push_header()
977 gtp1->type = GTP_TPDU; in gtp1_push_header()
978 gtp1->length = htons(payload_len); in gtp1_push_header()
979 gtp1->tid = htonl(pctx->u.v1.o_tei); in gtp1_push_header()
981 /* TODO: Support for extension header, sequence number and N-PDU. in gtp1_push_header()
1004 switch (pktinfo->pctx->gtp_version) { in gtp_push_header()
1006 pktinfo->gtph_port = htons(GTP0_PORT); in gtp_push_header()
1007 gtp0_push_header(skb, pktinfo->pctx); in gtp_push_header()
1010 pktinfo->gtph_port = htons(GTP1U_PORT); in gtp_push_header()
1011 gtp1_push_header(skb, pktinfo->pctx); in gtp_push_header()
1022 pktinfo->sk = sk; in gtp_set_pktinfo_ipv4()
1023 pktinfo->tos = tos; in gtp_set_pktinfo_ipv4()
1024 pktinfo->pctx = pctx; in gtp_set_pktinfo_ipv4()
1025 pktinfo->rt = rt; in gtp_set_pktinfo_ipv4()
1026 pktinfo->fl4 = *fl4; in gtp_set_pktinfo_ipv4()
1027 pktinfo->dev = dev; in gtp_set_pktinfo_ipv4()
1036 pktinfo->sk = sk; in gtp_set_pktinfo_ipv6()
1037 pktinfo->tos = tos; in gtp_set_pktinfo_ipv6()
1038 pktinfo->pctx = pctx; in gtp_set_pktinfo_ipv6()
1039 pktinfo->rt6 = rt6; in gtp_set_pktinfo_ipv6()
1040 pktinfo->fl6 = *fl6; in gtp_set_pktinfo_ipv6()
1041 pktinfo->dev = dev; in gtp_set_pktinfo_ipv6()
1054 rt = ip4_route_output_gtp(&fl4, pctx->sk, pctx->peer.addr.s_addr, in gtp_build_skb_outer_ip4()
1055 inet_sk(pctx->sk)->inet_saddr); in gtp_build_skb_outer_ip4()
1058 &pctx->peer.addr.s_addr); in gtp_build_skb_outer_ip4()
1059 dev->stats.tx_carrier_errors++; in gtp_build_skb_outer_ip4()
1063 if (rt->dst.dev == dev) { in gtp_build_skb_outer_ip4()
1065 &pctx->peer.addr.s_addr); in gtp_build_skb_outer_ip4()
1066 dev->stats.collisions++; in gtp_build_skb_outer_ip4()
1073 mtu = dst_mtu(&rt->dst) - dev->hard_header_len - in gtp_build_skb_outer_ip4()
1074 sizeof(struct iphdr) - sizeof(struct udphdr); in gtp_build_skb_outer_ip4()
1075 switch (pctx->gtp_version) { in gtp_build_skb_outer_ip4()
1077 mtu -= sizeof(struct gtp0_header); in gtp_build_skb_outer_ip4()
1080 mtu -= sizeof(struct gtp1_header); in gtp_build_skb_outer_ip4()
1084 mtu = dst_mtu(&rt->dst); in gtp_build_skb_outer_ip4()
1090 ((!skb_is_gso(skb) && skb->len > mtu) || in gtp_build_skb_outer_ip4()
1098 gtp_set_pktinfo_ipv4(pktinfo, pctx->sk, tos, pctx, rt, &fl4, dev); in gtp_build_skb_outer_ip4()
1105 return -EBADMSG; in gtp_build_skb_outer_ip4()
1118 rt = ip6_route_output_gtp(net, &fl6, pctx->sk, &pctx->peer.addr6, in gtp_build_skb_outer_ip6()
1119 &inet6_sk(pctx->sk)->saddr); in gtp_build_skb_outer_ip6()
1122 &pctx->peer.addr6); in gtp_build_skb_outer_ip6()
1123 dev->stats.tx_carrier_errors++; in gtp_build_skb_outer_ip6()
1126 dst = &rt->dst; in gtp_build_skb_outer_ip6()
1128 if (rt->dst.dev == dev) { in gtp_build_skb_outer_ip6()
1130 &pctx->peer.addr6); in gtp_build_skb_outer_ip6()
1131 dev->stats.collisions++; in gtp_build_skb_outer_ip6()
1135 mtu = dst_mtu(&rt->dst) - dev->hard_header_len - in gtp_build_skb_outer_ip6()
1136 sizeof(struct ipv6hdr) - sizeof(struct udphdr); in gtp_build_skb_outer_ip6()
1137 switch (pctx->gtp_version) { in gtp_build_skb_outer_ip6()
1139 mtu -= sizeof(struct gtp0_header); in gtp_build_skb_outer_ip6()
1142 mtu -= sizeof(struct gtp1_header); in gtp_build_skb_outer_ip6()
1148 if ((!skb_is_gso(skb) && skb->len > mtu) || in gtp_build_skb_outer_ip6()
1155 gtp_set_pktinfo_ipv6(pktinfo, pctx->sk, tos, pctx, rt, &fl6, dev); in gtp_build_skb_outer_ip6()
1162 return -EBADMSG; in gtp_build_skb_outer_ip6()
1169 struct net *net = gtp->net; in gtp_build_skb_ip4()
1178 if (gtp->role == GTP_ROLE_SGSN) in gtp_build_skb_ip4()
1179 pctx = ipv4_pdp_find(gtp, iph->saddr); in gtp_build_skb_ip4()
1181 pctx = ipv4_pdp_find(gtp, iph->daddr); in gtp_build_skb_ip4()
1185 &iph->daddr); in gtp_build_skb_ip4()
1186 return -ENOENT; in gtp_build_skb_ip4()
1190 switch (pctx->sk->sk_family) { in gtp_build_skb_ip4()
1193 iph->tos, iph->frag_off); in gtp_build_skb_ip4()
1197 iph->tos); in gtp_build_skb_ip4()
1200 ret = -1; in gtp_build_skb_ip4()
1208 netdev_dbg(dev, "gtp -> IP src: %pI4 dst: %pI4\n", in gtp_build_skb_ip4()
1209 &iph->saddr, &iph->daddr); in gtp_build_skb_ip4()
1218 struct net *net = gtp->net; in gtp_build_skb_ip6()
1228 if (gtp->role == GTP_ROLE_SGSN) in gtp_build_skb_ip6()
1229 pctx = ipv6_pdp_find(gtp, &ip6h->saddr); in gtp_build_skb_ip6()
1231 pctx = ipv6_pdp_find(gtp, &ip6h->daddr); in gtp_build_skb_ip6()
1235 &ip6h->daddr); in gtp_build_skb_ip6()
1236 return -ENOENT; in gtp_build_skb_ip6()
1242 switch (pctx->sk->sk_family) { in gtp_build_skb_ip6()
1250 ret = -1; in gtp_build_skb_ip6()
1258 netdev_dbg(dev, "gtp -> IP src: %pI6 dst: %pI6\n", in gtp_build_skb_ip6()
1259 &ip6h->saddr, &ip6h->daddr); in gtp_build_skb_ip6()
1266 unsigned int proto = ntohs(skb->protocol); in gtp_dev_xmit()
1271 if (skb_cow_head(skb, dev->needed_headroom)) in gtp_dev_xmit()
1279 /* PDP context lookups in gtp_build_skb_*() need rcu read-side lock. */ in gtp_dev_xmit()
1289 err = -EOPNOTSUPP; in gtp_dev_xmit()
1297 switch (pktinfo.pctx->sk->sk_family) { in gtp_dev_xmit()
1302 ip4_dst_hoplimit(&pktinfo.rt->dst), in gtp_dev_xmit()
1305 !net_eq(sock_net(pktinfo.pctx->sk), in gtp_dev_xmit()
1311 udp_tunnel6_xmit_skb(&pktinfo.rt6->dst, pktinfo.sk, skb, dev, in gtp_dev_xmit()
1314 ip6_dst_hoplimit(&pktinfo.rt->dst), in gtp_dev_xmit()
1326 dev->stats.tx_errors++; in gtp_dev_xmit()
1347 dev->netdev_ops = >p_netdev_ops; in gtp_link_setup()
1348 dev->needs_free_netdev = true; in gtp_link_setup()
1351 dev->hard_header_len = 0; in gtp_link_setup()
1352 dev->addr_len = 0; in gtp_link_setup()
1353 dev->mtu = ETH_DATA_LEN - GTP_IPV4_MAXLEN; in gtp_link_setup()
1356 dev->type = ARPHRD_NONE; in gtp_link_setup()
1357 dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; in gtp_link_setup()
1359 dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; in gtp_link_setup()
1360 dev->priv_flags |= IFF_NO_QUEUE; in gtp_link_setup()
1361 dev->lltx = true; in gtp_link_setup()
1364 dev->needed_headroom = LL_MAX_HEADER + GTP_IPV4_MAXLEN; in gtp_link_setup()
1365 gtp->dev = dev; in gtp_link_setup()
1375 kfree(gtp->addr_hash); in gtp_destructor()
1376 kfree(gtp->tid_hash); in gtp_destructor()
1382 udp_conf->family = family; in gtp_sock_udp_config()
1384 switch (udp_conf->family) { in gtp_sock_udp_config()
1386 udp_conf->local_ip.s_addr = nla_get_be32(nla); in gtp_sock_udp_config()
1390 udp_conf->local_ip6 = nla_get_in6_addr(nla); in gtp_sock_udp_config()
1394 return -EOPNOTSUPP; in gtp_sock_udp_config()
1405 struct net *net = gtp->net; in gtp_create_sock()
1423 return ERR_PTR(-EINVAL); in gtp_create_sock()
1436 return sock->sk; in gtp_create_sock()
1451 udp_tunnel_sock_release(sk0->sk_socket); in gtp_create_sockets()
1455 gtp->sk_created = true; in gtp_create_sockets()
1456 gtp->sk0 = sk0; in gtp_create_sockets()
1457 gtp->sk1u = sk1u; in gtp_create_sockets()
1470 struct nlattr **data = params->data; in gtp_newlink()
1478 return -EAFNOSUPPORT; in gtp_newlink()
1494 return -EINVAL; in gtp_newlink()
1496 gtp->role = role; in gtp_newlink()
1498 gtp->restart_count = nla_get_u8_default(data[IFLA_GTP_RESTART_COUNT], in gtp_newlink()
1501 gtp->net = link_net; in gtp_newlink()
1519 if ((gtp->sk0 && gtp->sk0->sk_family == AF_INET6) || in gtp_newlink()
1520 (gtp->sk1u && gtp->sk1u->sk_family == AF_INET6)) { in gtp_newlink()
1521 dev->mtu = ETH_DATA_LEN - GTP_IPV6_MAXLEN; in gtp_newlink()
1522 dev->needed_headroom = LL_MAX_HEADER + GTP_IPV6_MAXLEN; in gtp_newlink()
1532 list_add(>p->list, &gn->gtp_dev_list); in gtp_newlink()
1533 dev->priv_destructor = gtp_destructor; in gtp_newlink()
1542 kfree(gtp->addr_hash); in gtp_newlink()
1543 kfree(gtp->tid_hash); in gtp_newlink()
1554 for (i = 0; i < gtp->hash_size; i++) in gtp_dellink()
1555 hlist_for_each_entry_safe(pctx, next, >p->tid_hash[i], hlist_tid) in gtp_dellink()
1558 list_del(>p->list); in gtp_dellink()
1577 return -EINVAL; in gtp_validate()
1593 if (nla_put_u32(skb, IFLA_GTP_PDP_HASHSIZE, gtp->hash_size)) in gtp_fill_info()
1595 if (nla_put_u32(skb, IFLA_GTP_ROLE, gtp->role)) in gtp_fill_info()
1597 if (nla_put_u8(skb, IFLA_GTP_RESTART_COUNT, gtp->restart_count)) in gtp_fill_info()
1603 return -EMSGSIZE; in gtp_fill_info()
1623 gtp->addr_hash = kmalloc_array(hsize, sizeof(struct hlist_head), in gtp_hashtable_new()
1625 if (gtp->addr_hash == NULL) in gtp_hashtable_new()
1626 return -ENOMEM; in gtp_hashtable_new()
1628 gtp->tid_hash = kmalloc_array(hsize, sizeof(struct hlist_head), in gtp_hashtable_new()
1630 if (gtp->tid_hash == NULL) in gtp_hashtable_new()
1633 gtp->hash_size = hsize; in gtp_hashtable_new()
1636 INIT_HLIST_HEAD(>p->addr_hash[i]); in gtp_hashtable_new()
1637 INIT_HLIST_HEAD(>p->tid_hash[i]); in gtp_hashtable_new()
1641 kfree(gtp->addr_hash); in gtp_hashtable_new()
1642 return -ENOMEM; in gtp_hashtable_new()
1661 sk = sock->sk; in gtp_encap_enable_socket()
1662 if (sk->sk_protocol != IPPROTO_UDP || in gtp_encap_enable_socket()
1663 sk->sk_type != SOCK_DGRAM || in gtp_encap_enable_socket()
1664 (sk->sk_family != AF_INET && sk->sk_family != AF_INET6)) { in gtp_encap_enable_socket()
1666 sk = ERR_PTR(-EINVAL); in gtp_encap_enable_socket()
1670 if (sk->sk_family == AF_INET6 && in gtp_encap_enable_socket()
1671 !sk->sk_ipv6only) { in gtp_encap_enable_socket()
1672 sk = ERR_PTR(-EADDRNOTAVAIL); in gtp_encap_enable_socket()
1677 if (sk->sk_user_data) { in gtp_encap_enable_socket()
1678 sk = ERR_PTR(-EBUSY); in gtp_encap_enable_socket()
1689 setup_udp_tunnel_sock(sock_net(sock->sk), sock, &tuncfg); in gtp_encap_enable_socket()
1692 release_sock(sock->sk); in gtp_encap_enable_socket()
1704 return -EINVAL; in gtp_encap_enable()
1728 gtp->sk0 = sk0; in gtp_encap_enable()
1729 gtp->sk1u = sk1u; in gtp_encap_enable()
1732 sk0->sk_family != sk1u->sk_family) { in gtp_encap_enable()
1735 return -EINVAL; in gtp_encap_enable()
1760 if (dev && dev->netdev_ops == >p_netdev_ops) in gtp_find_dev()
1769 pctx->gtp_version = nla_get_u32(info->attrs[GTPA_VERSION]); in gtp_pdp_fill()
1771 switch (pctx->gtp_version) { in gtp_pdp_fill()
1777 pctx->u.v0.tid = nla_get_u64(info->attrs[GTPA_TID]); in gtp_pdp_fill()
1778 pctx->u.v0.flow = nla_get_u16(info->attrs[GTPA_FLOW]); in gtp_pdp_fill()
1781 pctx->u.v1.i_tei = nla_get_u32(info->attrs[GTPA_I_TEI]); in gtp_pdp_fill()
1782 pctx->u.v1.o_tei = nla_get_u32(info->attrs[GTPA_O_TEI]); in gtp_pdp_fill()
1791 if (info->attrs[GTPA_PEER_ADDRESS]) { in ip_pdp_peer_fill()
1792 pctx->peer.addr.s_addr = in ip_pdp_peer_fill()
1793 nla_get_be32(info->attrs[GTPA_PEER_ADDRESS]); in ip_pdp_peer_fill()
1794 } else if (info->attrs[GTPA_PEER_ADDR6]) { in ip_pdp_peer_fill()
1795 pctx->peer.addr6 = nla_get_in6_addr(info->attrs[GTPA_PEER_ADDR6]); in ip_pdp_peer_fill()
1802 pctx->ms.addr.s_addr = in ipv4_pdp_fill()
1803 nla_get_be32(info->attrs[GTPA_MS_ADDRESS]); in ipv4_pdp_fill()
1810 pctx->ms.addr6 = nla_get_in6_addr(info->attrs[GTPA_MS_ADDR6]); in ipv6_pdp_fill()
1811 if (pctx->ms.addr6.s6_addr32[2] || in ipv6_pdp_fill()
1812 pctx->ms.addr6.s6_addr32[3]) in ipv6_pdp_fill()
1824 struct net_device *dev = gtp->dev; in gtp_pdp_add()
1832 version = nla_get_u32(info->attrs[GTPA_VERSION]); in gtp_pdp_add()
1834 family = nla_get_u8_default(info->attrs[GTPA_FAMILY], AF_INET); in gtp_pdp_add()
1838 return ERR_PTR(-EAFNOSUPPORT); in gtp_pdp_add()
1840 if (!info->attrs[GTPA_PEER_ADDRESS] && in gtp_pdp_add()
1841 !info->attrs[GTPA_PEER_ADDR6]) in gtp_pdp_add()
1842 return ERR_PTR(-EINVAL); in gtp_pdp_add()
1844 if ((info->attrs[GTPA_PEER_ADDRESS] && in gtp_pdp_add()
1845 sk->sk_family == AF_INET6) || in gtp_pdp_add()
1846 (info->attrs[GTPA_PEER_ADDR6] && in gtp_pdp_add()
1847 sk->sk_family == AF_INET)) in gtp_pdp_add()
1848 return ERR_PTR(-EAFNOSUPPORT); in gtp_pdp_add()
1852 if (!info->attrs[GTPA_MS_ADDRESS] || in gtp_pdp_add()
1853 info->attrs[GTPA_MS_ADDR6]) in gtp_pdp_add()
1854 return ERR_PTR(-EINVAL); in gtp_pdp_add()
1856 ms_addr = nla_get_be32(info->attrs[GTPA_MS_ADDRESS]); in gtp_pdp_add()
1857 hash_ms = ipv4_hashfn(ms_addr) % gtp->hash_size; in gtp_pdp_add()
1861 if (!info->attrs[GTPA_MS_ADDR6] || in gtp_pdp_add()
1862 info->attrs[GTPA_MS_ADDRESS]) in gtp_pdp_add()
1863 return ERR_PTR(-EINVAL); in gtp_pdp_add()
1865 ms_addr6 = nla_get_in6_addr(info->attrs[GTPA_MS_ADDR6]); in gtp_pdp_add()
1866 hash_ms = ipv6_hashfn(&ms_addr6) % gtp->hash_size; in gtp_pdp_add()
1870 return ERR_PTR(-EAFNOSUPPORT); in gtp_pdp_add()
1876 nla_get_u64(info->attrs[GTPA_TID]), in gtp_pdp_add()
1880 nla_get_u32(info->attrs[GTPA_I_TEI]), in gtp_pdp_add()
1886 if (info->nlhdr->nlmsg_flags & NLM_F_EXCL) in gtp_pdp_add()
1887 return ERR_PTR(-EEXIST); in gtp_pdp_add()
1888 if (info->nlhdr->nlmsg_flags & NLM_F_REPLACE) in gtp_pdp_add()
1889 return ERR_PTR(-EOPNOTSUPP); in gtp_pdp_add()
1892 return ERR_PTR(-EEXIST); in gtp_pdp_add()
1896 switch (pctx->af) { in gtp_pdp_add()
1902 return ERR_PTR(-EADDRNOTAVAIL); in gtp_pdp_add()
1906 if (pctx->gtp_version == GTP_V0) in gtp_pdp_add()
1907 netdev_dbg(dev, "GTPv0-U: update tunnel id = %llx (pdp %p)\n", in gtp_pdp_add()
1908 pctx->u.v0.tid, pctx); in gtp_pdp_add()
1909 else if (pctx->gtp_version == GTP_V1) in gtp_pdp_add()
1910 netdev_dbg(dev, "GTPv1-U: update tunnel id = %x/%x (pdp %p)\n", in gtp_pdp_add()
1911 pctx->u.v1.i_tei, pctx->u.v1.o_tei, pctx); in gtp_pdp_add()
1919 return ERR_PTR(-ENOMEM); in gtp_pdp_add()
1922 pctx->sk = sk; in gtp_pdp_add()
1923 pctx->dev = gtp->dev; in gtp_pdp_add()
1924 pctx->af = family; in gtp_pdp_add()
1926 switch (pctx->af) { in gtp_pdp_add()
1928 if (!info->attrs[GTPA_MS_ADDRESS]) { in gtp_pdp_add()
1931 return ERR_PTR(-EINVAL); in gtp_pdp_add()
1937 if (!info->attrs[GTPA_MS_ADDR6]) { in gtp_pdp_add()
1940 return ERR_PTR(-EINVAL); in gtp_pdp_add()
1946 return ERR_PTR(-EADDRNOTAVAIL); in gtp_pdp_add()
1950 atomic_set(&pctx->tx_seq, 0); in gtp_pdp_add()
1952 switch (pctx->gtp_version) { in gtp_pdp_add()
1959 hash_tid = gtp0_hashfn(pctx->u.v0.tid) % gtp->hash_size; in gtp_pdp_add()
1962 hash_tid = gtp1u_hashfn(pctx->u.v1.i_tei) % gtp->hash_size; in gtp_pdp_add()
1966 hlist_add_head_rcu(&pctx->hlist_addr, >p->addr_hash[hash_ms]); in gtp_pdp_add()
1967 hlist_add_head_rcu(&pctx->hlist_tid, >p->tid_hash[hash_tid]); in gtp_pdp_add()
1969 switch (pctx->gtp_version) { in gtp_pdp_add()
1971 netdev_dbg(dev, "GTPv0-U: new PDP ctx id=%llx ssgn=%pI4 ms=%pI4 (pdp=%p)\n", in gtp_pdp_add()
1972 pctx->u.v0.tid, &pctx->peer.addr, in gtp_pdp_add()
1973 &pctx->ms.addr, pctx); in gtp_pdp_add()
1976 netdev_dbg(dev, "GTPv1-U: new PDP ctx id=%x/%x ssgn=%pI4 ms=%pI4 (pdp=%p)\n", in gtp_pdp_add()
1977 pctx->u.v1.i_tei, pctx->u.v1.o_tei, in gtp_pdp_add()
1978 &pctx->peer.addr, &pctx->ms.addr, pctx); in gtp_pdp_add()
1989 sock_put(pctx->sk); in pdp_context_free()
1995 hlist_del_rcu(&pctx->hlist_tid); in pdp_context_delete()
1996 hlist_del_rcu(&pctx->hlist_addr); in pdp_context_delete()
1997 call_rcu(&pctx->rcu_head, pdp_context_free); in pdp_context_delete()
2010 if (!info->attrs[GTPA_VERSION] || in gtp_genl_new_pdp()
2011 !info->attrs[GTPA_LINK]) in gtp_genl_new_pdp()
2012 return -EINVAL; in gtp_genl_new_pdp()
2014 version = nla_get_u32(info->attrs[GTPA_VERSION]); in gtp_genl_new_pdp()
2018 if (!info->attrs[GTPA_TID] || in gtp_genl_new_pdp()
2019 !info->attrs[GTPA_FLOW]) in gtp_genl_new_pdp()
2020 return -EINVAL; in gtp_genl_new_pdp()
2023 if (!info->attrs[GTPA_I_TEI] || in gtp_genl_new_pdp()
2024 !info->attrs[GTPA_O_TEI]) in gtp_genl_new_pdp()
2025 return -EINVAL; in gtp_genl_new_pdp()
2029 return -EINVAL; in gtp_genl_new_pdp()
2034 gtp = gtp_find_dev(sock_net(skb->sk), info->attrs); in gtp_genl_new_pdp()
2036 err = -ENODEV; in gtp_genl_new_pdp()
2041 sk = gtp->sk0; in gtp_genl_new_pdp()
2043 sk = gtp->sk1u; in gtp_genl_new_pdp()
2048 err = -ENODEV; in gtp_genl_new_pdp()
2075 return ERR_PTR(-ENODEV); in gtp_find_pdp_by_link()
2081 return ERR_PTR(-EINVAL); in gtp_find_pdp_by_link()
2088 return ERR_PTR(-EINVAL); in gtp_find_pdp_by_link()
2092 return ERR_PTR(-EADDRNOTAVAIL); in gtp_find_pdp_by_link()
2107 return ERR_PTR(-EINVAL); in gtp_find_pdp_by_link()
2117 pctx = ERR_PTR(-EINVAL); in gtp_find_pdp()
2120 pctx = ERR_PTR(-ENOENT); in gtp_find_pdp()
2130 if (!info->attrs[GTPA_VERSION]) in gtp_genl_del_pdp()
2131 return -EINVAL; in gtp_genl_del_pdp()
2135 pctx = gtp_find_pdp(sock_net(skb->sk), info->attrs); in gtp_genl_del_pdp()
2141 if (pctx->gtp_version == GTP_V0) in gtp_genl_del_pdp()
2142 netdev_dbg(pctx->dev, "GTPv0-U: deleting tunnel id = %llx (pdp %p)\n", in gtp_genl_del_pdp()
2143 pctx->u.v0.tid, pctx); in gtp_genl_del_pdp()
2144 else if (pctx->gtp_version == GTP_V1) in gtp_genl_del_pdp()
2145 netdev_dbg(pctx->dev, "GTPv1-U: deleting tunnel id = %x/%x (pdp %p)\n", in gtp_genl_del_pdp()
2146 pctx->u.v1.i_tei, pctx->u.v1.o_tei, pctx); in gtp_genl_del_pdp()
2166 if (nla_put_u32(skb, GTPA_VERSION, pctx->gtp_version) || in gtp_genl_fill_info()
2167 nla_put_u32(skb, GTPA_LINK, pctx->dev->ifindex) || in gtp_genl_fill_info()
2168 nla_put_u8(skb, GTPA_FAMILY, pctx->af)) in gtp_genl_fill_info()
2171 switch (pctx->af) { in gtp_genl_fill_info()
2173 if (nla_put_be32(skb, GTPA_MS_ADDRESS, pctx->ms.addr.s_addr)) in gtp_genl_fill_info()
2177 if (nla_put_in6_addr(skb, GTPA_MS_ADDR6, &pctx->ms.addr6)) in gtp_genl_fill_info()
2182 switch (pctx->sk->sk_family) { in gtp_genl_fill_info()
2184 if (nla_put_be32(skb, GTPA_PEER_ADDRESS, pctx->peer.addr.s_addr)) in gtp_genl_fill_info()
2188 if (nla_put_in6_addr(skb, GTPA_PEER_ADDR6, &pctx->peer.addr6)) in gtp_genl_fill_info()
2193 switch (pctx->gtp_version) { in gtp_genl_fill_info()
2195 if (nla_put_u64_64bit(skb, GTPA_TID, pctx->u.v0.tid, GTPA_PAD) || in gtp_genl_fill_info()
2196 nla_put_u16(skb, GTPA_FLOW, pctx->u.v0.flow)) in gtp_genl_fill_info()
2200 if (nla_put_u32(skb, GTPA_I_TEI, pctx->u.v1.i_tei) || in gtp_genl_fill_info()
2201 nla_put_u32(skb, GTPA_O_TEI, pctx->u.v1.o_tei)) in gtp_genl_fill_info()
2211 return -EMSGSIZE; in gtp_genl_fill_info()
2221 return -ENOMEM; in gtp_tunnel_notify()
2229 ret = genlmsg_multicast_netns(>p_genl_family, dev_net(pctx->dev), msg, in gtp_tunnel_notify()
2240 if (!info->attrs[GTPA_VERSION]) in gtp_genl_get_pdp()
2241 return -EINVAL; in gtp_genl_get_pdp()
2245 pctx = gtp_find_pdp(sock_net(skb->sk), info->attrs); in gtp_genl_get_pdp()
2253 err = -ENOMEM; in gtp_genl_get_pdp()
2257 err = gtp_genl_fill_info(skb2, NETLINK_CB(skb).portid, info->snd_seq, in gtp_genl_get_pdp()
2258 0, info->nlhdr->nlmsg_type, pctx); in gtp_genl_get_pdp()
2263 return genlmsg_unicast(genl_info_net(info), skb2, info->snd_portid); in gtp_genl_get_pdp()
2275 struct gtp_dev *last_gtp = (struct gtp_dev *)cb->args[2], *gtp; in gtp_genl_dump_pdp()
2276 int i, j, bucket = cb->args[0], skip = cb->args[1]; in gtp_genl_dump_pdp()
2277 struct net *net = sock_net(skb->sk); in gtp_genl_dump_pdp()
2281 if (cb->args[4]) in gtp_genl_dump_pdp()
2286 if (dev->rtnl_link_ops != >p_link_ops) in gtp_genl_dump_pdp()
2296 for (i = bucket; i < gtp->hash_size; i++) { in gtp_genl_dump_pdp()
2298 hlist_for_each_entry_rcu(pctx, >p->tid_hash[i], in gtp_genl_dump_pdp()
2302 NETLINK_CB(cb->skb).portid, in gtp_genl_dump_pdp()
2303 cb->nlh->nlmsg_seq, in gtp_genl_dump_pdp()
2305 cb->nlh->nlmsg_type, pctx)) { in gtp_genl_dump_pdp()
2306 cb->args[0] = i; in gtp_genl_dump_pdp()
2307 cb->args[1] = j; in gtp_genl_dump_pdp()
2308 cb->args[2] = (unsigned long)gtp; in gtp_genl_dump_pdp()
2317 cb->args[4] = 1; in gtp_genl_dump_pdp()
2320 return skb->len; in gtp_genl_dump_pdp()
2335 if (!info->attrs[GTPA_VERSION] || in gtp_genl_send_echo_req()
2336 !info->attrs[GTPA_LINK] || in gtp_genl_send_echo_req()
2337 !info->attrs[GTPA_PEER_ADDRESS] || in gtp_genl_send_echo_req()
2338 !info->attrs[GTPA_MS_ADDRESS]) in gtp_genl_send_echo_req()
2339 return -EINVAL; in gtp_genl_send_echo_req()
2341 version = nla_get_u32(info->attrs[GTPA_VERSION]); in gtp_genl_send_echo_req()
2342 dst_ip = nla_get_be32(info->attrs[GTPA_PEER_ADDRESS]); in gtp_genl_send_echo_req()
2343 src_ip = nla_get_be32(info->attrs[GTPA_MS_ADDRESS]); in gtp_genl_send_echo_req()
2345 gtp = gtp_find_dev(sock_net(skb->sk), info->attrs); in gtp_genl_send_echo_req()
2347 return -ENODEV; in gtp_genl_send_echo_req()
2349 if (!gtp->sk_created) in gtp_genl_send_echo_req()
2350 return -EOPNOTSUPP; in gtp_genl_send_echo_req()
2351 if (!(gtp->dev->flags & IFF_UP)) in gtp_genl_send_echo_req()
2352 return -ENETDOWN; in gtp_genl_send_echo_req()
2357 len = LL_RESERVED_SPACE(gtp->dev) + sizeof(struct gtp0_header) + in gtp_genl_send_echo_req()
2360 skb_to_send = netdev_alloc_skb_ip_align(gtp->dev, len); in gtp_genl_send_echo_req()
2362 return -ENOMEM; in gtp_genl_send_echo_req()
2364 sk = gtp->sk0; in gtp_genl_send_echo_req()
2373 len = LL_RESERVED_SPACE(gtp->dev) + in gtp_genl_send_echo_req()
2377 skb_to_send = netdev_alloc_skb_ip_align(gtp->dev, len); in gtp_genl_send_echo_req()
2379 return -ENOMEM; in gtp_genl_send_echo_req()
2381 sk = gtp->sk1u; in gtp_genl_send_echo_req()
2389 return -ENODEV; in gtp_genl_send_echo_req()
2394 netdev_dbg(gtp->dev, "no route for echo request to %pI4\n", in gtp_genl_send_echo_req()
2397 return -ENODEV; in gtp_genl_send_echo_req()
2403 ip4_dst_hoplimit(&rt->dst), in gtp_genl_send_echo_req()
2407 dev_net(gtp->dev)), in gtp_genl_send_echo_req()
2474 INIT_LIST_HEAD(&gn->gtp_dev_list); in gtp_net_init()
2487 list_for_each_entry_safe(gtp, gtp_next, &gn->gtp_dev_list, list) in gtp_net_exit_batch_rtnl()
2488 gtp_dellink(gtp->dev, dev_to_kill); in gtp_net_exit_batch_rtnl()