source: asp3_tinet_ecnl_rx/trunk/asp3_dcre/tinet/netinet/udpn_output.c@ 337

Last change on this file since 337 was 337, checked in by coas-nagasima, 6 years ago

ASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 6.7 KB
Line 
1/*
2 * TINET (TCP/IP Protocol Stack)
3 *
4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering
5 * Tomakomai National College of Technology, JAPAN
6 *
7 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation
8 * によって公表されている GNU General Public License の Version 2 に記
9 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
10 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
11 * 利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * の無保証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20 * 用できない形で再配布する場合には,次の条件を満たすこと.
21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 *
26 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
27 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
28 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
29 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
30 *
31 * @(#) $Id$
32 */
33
34/*
35 * Copyright (c) 1982, 1986, 1988, 1990, 1993, 1995
36 * The Regents of the University of California. All rights reserved.
37 *
38 * Redistribution and use in source and binary forms, with or without
39 * modification, are permitted provided that the following conditions
40 * are met:
41 * 1. Redistributions of source code must retain the above copyright
42 * notice, this list of conditions and the following disclaimer.
43 * 2. Redistributions in binary form must reproduce the above copyright
44 * notice, this list of conditions and the following disclaimer in the
45 * documentation and/or other materials provided with the distribution.
46 * 3. All advertising materials mentioning features or use of this software
47 * must display the following acknowledgement:
48 * This product includes software developed by the University of
49 * California, Berkeley and its contributors.
50 * 4. Neither the name of the University nor the names of its contributors
51 * may be used to endorse or promote products derived from this software
52 * without specific prior written permission.
53 *
54 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
55 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
56 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
57 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
58 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
59 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
60 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
61 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
62 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
63 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
64 * SUCH DAMAGE.
65 */
66
67/*
68 * udp_output -- UDP の出力関数
69 * ノンブロッキングコールを組み込んだとき使用する。
70 */
71
72static void
73UDP_OUTPUT (T_UDP_CEP *cep)
74{
75 T_NET_BUF *output;
76 T_UDP_HDR *udph;
77 ER_UINT error;
78
79#ifdef UDP_CFG_OUT_CHECKSUM
80 uint16_t sum;
81#endif /* of #ifdef UDP_CFG_OUT_CHECKSUM */
82
83 /* IP データグラムを割り当てる。*/
84 if ((error = IN_GET_DATAGRAM(&output, (uint_t)(UDP_HDR_SIZE + cep->snd_len), 0,
85 &cep->snd_p_dstaddr->ipaddr,
86 &cep->myaddr.ipaddr,
87 IPPROTO_UDP, IP_DEFTTL,
88 NBA_SEARCH_ASCENT, TMO_UDP_OUTPUT)) != E_OK) {
89 goto err_ret;
90 }
91
92 /* UDP ヘッダに情報を設定する。*/
93 udph = GET_UDP_HDR(output, IF_IP_UDP_HDR_OFFSET(output));
94 udph->sport = htons(cep->myaddr.portno);
95 udph->dport = htons(cep->snd_p_dstaddr->portno);
96 udph->ulen = htons(UDP_HDR_SIZE + cep->snd_len);
97 udph->sum = 0;
98
99 /* データをコピーする。*/
100 memcpy((void*)GET_UDP_SDU(output, IF_IP_UDP_HDR_OFFSET(output)),
101 cep->snd_data, (size_t)cep->snd_len);
102
103#ifdef UDP_CFG_OUT_CHECKSUM
104
105 sum = IN_CKSUM(output, IPPROTO_UDP, IF_IP_UDP_HDR_OFFSET(output),
106 (uint_t)(UDP_HDR_SIZE + cep->snd_len));
107
108 /* 計算したチェックサムの値が 0 なら 0xffff を入れる。*/
109 if (sum == 0)
110 sum = UINT_C(0xffff);
111 udph->sum = sum;
112
113#endif/* of #ifdef UDP_CFG_OUT_CHECKSUM */
114
115 /* ネットワークバッファ長を調整する。*/
116 output->len = (uint16_t)(IF_IP_UDP_HDR_SIZE(output) + cep->snd_len);
117
118 /* ネットワーク層 (IP) の出力関数を呼び出す。*/
119 if ((error = IP_OUTPUT(output, TMO_UDP_OUTPUT)) != E_OK)
120 goto err_ret;
121
122
123 NET_COUNT_MIB(udp_stats.udpOutDatagrams, 1);
124
125 if (IS_PTR_DEFINED(cep->callback)) {
126
127 if (error == E_OK)
128 error = cep->snd_len;
129
130#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
131 (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_SND_DAT, (void*)error);
132#else
133 (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_SND_DAT, (void*)&error);
134#endif
135 }
136 else
137 syslog(LOG_WARNING, "[UDP] no call back, CEP: %d.", GET_UDP_CEPID(cep));
138 cep->snd_p_dstaddr = NULL;
139 return;
140
141err_ret:
142 NET_COUNT_UDP(net_count_udp.out_err_packets, 1);
143 if (IS_PTR_DEFINED(cep->callback)) {
144
145#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
146
147 (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_SND_DAT, (void*)E_NOMEM);
148
149#else /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
150
151 error = E_NOMEM;
152 (*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_SND_DAT, (void*)&error);
153
154#endif /* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
155
156 }
157 else
158 syslog(LOG_WARNING, "[UDP] no call back, CEP: %d.", GET_UDP_CEPID(cep));
159 cep->snd_p_dstaddr = NULL;
160 return;
161 }
Note: See TracBrowser for help on using the repository browser.