Deleted Added
full compact
keysock.c (243882) keysock.c (252028)
1/* $FreeBSD: head/sys/netipsec/keysock.c 243882 2012-12-05 08:04:20Z glebius $ */
1/* $FreeBSD: head/sys/netipsec/keysock.c 252028 2013-06-20 11:44:16Z ae $ */
2/* $KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $ */
3
4/*-
5 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions

--- 76 unchanged lines hidden (view full) ---

86key_output(struct mbuf *m, struct socket *so)
87{
88 struct sadb_msg *msg;
89 int len, error = 0;
90
91 if (m == 0)
92 panic("%s: NULL pointer was passed.\n", __func__);
93
2/* $KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $ */
3
4/*-
5 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions

--- 76 unchanged lines hidden (view full) ---

86key_output(struct mbuf *m, struct socket *so)
87{
88 struct sadb_msg *msg;
89 int len, error = 0;
90
91 if (m == 0)
92 panic("%s: NULL pointer was passed.\n", __func__);
93
94 V_pfkeystat.out_total++;
95 V_pfkeystat.out_bytes += m->m_pkthdr.len;
94 PFKEYSTAT_INC(out_total);
95 PFKEYSTAT_ADD(out_bytes, m->m_pkthdr.len);
96
97 len = m->m_pkthdr.len;
98 if (len < sizeof(struct sadb_msg)) {
96
97 len = m->m_pkthdr.len;
98 if (len < sizeof(struct sadb_msg)) {
99 V_pfkeystat.out_tooshort++;
99 PFKEYSTAT_INC(out_tooshort);
100 error = EINVAL;
101 goto end;
102 }
103
104 if (m->m_len < sizeof(struct sadb_msg)) {
105 if ((m = m_pullup(m, sizeof(struct sadb_msg))) == 0) {
100 error = EINVAL;
101 goto end;
102 }
103
104 if (m->m_len < sizeof(struct sadb_msg)) {
105 if ((m = m_pullup(m, sizeof(struct sadb_msg))) == 0) {
106 V_pfkeystat.out_nomem++;
106 PFKEYSTAT_INC(out_nomem);
107 error = ENOBUFS;
108 goto end;
109 }
110 }
111
112 M_ASSERTPKTHDR(m);
113
114 KEYDEBUG(KEYDEBUG_KEY_DUMP, kdebug_mbuf(m));
115
116 msg = mtod(m, struct sadb_msg *);
107 error = ENOBUFS;
108 goto end;
109 }
110 }
111
112 M_ASSERTPKTHDR(m);
113
114 KEYDEBUG(KEYDEBUG_KEY_DUMP, kdebug_mbuf(m));
115
116 msg = mtod(m, struct sadb_msg *);
117 V_pfkeystat.out_msgtype[msg->sadb_msg_type]++;
117 PFKEYSTAT_INC(out_msgtype[msg->sadb_msg_type]);
118 if (len != PFKEY_UNUNIT64(msg->sadb_msg_len)) {
118 if (len != PFKEY_UNUNIT64(msg->sadb_msg_len)) {
119 V_pfkeystat.out_invlen++;
119 PFKEYSTAT_INC(out_invlen);
120 error = EINVAL;
121 goto end;
122 }
123
124 error = key_parse(m, so);
125 m = NULL;
126end:
127 if (m)

--- 14 unchanged lines hidden (view full) ---

142
143 if (promisc) {
144 struct sadb_msg *pmsg;
145
146 M_PREPEND(m, sizeof(struct sadb_msg), M_NOWAIT);
147 if (m && m->m_len < sizeof(struct sadb_msg))
148 m = m_pullup(m, sizeof(struct sadb_msg));
149 if (!m) {
120 error = EINVAL;
121 goto end;
122 }
123
124 error = key_parse(m, so);
125 m = NULL;
126end:
127 if (m)

--- 14 unchanged lines hidden (view full) ---

142
143 if (promisc) {
144 struct sadb_msg *pmsg;
145
146 M_PREPEND(m, sizeof(struct sadb_msg), M_NOWAIT);
147 if (m && m->m_len < sizeof(struct sadb_msg))
148 m = m_pullup(m, sizeof(struct sadb_msg));
149 if (!m) {
150 V_pfkeystat.in_nomem++;
150 PFKEYSTAT_INC(in_nomem);
151 m_freem(m);
152 return ENOBUFS;
153 }
154 m->m_pkthdr.len += sizeof(*pmsg);
155
156 pmsg = mtod(m, struct sadb_msg *);
157 bzero(pmsg, sizeof(*pmsg));
158 pmsg->sadb_msg_version = PF_KEY_V2;
159 pmsg->sadb_msg_type = SADB_X_PROMISC;
160 pmsg->sadb_msg_len = PFKEY_UNIT64(m->m_pkthdr.len);
161 /* pid and seq? */
162
151 m_freem(m);
152 return ENOBUFS;
153 }
154 m->m_pkthdr.len += sizeof(*pmsg);
155
156 pmsg = mtod(m, struct sadb_msg *);
157 bzero(pmsg, sizeof(*pmsg));
158 pmsg->sadb_msg_version = PF_KEY_V2;
159 pmsg->sadb_msg_type = SADB_X_PROMISC;
160 pmsg->sadb_msg_len = PFKEY_UNIT64(m->m_pkthdr.len);
161 /* pid and seq? */
162
163 V_pfkeystat.in_msgtype[pmsg->sadb_msg_type]++;
163 PFKEYSTAT_INC(in_msgtype[pmsg->sadb_msg_type]);
164 }
165
166 if (!sbappendaddr(&rp->rcb_socket->so_rcv, (struct sockaddr *)&key_src,
167 m, NULL)) {
164 }
165
166 if (!sbappendaddr(&rp->rcb_socket->so_rcv, (struct sockaddr *)&key_src,
167 m, NULL)) {
168 V_pfkeystat.in_nomem++;
168 PFKEYSTAT_INC(in_nomem);
169 m_freem(m);
170 error = ENOBUFS;
171 } else
172 error = 0;
173 sorwakeup(rp->rcb_socket);
174 return error;
175}
176

