pep-gprs.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * File: pep-gprs.c
  4. *
  5. * GPRS over Phonet pipe end point socket
  6. *
  7. * Copyright (C) 2008 Nokia Corporation.
  8. *
  9. * Author: Rémi Denis-Courmont
  10. */
  11. #include <linux/kernel.h>
  12. #include <linux/netdevice.h>
  13. #include <linux/if_ether.h>
  14. #include <linux/if_arp.h>
  15. #include <net/sock.h>
  16. #include <linux/if_phonet.h>
  17. #include <net/tcp_states.h>
  18. #include <net/phonet/gprs.h>
  19. #include <trace/events/sock.h>
  20. #define GPRS_DEFAULT_MTU 1400
  21. struct gprs_dev {
  22. struct sock *sk;
  23. void (*old_state_change)(struct sock *);
  24. void (*old_data_ready)(struct sock *);
  25. void (*old_write_space)(struct sock *);
  26. struct net_device *dev;
  27. };
  28. static __be16 gprs_type_trans(struct sk_buff *skb)
  29. {
  30. const u8 *pvfc;
  31. u8 buf;
  32. pvfc = skb_header_pointer(skb, 0, 1, &buf);
  33. if (!pvfc)
  34. return htons(0);
  35. /* Look at IP version field */
  36. switch (*pvfc >> 4) {
  37. case 4:
  38. return htons(ETH_P_IP);
  39. case 6:
  40. return htons(ETH_P_IPV6);
  41. }
  42. return htons(0);
  43. }
  44. static void gprs_writeable(struct gprs_dev *gp)
  45. {
  46. struct net_device *dev = gp->dev;
  47. if (pep_writeable(gp->sk))
  48. netif_wake_queue(dev);
  49. }
  50. /*
  51. * Socket callbacks
  52. */
  53. static void gprs_state_change(struct sock *sk)
  54. {
  55. struct gprs_dev *gp = sk->sk_user_data;
  56. if (sk->sk_state == TCP_CLOSE_WAIT) {
  57. struct net_device *dev = gp->dev;
  58. netif_stop_queue(dev);
  59. netif_carrier_off(dev);
  60. }
  61. }
  62. static int gprs_recv(struct gprs_dev *gp, struct sk_buff *skb)
  63. {
  64. struct net_device *dev = gp->dev;
  65. int err = 0;
  66. __be16 protocol = gprs_type_trans(skb);
  67. if (!protocol) {
  68. err = -EINVAL;
  69. goto drop;
  70. }
  71. if (skb_headroom(skb) & 3) {
  72. struct sk_buff *rskb, *fs;
  73. int flen = 0;
  74. /* Phonet Pipe data header may be misaligned (3 bytes),
  75. * so wrap the IP packet as a single fragment of an head-less
  76. * socket buffer. The network stack will pull what it needs,
  77. * but at least, the whole IP payload is not memcpy'd. */
  78. rskb = netdev_alloc_skb(dev, 0);
  79. if (!rskb) {
  80. err = -ENOBUFS;
  81. goto drop;
  82. }
  83. skb_shinfo(rskb)->frag_list = skb;
  84. rskb->len += skb->len;
  85. rskb->data_len += rskb->len;
  86. rskb->truesize += rskb->len;
  87. /* Avoid nested fragments */
  88. skb_walk_frags(skb, fs)
  89. flen += fs->len;
  90. skb->next = skb_shinfo(skb)->frag_list;
  91. skb_frag_list_init(skb);
  92. skb->len -= flen;
  93. skb->data_len -= flen;
  94. skb->truesize -= flen;
  95. skb = rskb;
  96. }
  97. skb->protocol = protocol;
  98. skb_reset_mac_header(skb);
  99. skb->dev = dev;
  100. if (likely(dev->flags & IFF_UP)) {
  101. dev->stats.rx_packets++;
  102. dev->stats.rx_bytes += skb->len;
  103. netif_rx(skb);
  104. skb = NULL;
  105. } else
  106. err = -ENODEV;
  107. drop:
  108. if (skb) {
  109. dev_kfree_skb(skb);
  110. dev->stats.rx_dropped++;
  111. }
  112. return err;
  113. }
  114. static void gprs_data_ready(struct sock *sk)
  115. {
  116. struct gprs_dev *gp = sk->sk_user_data;
  117. struct sk_buff *skb;
  118. trace_sk_data_ready(sk);
  119. while ((skb = pep_read(sk)) != NULL) {
  120. skb_orphan(skb);
  121. gprs_recv(gp, skb);
  122. }
  123. }
  124. static void gprs_write_space(struct sock *sk)
  125. {
  126. struct gprs_dev *gp = sk->sk_user_data;
  127. if (netif_running(gp->dev))
  128. gprs_writeable(gp);
  129. }
  130. /*
  131. * Network device callbacks
  132. */
  133. static int gprs_open(struct net_device *dev)
  134. {
  135. struct gprs_dev *gp = netdev_priv(dev);
  136. gprs_writeable(gp);
  137. return 0;
  138. }
  139. static int gprs_close(struct net_device *dev)
  140. {
  141. netif_stop_queue(dev);
  142. return 0;
  143. }
  144. static netdev_tx_t gprs_xmit(struct sk_buff *skb, struct net_device *dev)
  145. {
  146. struct gprs_dev *gp = netdev_priv(dev);
  147. struct sock *sk = gp->sk;
  148. int len, err;
  149. switch (skb->protocol) {
  150. case htons(ETH_P_IP):
  151. case htons(ETH_P_IPV6):
  152. break;
  153. default:
  154. dev_kfree_skb(skb);
  155. return NETDEV_TX_OK;
  156. }
  157. skb_orphan(skb);
  158. skb_set_owner_w(skb, sk);
  159. len = skb->len;
  160. err = pep_write(sk, skb);
  161. if (err) {
  162. net_dbg_ratelimited("%s: TX error (%d)\n", dev->name, err);
  163. dev->stats.tx_aborted_errors++;
  164. dev->stats.tx_errors++;
  165. } else {
  166. dev->stats.tx_packets++;
  167. dev->stats.tx_bytes += len;
  168. }
  169. netif_stop_queue(dev);
  170. if (pep_writeable(sk))
  171. netif_wake_queue(dev);
  172. return NETDEV_TX_OK;
  173. }
  174. static const struct net_device_ops gprs_netdev_ops = {
  175. .ndo_open = gprs_open,
  176. .ndo_stop = gprs_close,
  177. .ndo_start_xmit = gprs_xmit,
  178. };
  179. static void gprs_setup(struct net_device *dev)
  180. {
  181. dev->features = NETIF_F_FRAGLIST;
  182. dev->type = ARPHRD_PHONET_PIPE;
  183. dev->flags = IFF_POINTOPOINT | IFF_NOARP;
  184. dev->mtu = GPRS_DEFAULT_MTU;
  185. dev->min_mtu = 576;
  186. dev->max_mtu = (PHONET_MAX_MTU - 11);
  187. dev->hard_header_len = 0;
  188. dev->addr_len = 0;
  189. dev->tx_queue_len = 10;
  190. dev->netdev_ops = &gprs_netdev_ops;
  191. dev->needs_free_netdev = true;
  192. }
  193. /*
  194. * External interface
  195. */
  196. /*
  197. * Attach a GPRS interface to a datagram socket.
  198. * Returns the interface index on success, negative error code on error.
  199. */
  200. int gprs_attach(struct sock *sk)
  201. {
  202. static const char ifname[] = "gprs%d";
  203. struct gprs_dev *gp;
  204. struct net_device *dev;
  205. int err;
  206. if (unlikely(sk->sk_type == SOCK_STREAM))
  207. return -EINVAL; /* need packet boundaries */
  208. /* Create net device */
  209. dev = alloc_netdev(sizeof(*gp), ifname, NET_NAME_UNKNOWN, gprs_setup);
  210. if (!dev)
  211. return -ENOMEM;
  212. gp = netdev_priv(dev);
  213. gp->sk = sk;
  214. gp->dev = dev;
  215. netif_stop_queue(dev);
  216. err = register_netdev(dev);
  217. if (err) {
  218. free_netdev(dev);
  219. return err;
  220. }
  221. lock_sock(sk);
  222. if (unlikely(sk->sk_user_data)) {
  223. err = -EBUSY;
  224. goto out_rel;
  225. }
  226. if (unlikely((1 << sk->sk_state & (TCPF_CLOSE|TCPF_LISTEN)) ||
  227. sock_flag(sk, SOCK_DEAD))) {
  228. err = -EINVAL;
  229. goto out_rel;
  230. }
  231. sk->sk_user_data = gp;
  232. gp->old_state_change = sk->sk_state_change;
  233. gp->old_data_ready = sk->sk_data_ready;
  234. gp->old_write_space = sk->sk_write_space;
  235. sk->sk_state_change = gprs_state_change;
  236. sk->sk_data_ready = gprs_data_ready;
  237. sk->sk_write_space = gprs_write_space;
  238. release_sock(sk);
  239. sock_hold(sk);
  240. printk(KERN_DEBUG"%s: attached\n", dev->name);
  241. return dev->ifindex;
  242. out_rel:
  243. release_sock(sk);
  244. unregister_netdev(dev);
  245. return err;
  246. }
  247. void gprs_detach(struct sock *sk)
  248. {
  249. struct gprs_dev *gp = sk->sk_user_data;
  250. struct net_device *dev = gp->dev;
  251. lock_sock(sk);
  252. sk->sk_user_data = NULL;
  253. sk->sk_state_change = gp->old_state_change;
  254. sk->sk_data_ready = gp->old_data_ready;
  255. sk->sk_write_space = gp->old_write_space;
  256. release_sock(sk);
  257. printk(KERN_DEBUG"%s: detached\n", dev->name);
  258. unregister_netdev(dev);
  259. sock_put(sk);
  260. }