PageRenderTime 35ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/g-bios/lib/net/socket.c

https://github.com/wuyohee2004/learn
C | 726 lines | 552 code | 155 blank | 19 comment | 127 complexity | 39c6823dd284ddfa0529edfa53b83cac MD5 | raw file
  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <string.h>
  4. #include <malloc.h>
  5. #include <assert.h>
  6. #include <delay.h>
  7. #include <net/net.h>
  8. #include <net/skb.h>
  9. #include <fs.h>
  10. #include <uart/uart.h> // fixme: to be removed
  11. #define MAX_SOCK_NUM 32
  12. static struct socket *g_sock_fds[MAX_SOCK_NUM];
  13. static inline struct socket *get_sock(int fd)
  14. {
  15. if (fd <= 0 || fd >= MAX_SOCK_NUM)
  16. return NULL;
  17. return g_sock_fds[fd];
  18. }
  19. #define PORT_MIN 50000
  20. static inline __u16 port_alloc(int type)
  21. {
  22. static __u16 port = PORT_MIN;
  23. port++;
  24. if (port < PORT_MIN)
  25. port = PORT_MIN;
  26. return port;
  27. }
  28. static inline void port_free(__u16 port)
  29. {
  30. }
  31. static int tcp_wait_for_state(const struct socket *sock, enum tcp_state state)
  32. {
  33. int to;
  34. for (to = 0; to < 100; to++) {
  35. ndev_poll();
  36. if (sock->state == state)
  37. return 0;
  38. mdelay(100);
  39. }
  40. return -ETIMEDOUT;
  41. }
  42. int socket_ioctl(int fd, int cmd, int flags)
  43. {
  44. struct socket *sock;
  45. sock = get_sock(fd);
  46. if (NULL == sock)
  47. return -ENOENT;
  48. switch (cmd) {
  49. case SKIOCS_FLAGS:
  50. sock->obstruct_flags = flags;
  51. break;
  52. default:
  53. return -EINVAL;
  54. }
  55. return 0;
  56. }
  57. static struct sock_buff *sock_recv_packet(struct socket *sock)
  58. {
  59. __UNUSED__ __u32 psr;
  60. struct sock_buff *skb;
  61. struct list_head *first;
  62. int to = 10000; // timeout
  63. int ret;
  64. char key;
  65. while (1) {
  66. ret = uart_read(CONFIG_UART_INDEX, (__u8 *)&key, 1, WAIT_ASYNC);
  67. if (ret > 0 && key == CHAR_CTRL_C)
  68. return NULL;
  69. ndev_poll();
  70. lock_irq_psr(psr);
  71. if (!list_empty(&sock->rx_qu)) {
  72. unlock_irq_psr(psr);
  73. break;
  74. }
  75. unlock_irq_psr(psr);
  76. if (sock->obstruct_flags == 1) {
  77. to--;
  78. if (to == 0)
  79. break;
  80. }
  81. udelay(1000);
  82. }
  83. if (to > 0) {
  84. lock_irq_psr(psr);
  85. first = sock->rx_qu.next;
  86. list_del(first);
  87. unlock_irq_psr(psr);
  88. skb = container_of(first, struct sock_buff, node);
  89. return skb;
  90. }
  91. return NULL;
  92. }
  93. // fixme: to be removed
  94. int qu_is_empty(int fd)
  95. {
  96. __u32 __UNUSED__ psr;
  97. struct socket *sock;
  98. sock = get_sock(fd);
  99. if (NULL == sock)
  100. return 1;
  101. ndev_poll();
  102. lock_irq_psr(psr);
  103. if (!list_empty(&sock->rx_qu)) {
  104. unlock_irq_psr(psr);
  105. return 0;
  106. }
  107. unlock_irq_psr(psr);
  108. return 1;
  109. }
  110. int socket(int domain, int type, int protocol)
  111. {
  112. int fd;
  113. struct socket *sock;
  114. for (fd = 1; fd < MAX_SOCK_NUM; fd++) {
  115. if (NULL == g_sock_fds[fd])
  116. goto alloc_sock;
  117. }
  118. return -ENODEV;
  119. alloc_sock:
  120. sock = malloc(sizeof(struct socket));
  121. if (NULL == sock) {
  122. DPRINT("%s: fail to alloc socket!\n", __func__);
  123. return -ENOMEM;
  124. }
  125. sock->type = type;
  126. if (SOCK_STREAM == type) { // fixme
  127. sock->state = TCPS_CLOSED;
  128. sock->seq_num = 1; // fixme
  129. sock->ack_num = 0;
  130. }
  131. memset(sock->saddr, 0, sizeof(sock->saddr));
  132. INIT_LIST_HEAD(&sock->tx_qu);
  133. INIT_LIST_HEAD(&sock->rx_qu);
  134. sock->protocol = protocol;
  135. g_sock_fds[fd] = sock;
  136. return fd;
  137. }
  138. static void free_skb_list(struct list_head *qu)
  139. {
  140. struct list_head *first;
  141. struct sock_buff *skb;
  142. while (!list_empty(qu)) {
  143. first = qu->next;
  144. list_del(first);
  145. skb = container_of(first, struct sock_buff, node);
  146. skb_free(skb);
  147. }
  148. }
  149. int sk_close(int fd)
  150. {
  151. int ret;
  152. unsigned long __UNUSED__ cpsr;
  153. struct socket *sock;
  154. struct sock_buff *skb;
  155. sock = get_sock(fd);
  156. if (NULL == sock)
  157. return -EINVAL;
  158. if (TCPS_ESTABLISHED == sock->state || \
  159. TCPS_SYN_RCVD == sock->state || \
  160. TCPS_CLOSE_WAIT == sock->state) {
  161. enum tcp_state last_state;
  162. skb = skb_alloc(ETH_HDR_LEN + IP_HDR_LEN + TCP_HDR_LEN, 0);
  163. // if null
  164. skb->sock = sock;
  165. lock_irq_psr(cpsr);
  166. tcp_send_packet(skb, FLG_FIN | FLG_ACK, NULL);
  167. if (TCPS_CLOSE_WAIT == sock->state)
  168. sock->state = TCPS_LAST_ACK;
  169. else
  170. sock->state = TCPS_FIN_WAIT1;
  171. last_state = sock->state;
  172. unlock_irq_psr(cpsr);
  173. if (TCPS_LAST_ACK == last_state)
  174. ret = tcp_wait_for_state(sock, TCPS_CLOSED);
  175. else
  176. ret = tcp_wait_for_state(sock, TCPS_TIME_WAIT);
  177. if (ret < 0)
  178. return ret;
  179. }
  180. // fixme
  181. if (TCPS_TIME_WAIT == sock->state) {
  182. ret = tcp_wait_for_state(sock, TCPS_CLOSED);
  183. if (ret < 0)
  184. sock->state = TCPS_CLOSED;
  185. }
  186. if (TCPS_CLOSED == sock->state) {
  187. lock_irq_psr(cpsr);
  188. free_skb_list(&sock->rx_qu);
  189. free_skb_list(&sock->tx_qu);
  190. free(sock);
  191. unlock_irq_psr(cpsr);
  192. g_sock_fds[fd] = NULL;
  193. } else {
  194. printf("%s(): Warning! (state = %d)\n", __func__, sock->state);
  195. return -EINVAL;
  196. }
  197. return 0;
  198. }
  199. struct eth_addr *gethostaddr(const __u32 nip)
  200. {
  201. __u32 count = 0;
  202. struct eth_addr *remote_addr;
  203. arp_send_packet((__u8 *)&nip, NULL, ARP_OP_REQ);
  204. while (count < 100000) {
  205. int ret;
  206. __u8 key;
  207. ret = uart_read(CONFIG_UART_INDEX, &key, 1, WAIT_ASYNC);
  208. if (ret > 0 && key == CHAR_CTRL_C)
  209. return NULL;
  210. ndev_poll();
  211. remote_addr = getaddr(nip);
  212. if (remote_addr)
  213. break;
  214. // TODO: add re-send code here
  215. udelay(3);
  216. count++;
  217. }
  218. return remote_addr;
  219. }
  220. int bind(int fd, const struct sockaddr *addr, socklen_t len)
  221. {
  222. int ret = 0;
  223. struct socket *sock;
  224. const struct sockaddr_in *sa;
  225. struct sockaddr_in *sin;
  226. struct net_device *ndev;
  227. sock = get_sock(fd);
  228. if (NULL == sock) {
  229. // printf
  230. return -EINVAL;
  231. }
  232. sin = &sock->saddr[SA_SRC];
  233. sin->sin_family = addr->sa_family;
  234. switch (addr->sa_family) {
  235. case AF_INET:
  236. sa = (const struct sockaddr_in *)addr;
  237. sin->sin_port = sa->sin_port ? sa->sin_port : htons(port_alloc(sock->type));
  238. if (sa->sin_addr.s_addr == htonl(INADDR_ANY)) {
  239. // fixme: to find the best ndev
  240. ndev = ndev_get_first();
  241. sin->sin_addr.s_addr = ndev->ip;
  242. } else {
  243. sin->sin_addr = sa->sin_addr;
  244. }
  245. break;
  246. // TODO: support other address families here
  247. default:
  248. return -ENOTSUPP;
  249. }
  250. return ret;
  251. }
  252. //
  253. ssize_t sendto(int fd, const void *buff, __u32 buff_size, int flags,
  254. const struct sockaddr *dest_addr, socklen_t addr_size)
  255. {
  256. struct socket *sock;
  257. struct sock_buff *skb;
  258. sock = get_sock(fd);
  259. if (NULL == sock) {
  260. // printf
  261. return -EINVAL;
  262. }
  263. memcpy(&sock->saddr[SA_DST], dest_addr, addr_size);
  264. switch (sock->type) {
  265. case SOCK_RAW:
  266. if (PROT_ICMP == sock->protocol) {
  267. skb = skb_alloc(ETH_HDR_LEN + IP_HDR_LEN, buff_size);
  268. skb->sock = sock;
  269. memcpy(skb->data, buff, buff_size);
  270. ip_send_packet(skb, PROT_ICMP);
  271. break;
  272. } else if (PROT_ETH == sock->protocol) {
  273. arp_send_packet((__u8 *)&sock->saddr[SA_DST].sin_addr.s_addr, NULL, ARP_OP_REQ);
  274. break;
  275. }
  276. case SOCK_DGRAM:
  277. skb = skb_alloc(ETH_HDR_LEN + IP_HDR_LEN + UDP_HDR_LEN, buff_size);
  278. skb->sock = sock;
  279. memcpy(skb->data, buff, buff_size);
  280. udp_send_packet(skb);
  281. break;
  282. }
  283. return buff_size;
  284. }
  285. ssize_t recvfrom(int fd, void *buf, __u32 n, int flags,
  286. struct sockaddr *src_addr, socklen_t *addrlen)
  287. {
  288. struct socket *sock;
  289. struct sock_buff *skb = NULL;
  290. __u32 pkt_len;
  291. sock = get_sock(fd);
  292. if (NULL == sock)
  293. return -EINVAL;
  294. skb = sock_recv_packet(sock);
  295. if(NULL == skb)
  296. return 0;
  297. // fixme !
  298. pkt_len = min(skb->size, n);
  299. memcpy(buf, skb->data, pkt_len);
  300. *addrlen = sizeof(struct sockaddr_in);
  301. memcpy(src_addr, &sock->saddr[SA_DST], *addrlen);
  302. skb_free(skb);
  303. return pkt_len;
  304. }
  305. #if 0
  306. static void tcp_make_option(__u8 *opt, __u16 size)
  307. {
  308. __u32 tsv = htonl(3455994), tser = 0;
  309. if (size > 0) {
  310. memset(opt, 0, size);
  311. #if 1
  312. // MSS
  313. *opt++ = 2;
  314. *opt++ = 4;
  315. *(__u16 *)opt = htons(1460);
  316. opt += 2;
  317. #endif
  318. #if 1
  319. // SACK
  320. *opt++ = 4;
  321. *opt++ = 2;
  322. #endif
  323. #if 1
  324. // Time stamp
  325. *opt++ = 8;
  326. *opt++ = 10;
  327. memcpy(opt, &tsv, 4);
  328. opt += 4;
  329. memcpy(opt, &tser, 4);
  330. opt += 4;
  331. #endif
  332. #if 1
  333. // NOP
  334. *opt++ = 1;
  335. #endif
  336. #if 1
  337. // WS
  338. *opt++ = 3;
  339. *opt++ = 3;
  340. *opt++ = 5;
  341. #endif
  342. }
  343. }
  344. #endif
  345. int connect(int fd, const struct sockaddr *addr, socklen_t len)
  346. {
  347. int ret;
  348. __UNUSED__ __u32 psr;
  349. struct socket *sock;
  350. struct sock_buff *skb;
  351. sock = get_sock(fd);
  352. if (NULL == sock) {
  353. // DPRINT
  354. return -ENOENT;
  355. }
  356. memcpy(&sock->saddr[SA_DST], addr, len);
  357. // SYN
  358. skb = skb_alloc(ETH_HDR_LEN + IP_HDR_LEN + TCP_HDR_LEN, 0);
  359. // if null
  360. skb->sock = sock;
  361. lock_irq_psr(psr);
  362. tcp_send_packet(skb, FLG_SYN, NULL);
  363. sock->state = TCPS_SYN_SENT;
  364. unlock_irq_psr(psr);
  365. ret = tcp_wait_for_state(sock, TCPS_ESTABLISHED);
  366. if (ret < 0)
  367. sock->state = TCPS_CLOSED;
  368. return ret;
  369. }
  370. ssize_t send(int fd, const void *buf, size_t n, int flag)
  371. {
  372. struct socket *sock;
  373. struct sock_buff *skb;
  374. sock = get_sock(fd);
  375. if (NULL == sock)
  376. return -EINVAL;
  377. if (TCPS_ESTABLISHED != sock->state)
  378. return -EIO;
  379. skb = skb_alloc(ETH_HDR_LEN + IP_HDR_LEN + TCP_HDR_LEN, n);
  380. // if null
  381. skb->sock = sock;
  382. memcpy(skb->data, buf, n);
  383. tcp_send_packet(skb, FLG_PSH | FLG_ACK, NULL);
  384. #if 0
  385. for (time_out = 0; time_out < 10; time_out++) {
  386. ndev_poll();
  387. if (sock->state == 1)
  388. break;
  389. mdelay(100);
  390. printf("%s() line %d\n", __func__, __LINE__);
  391. }
  392. #endif
  393. return n;
  394. }
  395. ssize_t recv(int fd, void *buf, size_t n, int flag)
  396. {
  397. ssize_t pkt_len;
  398. struct socket *sock;
  399. struct sock_buff *skb;
  400. sock = get_sock(fd);
  401. if (NULL == sock)
  402. return -ENOENT;
  403. if (TCPS_ESTABLISHED != sock->state)
  404. return -EIO;
  405. skb = sock_recv_packet(sock);
  406. if (skb == NULL)
  407. return -EIO;
  408. pkt_len = skb->size <= n ? skb->size : n;
  409. memcpy(buf, skb->data, pkt_len);
  410. skb_free(skb);
  411. return pkt_len;
  412. }
  413. struct socket *tcp_search_socket(const struct tcp_header *tcp_pkt, const struct ip_header *ip_pkt)
  414. {
  415. int fd;
  416. struct socket *sock;
  417. struct sockaddr_in *saddr;
  418. for (fd = 1; fd < MAX_SOCK_NUM; fd++) {
  419. sock = g_sock_fds[fd];
  420. if (NULL == sock)
  421. continue;
  422. saddr = &sock->saddr[SA_SRC];
  423. if (sock->type != SOCK_STREAM)
  424. continue;
  425. #if 0
  426. if (memcmp(saddr->sin_addr, ip_pkt->src_ip, 4) != 0) {
  427. printf("sock = 0x%x, des ip is %d (NOT %d.%d.%d.%d, %02x.%02x.%02x.%02x.%02x.%02x)\n",
  428. saddr,
  429. ip_pkt->src_ip[3],
  430. saddr->des_ip[0],
  431. saddr->des_ip[1],
  432. saddr->des_ip[2],
  433. saddr->des_ip[3],
  434. saddr->des_mac[0],
  435. saddr->des_mac[1],
  436. saddr->des_mac[2],
  437. saddr->des_mac[3],
  438. saddr->des_mac[4],
  439. saddr->des_mac[5]
  440. );
  441. continue;
  442. }
  443. #endif
  444. if (saddr->sin_port != tcp_pkt->dst_port) {
  445. #if 0
  446. printf("from %d, src port: 0x%x != 0x%x\n", ip_pkt->src_ip[3], ntohs(saddr->src_port), BE16_TO_CPU(tcp_pkt->dst_port));
  447. #endif
  448. continue;
  449. }
  450. #if 0
  451. if (memcmp(&src_ip, ip_pkt->des_ip, 4) != 0) {
  452. printf("src ip: %d.%d.%d.%d\n",
  453. ip_pkt->des_ip[0],
  454. ip_pkt->des_ip[1],
  455. ip_pkt->des_ip[2],
  456. ip_pkt->des_ip[3]
  457. );
  458. continue;
  459. }
  460. #endif
  461. #if 0
  462. memcmp(&sock->saddr[SA_DST].sin_addr, ip_hdr->src_ip, IPV4_ADR_LEN);
  463. memcmp(sock->saddr[SA_DST].sin_port = tcp_hdr->src_port);
  464. #endif
  465. return sock;
  466. }
  467. return NULL;
  468. }
  469. struct socket *udp_search_socket(const struct udp_header *udp_pkt, const struct ip_header *ip_pkt)
  470. {
  471. int fd;
  472. struct socket *sock;
  473. struct sockaddr_in *saddr;
  474. #if 0
  475. __u32 src_ip;
  476. ndev_ioctl(NULL, NIOC_GET_IP, &src_ip);
  477. #endif
  478. for (fd = 1; fd < MAX_SOCK_NUM; fd++) {
  479. sock = g_sock_fds[fd];
  480. if (NULL == sock)
  481. continue;
  482. saddr = &sock->saddr[SA_SRC];
  483. if (sock->type != SOCK_DGRAM)
  484. continue;
  485. #if 0
  486. if (memcmp(saddr->sin_addr, ip_pkt->src_ip, 4) != 0) {
  487. printf("sock = 0x%x, des ip is %d (NOT %d.%d.%d.%d, %02x.%02x.%02x.%02x.%02x.%02x)\n",
  488. saddr,
  489. ip_pkt->src_ip[3],
  490. saddr->des_ip[0],
  491. saddr->des_ip[1],
  492. saddr->des_ip[2],
  493. saddr->des_ip[3],
  494. saddr->des_mac[0],
  495. saddr->des_mac[1],
  496. saddr->des_mac[2],
  497. saddr->des_mac[3],
  498. saddr->des_mac[4],
  499. saddr->des_mac[5]
  500. );
  501. continue;
  502. }
  503. #endif
  504. if (saddr->sin_port != udp_pkt->dst_port) {
  505. #if 0
  506. printf("from %d, src port: 0x%x != 0x%x\n", ip_pkt->src_ip[3], ntohs(saddr->src_port), BE16_TO_CPU(udp_pkt->dst_port));
  507. #endif
  508. continue;
  509. }
  510. #if 0
  511. if (memcmp(&src_ip, ip_pkt->des_ip, 4) != 0) {
  512. printf("src ip: %d.%d.%d.%d\n",
  513. ip_pkt->des_ip[0],
  514. ip_pkt->des_ip[1],
  515. ip_pkt->des_ip[2],
  516. ip_pkt->des_ip[3]
  517. );
  518. continue;
  519. }
  520. #endif
  521. return sock;
  522. }
  523. return NULL;
  524. }
  525. struct socket *icmp_search_socket(const struct ping_packet *ping_pkt, const struct ip_header *ip_pkt)
  526. {
  527. int fd;
  528. struct socket *sock;
  529. #if 0
  530. __u32 src_ip;
  531. ndev_ioctl(NULL, NIOC_GET_IP, &src_ip);
  532. #endif
  533. for (fd = 1; fd < MAX_SOCK_NUM; fd++) {
  534. sock = g_sock_fds[fd];
  535. if (NULL == sock)
  536. continue;
  537. if (sock->type != SOCK_RAW)
  538. continue;
  539. if (memcmp(&sock->saddr[SA_DST].sin_addr.s_addr, ip_pkt->src_ip, 4))
  540. continue;
  541. #if 0
  542. if (memcmp(&src_ip, ip_pkt->des_ip, 4) != 0) {
  543. printf("src ip: %d.%d.%d.%d\n",
  544. ip_pkt->des_ip[0],
  545. ip_pkt->des_ip[1],
  546. ip_pkt->des_ip[2],
  547. ip_pkt->des_ip[3]
  548. );
  549. continue;
  550. }
  551. #endif
  552. return sock;
  553. }
  554. return NULL;
  555. }
  556. struct socket *arp_search_socket(const struct arp_packet *arp_pkt)
  557. {
  558. int fd;
  559. struct socket *sock;
  560. for (fd = 1; fd < MAX_SOCK_NUM; fd++) {
  561. sock = g_sock_fds[fd];
  562. if (NULL == sock)
  563. continue;
  564. if (sock->type != SOCK_RAW || PROT_ETH != sock->protocol)
  565. continue;
  566. if (memcmp(&sock->saddr[SA_DST].sin_addr.s_addr, arp_pkt->src_ip, 4))
  567. continue;
  568. return sock;
  569. }
  570. return NULL;
  571. }