--- 15 unchanged lines hidden (view full) ---

192 KEYDEBUG(KEYDEBUG_KEY_DUMP,
193 printf("%s: \n", __func__);
194 kdebug_sadb(msg));
195
196 /*
197 * we increment statistics here, just in case we have ENOBUFS
198 * in this function.
199 */
169 m_freem(m);
170 error = ENOBUFS;
171 } else
172 error = 0;
173 sorwakeup(rp->rcb_socket);
174 return error;
175}
176

--- 15 unchanged lines hidden (view full) ---

192 KEYDEBUG(KEYDEBUG_KEY_DUMP,
193 printf("%s: \n", __func__);
194 kdebug_sadb(msg));
195
196 /*
197 * we increment statistics here, just in case we have ENOBUFS
198 * in this function.
199 */
200 V_pfkeystat.in_total++;
201 V_pfkeystat.in_bytes += len;
202 V_pfkeystat.in_msgtype[msg->sadb_msg_type]++;
200 PFKEYSTAT_INC(in_total);
201 PFKEYSTAT_ADD(in_bytes, len);
202 PFKEYSTAT_INC(in_msgtype[msg->sadb_msg_type]);
203
204 /*
205 * Get mbuf chain whenever possible (not clusters),
206 * to save socket buffer. We'll be generating many SADB_ACQUIRE
207 * messages to listening key sockets. If we simply allocate clusters,
208 * sbappendaddr() will raise ENOBUFS due to too little sbspace().
209 * sbspace() computes # of actual data bytes AND mbuf region.
210 *
211 * TODO: SADB_ACQUIRE filters should be implemented.
212 */
213 tlen = len;
214 m = mprev = NULL;
215 while (tlen > 0) {
216 if (tlen == len) {
217 MGETHDR(n, M_NOWAIT, MT_DATA);
218 if (n == NULL) {
203
204 /*
205 * Get mbuf chain whenever possible (not clusters),
206 * to save socket buffer. We'll be generating many SADB_ACQUIRE
207 * messages to listening key sockets. If we simply allocate clusters,
208 * sbappendaddr() will raise ENOBUFS due to too little sbspace().
209 * sbspace() computes # of actual data bytes AND mbuf region.
210 *
211 * TODO: SADB_ACQUIRE filters should be implemented.
212 */
213 tlen = len;
214 m = mprev = NULL;
215 while (tlen > 0) {
216 if (tlen == len) {
217 MGETHDR(n, M_NOWAIT, MT_DATA);
218 if (n == NULL) {
219 V_pfkeystat.in_nomem++;
219 PFKEYSTAT_INC(in_nomem);
220 return ENOBUFS;
221 }
222 n->m_len = MHLEN;
223 } else {
224 MGET(n, M_NOWAIT, MT_DATA);
225 if (n == NULL) {
220 return ENOBUFS;
221 }
222 n->m_len = MHLEN;
223 } else {
224 MGET(n, M_NOWAIT, MT_DATA);
225 if (n == NULL) {
226 V_pfkeystat.in_nomem++;
226 PFKEYSTAT_INC(in_nomem);
227 return ENOBUFS;
228 }
229 n->m_len = MLEN;
230 }
231 if (tlen >= MCLBYTES) { /*XXX better threshold? */
232 MCLGET(n, M_NOWAIT);
233 if ((n->m_flags & M_EXT) == 0) {
234 m_free(n);
235 m_freem(m);
227 return ENOBUFS;
228 }
229 n->m_len = MLEN;
230 }
231 if (tlen >= MCLBYTES) { /*XXX better threshold? */
232 MCLGET(n, M_NOWAIT);
233 if ((n->m_flags & M_EXT) == 0) {
234 m_free(n);
235 m_freem(m);
236 V_pfkeystat.in_nomem++;
236 PFKEYSTAT_INC(in_nomem);
237 return ENOBUFS;
238 }
239 n->m_len = MCLBYTES;
240 }
241
242 if (tlen < n->m_len)
243 n->m_len = tlen;
244 n->m_next = NULL;

--- 6 unchanged lines hidden (view full) ---

251 tlen -= n->m_len;
252 n = NULL;
253 }
254 m->m_pkthdr.len = len;
255 m->m_pkthdr.rcvif = NULL;
256 m_copyback(m, 0, len, (caddr_t)msg);
257
258 /* avoid duplicated statistics */
237 return ENOBUFS;
238 }
239 n->m_len = MCLBYTES;
240 }
241
242 if (tlen < n->m_len)
243 n->m_len = tlen;
244 n->m_next = NULL;

--- 6 unchanged lines hidden (view full) ---

251 tlen -= n->m_len;
252 n = NULL;
253 }
254 m->m_pkthdr.len = len;
255 m->m_pkthdr.rcvif = NULL;
256 m_copyback(m, 0, len, (caddr_t)msg);
257
258 /* avoid duplicated statistics */
259 V_pfkeystat.in_total--;
260 V_pfkeystat.in_bytes -= len;
261 V_pfkeystat.in_msgtype[msg->sadb_msg_type]--;
259 PFKEYSTAT_ADD(in_total, -1);
260 PFKEYSTAT_ADD(in_bytes, -len);
261 PFKEYSTAT_ADD(in_msgtype[msg->sadb_msg_type], -1);
262
263 return key_sendup_mbuf(so, m, target);
264}
265
266/* so can be NULL if target != KEY_SENDUP_ONE */
267int
268key_sendup_mbuf(so, m, target)
269 struct socket *so;

