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 --- |