Lines Matching refs:pctx

106 static void pdp_context_delete(struct pdp_ctx *pctx);
173 static bool gtp_check_ms_ipv4(struct sk_buff *skb, struct pdp_ctx *pctx,
184 return iph->daddr == pctx->ms_addr_ip4.s_addr;
186 return iph->saddr == pctx->ms_addr_ip4.s_addr;
192 static bool gtp_check_ms(struct sk_buff *skb, struct pdp_ctx *pctx,
197 return gtp_check_ms_ipv4(skb, pctx, hdrlen, role);
202 static int gtp_rx(struct pdp_ctx *pctx, struct sk_buff *skb,
205 if (!gtp_check_ms(skb, pctx, hdrlen, role)) {
206 netdev_dbg(pctx->dev, "No PDP ctx for this MS\n");
212 !net_eq(sock_net(pctx->sk), dev_net(pctx->dev)))) {
213 pctx->dev->stats.rx_length_errors++;
217 netdev_dbg(pctx->dev, "forwarding packet from GGSN to uplink\n");
226 skb->dev = pctx->dev;
228 dev_sw_netstats_rx_add(pctx->dev, skb->len);
234 pctx->dev->stats.rx_dropped++;
413 struct pdp_ctx *pctx;
436 pctx = gtp0_pdp_find(gtp, be64_to_cpu(gtp0->tid));
437 if (!pctx) {
442 return gtp_rx(pctx, skb, hdrlen, gtp->role);
575 struct pdp_ctx *pctx;
613 pctx = gtp1_pdp_find(gtp, ntohl(gtp1->tid));
614 if (!pctx) {
619 return gtp_rx(pctx, skb, hdrlen, gtp->role);
721 static inline void gtp0_push_header(struct sk_buff *skb, struct pdp_ctx *pctx)
731 gtp0->seq = htons((atomic_inc_return(&pctx->tx_seq) - 1) % 0xffff);
732 gtp0->flow = htons(pctx->u.v0.flow);
735 gtp0->tid = cpu_to_be64(pctx->u.v0.tid);
738 static inline void gtp1_push_header(struct sk_buff *skb, struct pdp_ctx *pctx)
754 gtp1->tid = htonl(pctx->u.v1.o_tei);
766 struct pdp_ctx *pctx;
773 switch (pktinfo->pctx->gtp_version) {
776 gtp0_push_header(skb, pktinfo->pctx);
780 gtp1_push_header(skb, pktinfo->pctx);
787 struct pdp_ctx *pctx, struct rtable *rt,
793 pktinfo->pctx = pctx;
803 struct pdp_ctx *pctx;
815 pctx = ipv4_pdp_find(gtp, iph->saddr);
817 pctx = ipv4_pdp_find(gtp, iph->daddr);
819 if (!pctx) {
824 netdev_dbg(dev, "found PDP context %p\n", pctx);
826 rt = ip4_route_output_gtp(&fl4, pctx->sk, pctx->peer_addr_ip4.s_addr,
827 inet_sk(pctx->sk)->inet_saddr);
830 &pctx->peer_addr_ip4.s_addr);
837 &pctx->peer_addr_ip4.s_addr);
847 switch (pctx->gtp_version) {
870 gtp_set_pktinfo_ipv4(pktinfo, pctx->sk, iph, pctx, rt, &fl4, dev);
917 !net_eq(sock_net(pktinfo.pctx->sk),
1102 struct pdp_ctx *pctx;
1106 hlist_for_each_entry_safe(pctx, next, &gtp->tid_hash[i], hlist_tid)
1107 pdp_context_delete(pctx);
1299 static void ipv4_pdp_fill(struct pdp_ctx *pctx, struct genl_info *info)
1301 pctx->gtp_version = nla_get_u32(info->attrs[GTPA_VERSION]);
1302 pctx->af = AF_INET;
1303 pctx->peer_addr_ip4.s_addr =
1305 pctx->ms_addr_ip4.s_addr =
1308 switch (pctx->gtp_version) {
1314 pctx->u.v0.tid = nla_get_u64(info->attrs[GTPA_TID]);
1315 pctx->u.v0.flow = nla_get_u16(info->attrs[GTPA_FLOW]);
1318 pctx->u.v1.i_tei = nla_get_u32(info->attrs[GTPA_I_TEI]);
1319 pctx->u.v1.o_tei = nla_get_u32(info->attrs[GTPA_O_TEI]);
1329 struct pdp_ctx *pctx, *pctx_tid = NULL;
1340 pctx = ipv4_pdp_find(gtp, ms_addr);
1341 if (pctx)
1358 if (pctx && pctx_tid)
1360 if (!pctx)
1361 pctx = pctx_tid;
1363 ipv4_pdp_fill(pctx, info);
1365 if (pctx->gtp_version == GTP_V0)
1367 pctx->u.v0.tid, pctx);
1368 else if (pctx->gtp_version == GTP_V1)
1370 pctx->u.v1.i_tei, pctx->u.v1.o_tei, pctx);
1372 return pctx;
1376 pctx = kmalloc(sizeof(*pctx), GFP_ATOMIC);
1377 if (pctx == NULL)
1381 pctx->sk = sk;
1382 pctx->dev = gtp->dev;
1383 ipv4_pdp_fill(pctx, info);
1384 atomic_set(&pctx->tx_seq, 0);
1386 switch (pctx->gtp_version) {
1393 hash_tid = gtp0_hashfn(pctx->u.v0.tid) % gtp->hash_size;
1396 hash_tid = gtp1u_hashfn(pctx->u.v1.i_tei) % gtp->hash_size;
1400 hlist_add_head_rcu(&pctx->hlist_addr, &gtp->addr_hash[hash_ms]);
1401 hlist_add_head_rcu(&pctx->hlist_tid, &gtp->tid_hash[hash_tid]);
1403 switch (pctx->gtp_version) {
1406 pctx->u.v0.tid, &pctx->peer_addr_ip4,
1407 &pctx->ms_addr_ip4, pctx);
1411 pctx->u.v1.i_tei, pctx->u.v1.o_tei,
1412 &pctx->peer_addr_ip4, &pctx->ms_addr_ip4, pctx);
1416 return pctx;
1421 struct pdp_ctx *pctx = container_of(head, struct pdp_ctx, rcu_head);
1423 sock_put(pctx->sk);
1424 kfree(pctx);
1427 static void pdp_context_delete(struct pdp_ctx *pctx)
1429 hlist_del_rcu(&pctx->hlist_tid);
1430 hlist_del_rcu(&pctx->hlist_addr);
1431 call_rcu(&pctx->rcu_head, pdp_context_free);
1434 static int gtp_tunnel_notify(struct pdp_ctx *pctx, u8 cmd, gfp_t allocation);
1439 struct pdp_ctx *pctx;
1488 pctx = gtp_pdp_add(gtp, sk, info);
1489 if (IS_ERR(pctx)) {
1490 err = PTR_ERR(pctx);
1492 gtp_tunnel_notify(pctx, GTP_CMD_NEWPDP, GFP_KERNEL);
1528 struct pdp_ctx *pctx;
1531 pctx = gtp_find_pdp_by_link(net, nla);
1533 pctx = ERR_PTR(-EINVAL);
1535 if (!pctx)
1536 pctx = ERR_PTR(-ENOENT);
1538 return pctx;
1543 struct pdp_ctx *pctx;
1551 pctx = gtp_find_pdp(sock_net(skb->sk), info->attrs);
1552 if (IS_ERR(pctx)) {
1553 err = PTR_ERR(pctx);
1557 if (pctx->gtp_version == GTP_V0)
1558 netdev_dbg(pctx->dev, "GTPv0-U: deleting tunnel id = %llx (pdp %p)\n",
1559 pctx->u.v0.tid, pctx);
1560 else if (pctx->gtp_version == GTP_V1)
1561 netdev_dbg(pctx->dev, "GTPv1-U: deleting tunnel id = %x/%x (pdp %p)\n",
1562 pctx->u.v1.i_tei, pctx->u.v1.o_tei, pctx);
1564 gtp_tunnel_notify(pctx, GTP_CMD_DELPDP, GFP_ATOMIC);
1565 pdp_context_delete(pctx);
1573 int flags, u32 type, struct pdp_ctx *pctx)
1582 if (nla_put_u32(skb, GTPA_VERSION, pctx->gtp_version) ||
1583 nla_put_u32(skb, GTPA_LINK, pctx->dev->ifindex) ||
1584 nla_put_be32(skb, GTPA_PEER_ADDRESS, pctx->peer_addr_ip4.s_addr) ||
1585 nla_put_be32(skb, GTPA_MS_ADDRESS, pctx->ms_addr_ip4.s_addr))
1588 switch (pctx->gtp_version) {
1590 if (nla_put_u64_64bit(skb, GTPA_TID, pctx->u.v0.tid, GTPA_PAD) ||
1591 nla_put_u16(skb, GTPA_FLOW, pctx->u.v0.flow))
1595 if (nla_put_u32(skb, GTPA_I_TEI, pctx->u.v1.i_tei) ||
1596 nla_put_u32(skb, GTPA_O_TEI, pctx->u.v1.o_tei))
1609 static int gtp_tunnel_notify(struct pdp_ctx *pctx, u8 cmd, gfp_t allocation)
1618 ret = gtp_genl_fill_info(msg, 0, 0, 0, cmd, pctx);
1624 ret = genlmsg_multicast_netns(&gtp_genl_family, dev_net(pctx->dev), msg,
1631 struct pdp_ctx *pctx = NULL;
1640 pctx = gtp_find_pdp(sock_net(skb->sk), info->attrs);
1641 if (IS_ERR(pctx)) {
1642 err = PTR_ERR(pctx);
1653 0, info->nlhdr->nlmsg_type, pctx);
1673 struct pdp_ctx *pctx;
1690 hlist_for_each_entry_rcu(pctx, &gtp->tid_hash[i],
1697 cb->nlh->nlmsg_type, pctx)) {