--- 6 unchanged lines hidden (view full) ---

276 struct rawcb *rp;
277 int error = 0;
278
279 if (m == NULL)
280 panic("key_sendup_mbuf: NULL pointer was passed.\n");
281 if (so == NULL && target == KEY_SENDUP_ONE)
282 panic("%s: NULL pointer was passed.\n", __func__);
283
262
263 return key_sendup_mbuf(so, m, target);
264}
265
266/* so can be NULL if target != KEY_SENDUP_ONE */
267int
268key_sendup_mbuf(so, m, target)
269 struct socket *so;

--- 6 unchanged lines hidden (view full) ---

276 struct rawcb *rp;
277 int error = 0;
278
279 if (m == NULL)
280 panic("key_sendup_mbuf: NULL pointer was passed.\n");
281 if (so == NULL && target == KEY_SENDUP_ONE)
282 panic("%s: NULL pointer was passed.\n", __func__);
283
284 V_pfkeystat.in_total++;
285 V_pfkeystat.in_bytes += m->m_pkthdr.len;
284 PFKEYSTAT_INC(in_total);
285 PFKEYSTAT_ADD(in_bytes, m->m_pkthdr.len);
286 if (m->m_len < sizeof(struct sadb_msg)) {
287 m = m_pullup(m, sizeof(struct sadb_msg));
288 if (m == NULL) {
286 if (m->m_len < sizeof(struct sadb_msg)) {
287 m = m_pullup(m, sizeof(struct sadb_msg));
288 if (m == NULL) {
289 V_pfkeystat.in_nomem++;
289 PFKEYSTAT_INC(in_nomem);
290 return ENOBUFS;
291 }
292 }
293 if (m->m_len >= sizeof(struct sadb_msg)) {
294 struct sadb_msg *msg;
295 msg = mtod(m, struct sadb_msg *);
290 return ENOBUFS;
291 }
292 }
293 if (m->m_len >= sizeof(struct sadb_msg)) {
294 struct sadb_msg *msg;
295 msg = mtod(m, struct sadb_msg *);
296 V_pfkeystat.in_msgtype[msg->sadb_msg_type]++;
296 PFKEYSTAT_INC(in_msgtype[msg->sadb_msg_type]);
297 }
298 mtx_lock(&rawcb_mtx);
299 LIST_FOREACH(rp, &V_rawcb_list, list)
300 {
301 if (rp->rcb_proto.sp_family != PF_KEY)
302 continue;
303 if (rp->rcb_proto.sp_protocol
304 && rp->rcb_proto.sp_protocol != PF_KEY_V2) {

--- 28 unchanged lines hidden (view full) ---

333 case KEY_SENDUP_ALL:
334 sendup++;
335 break;
336 case KEY_SENDUP_REGISTERED:
337 if (kp->kp_registered)
338 sendup++;
339 break;
340 }
297 }
298 mtx_lock(&rawcb_mtx);
299 LIST_FOREACH(rp, &V_rawcb_list, list)
300 {
301 if (rp->rcb_proto.sp_family != PF_KEY)
302 continue;
303 if (rp->rcb_proto.sp_protocol
304 && rp->rcb_proto.sp_protocol != PF_KEY_V2) {

--- 28 unchanged lines hidden (view full) ---

333 case KEY_SENDUP_ALL:
334 sendup++;
335 break;
336 case KEY_SENDUP_REGISTERED:
337 if (kp->kp_registered)
338 sendup++;
339 break;
340 }
341 V_pfkeystat.in_msgtarget[target]++;
341 PFKEYSTAT_INC(in_msgtarget[target]);
342
343 if (!sendup)
344 continue;
345
346 if ((n = m_copy(m, 0, (int)M_COPYALL)) == NULL) {
347 m_freem(m);
342
343 if (!sendup)
344 continue;
345
346 if ((n = m_copy(m, 0, (int)M_COPYALL)) == NULL) {
347 m_freem(m);
348 V_pfkeystat.in_nomem++;
348 PFKEYSTAT_INC(in_nomem);
349 mtx_unlock(&rawcb_mtx);
350 return ENOBUFS;
351 }
352
353 if ((error = key_sendup0(rp, n, 0)) != 0) {
354 m_freem(m);
355 mtx_unlock(&rawcb_mtx);
356 return error;

--- 226 unchanged lines hidden ---
349 mtx_unlock(&rawcb_mtx);
350 return ENOBUFS;
351 }
352
353 if ((error = key_sendup0(rp, n, 0)) != 0) {
354 m_freem(m);
355 mtx_unlock(&rawcb_mtx);
356 return error;

--- 226 unchanged lines hidden ---