Changeset 1174:b72836fb814b in freeDiameter for libfdcore
- Timestamp:
- Jun 3, 2013, 1:05:37 PM (11 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libfdcore/sctp.c
r1107 r1174 45 45 #endif /* CMSG_BUF_LEN */ 46 46 47 /* Level of SCTP-specific traces */ 48 #ifdef DEBUG_SCTP 49 #define SCTP_LEVEL FULL 50 #else /* DEBUG_SCTP */ 51 #define SCTP_LEVEL (FCTS + 1) 52 #endif /* DEBUG_SCTP */ 47 /* Use old draft-ietf-tsvwg-sctpsocket-17 API ? If not defined, RFC6458 API will be used */ 48 /* #define OLD_SCTP_SOCKET_API */ 49 50 /* Automatically fallback to old API if some of the new symbols are not defined */ 51 #if (!defined(SCTP_CONNECTX_4_ARGS) || (!defined(SCTP_RECVRCVINFO)) || (!defined(SCTP_SNDINFO))) 52 # define OLD_SCTP_SOCKET_API 53 #endif 54 53 55 54 56 /* Temper with the retransmission timers to try and improve disconnection detection response? Undef this to keep the defaults of SCTP stack */ … … 58 60 59 61 /* Pre-binding socket options -- # streams read in config */ 60 /* The code of this file is based on draft-ietf-tsvwg-sctpsocket, versions 17 to 21 */61 62 static int fd_setsockopt_prebind(int sk) 62 63 { … … 79 80 memset(&rtoinfo, 0, sizeof(rtoinfo)); 80 81 81 if (TRACE_BOOL( SCTP_LEVEL)) {82 if (TRACE_BOOL(ANNOYING)) { 82 83 sz = sizeof(rtoinfo); 83 84 /* Read socket defaults */ … … 100 101 CHECK_SYS( setsockopt(sk, IPPROTO_SCTP, SCTP_RTOINFO, &rtoinfo, sizeof(rtoinfo)) ); 101 102 102 if (TRACE_BOOL( SCTP_LEVEL)) {103 if (TRACE_BOOL(ANNOYING)) { 103 104 /* Check new values */ 104 105 CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_RTOINFO, &rtoinfo, &sz) ); … … 109 110 } 110 111 #else /* SCTP_RTOINFO */ 111 TRACE_DEBUG( SCTP_LEVEL, "Skipping SCTP_RTOINFO");112 TRACE_DEBUG(ANNOYING, "Skipping SCTP_RTOINFO"); 112 113 #endif /* SCTP_RTOINFO */ 113 114 … … 118 119 memset(&assoc, 0, sizeof(assoc)); 119 120 120 if (TRACE_BOOL( SCTP_LEVEL)) {121 if (TRACE_BOOL(ANNOYING)) { 121 122 sz = sizeof(assoc); 122 123 /* Read socket defaults */ … … 140 141 CHECK_SYS( setsockopt(sk, IPPROTO_SCTP, SCTP_ASSOCINFO, &assoc, sizeof(assoc)) ); 141 142 142 if (TRACE_BOOL( SCTP_LEVEL)) {143 if (TRACE_BOOL(ANNOYING)) { 143 144 /* Check new values */ 144 145 CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_ASSOCINFO, &assoc, &sz) ); … … 151 152 } 152 153 #else /* SCTP_ASSOCINFO */ 153 TRACE_DEBUG( SCTP_LEVEL, "Skipping SCTP_ASSOCINFO");154 TRACE_DEBUG(ANNOYING, "Skipping SCTP_ASSOCINFO"); 154 155 #endif /* SCTP_ASSOCINFO */ 155 156 #endif /* ADJUST_RTX_PARAMS */ … … 161 162 memset(&init, 0, sizeof(init)); 162 163 163 if (TRACE_BOOL( SCTP_LEVEL)) {164 if (TRACE_BOOL(ANNOYING)) { 164 165 sz = sizeof(init); 165 166 … … 184 185 CHECK_SYS( setsockopt(sk, IPPROTO_SCTP, SCTP_INITMSG, &init, sizeof(init)) ); 185 186 186 if (TRACE_BOOL( SCTP_LEVEL)) {187 if (TRACE_BOOL(ANNOYING)) { 187 188 /* Check new values */ 188 189 CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_INITMSG, &init, &sz) ); … … 194 195 } 195 196 #else /* SCTP_INITMSG */ 196 TRACE_DEBUG( SCTP_LEVEL, "Skipping SCTP_INITMSG");197 TRACE_DEBUG(ANNOYING, "Skipping SCTP_INITMSG"); 197 198 #endif /* SCTP_INITMSG */ 198 199 … … 203 204 memset(&linger, 0, sizeof(linger)); 204 205 205 if (TRACE_BOOL( SCTP_LEVEL)) {206 if (TRACE_BOOL(ANNOYING)) { 206 207 sz = sizeof(linger); 207 208 /* Read socket defaults */ … … 222 223 CHECK_SYS( setsockopt(sk, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger)) ); 223 224 224 if (TRACE_BOOL( SCTP_LEVEL)) {225 if (TRACE_BOOL(ANNOYING)) { 225 226 /* Check new values */ 226 227 CHECK_SYS( getsockopt(sk, SOL_SOCKET, SO_LINGER, &linger, &sz) ); … … 230 231 } 231 232 #else /* SO_LINGER */ 232 TRACE_DEBUG( SCTP_LEVEL, "Skipping SO_LINGER");233 TRACE_DEBUG(ANNOYING, "Skipping SO_LINGER"); 233 234 #endif /* SO_LINGER */ 234 235 … … 238 239 int nodelay; 239 240 240 if (TRACE_BOOL( SCTP_LEVEL)) {241 if (TRACE_BOOL(ANNOYING)) { 241 242 sz = sizeof(nodelay); 242 243 /* Read socket defaults */ … … 255 256 CHECK_SYS( setsockopt(sk, IPPROTO_SCTP, SCTP_NODELAY, &nodelay, sizeof(nodelay)) ); 256 257 257 if (TRACE_BOOL( SCTP_LEVEL)) {258 if (TRACE_BOOL(ANNOYING)) { 258 259 /* Check new values */ 259 260 CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_NODELAY, &nodelay, &sz) ); … … 262 263 } 263 264 #else /* SCTP_NODELAY */ 264 TRACE_DEBUG( SCTP_LEVEL, "Skipping SCTP_NODELAY");265 TRACE_DEBUG(ANNOYING, "Skipping SCTP_NODELAY"); 265 266 #endif /* SCTP_NODELAY */ 266 267 … … 278 279 int nofrag; 279 280 280 if (TRACE_BOOL( SCTP_LEVEL)) {281 if (TRACE_BOOL(ANNOYING)) { 281 282 sz = sizeof(nofrag); 282 283 /* Read socket defaults */ … … 295 296 CHECK_SYS( setsockopt(sk, IPPROTO_SCTP, SCTP_DISABLE_FRAGMENTS, &nofrag, sizeof(nofrag)) ); 296 297 297 if (TRACE_BOOL( SCTP_LEVEL)) {298 if (TRACE_BOOL(ANNOYING)) { 298 299 /* Check new values */ 299 300 CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_DISABLE_FRAGMENTS, &nofrag, &sz) ); … … 314 315 parms.spp_address.ss_family = AF_INET; 315 316 316 if (TRACE_BOOL( SCTP_LEVEL)) {317 if (TRACE_BOOL(ANNOYING)) { 317 318 sz = sizeof(parms); 318 319 … … 345 346 CHECK_SYS( setsockopt(sk, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, &parms, sizeof(parms)) ); 346 347 347 if (TRACE_BOOL( SCTP_LEVEL)) {348 if (TRACE_BOOL(ANNOYING)) { 348 349 /* Check new values */ 349 350 CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, &parms, &sz) ); … … 357 358 } 358 359 #else /* SCTP_PEER_ADDR_PARAMS */ 359 TRACE_DEBUG( SCTP_LEVEL, "Skipping SCTP_PEER_ADDR_PARAMS");360 TRACE_DEBUG(ANNOYING, "Skipping SCTP_PEER_ADDR_PARAMS"); 360 361 #endif /* SCTP_PEER_ADDR_PARAMS */ 361 362 362 363 /* 363 SCTP_DEFAULT_SEND_PARAM 364 SCTP_DEFAULT_SEND_PARAM - DEPRECATED // parameters for the sendto() call, we don't use it. 364 365 */ 365 366 366 367 /* Subscribe to some notifications */ 367 #ifdef SCTP_EVENTS 368 #ifdef OLD_SCTP_SOCKET_API 369 #ifdef SCTP_EVENTS /* DEPRECATED */ 368 370 { 369 371 struct sctp_event_subscribe event; … … 383 385 CHECK_SYS( setsockopt(sk, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(event)) ); 384 386 385 if (TRACE_BOOL( SCTP_LEVEL)) {387 if (TRACE_BOOL(ANNOYING)) { 386 388 sz = sizeof(event); 387 389 CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_EVENTS, &event, &sz) ); … … 404 406 } 405 407 #else /* SCTP_EVENTS */ 406 TRACE_DEBUG( SCTP_LEVEL, "Skipping SCTP_EVENTS");408 TRACE_DEBUG(ANNOYING, "Skipping SCTP_EVENTS"); 407 409 #endif /* SCTP_EVENTS */ 410 #endif /* OLD_SCTP_SOCKET_API */ 408 411 409 412 /* Set the v4 mapped addresses option */ … … 412 415 int v4mapped; 413 416 414 if (TRACE_BOOL( SCTP_LEVEL)) {417 if (TRACE_BOOL(ANNOYING)) { 415 418 sz = sizeof(v4mapped); 416 419 /* Read socket defaults */ … … 433 436 CHECK_SYS( setsockopt(sk, IPPROTO_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR, &v4mapped, sizeof(v4mapped)) ); 434 437 435 if (TRACE_BOOL( SCTP_LEVEL)) {438 if (TRACE_BOOL(ANNOYING)) { 436 439 /* Check new values */ 437 440 CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR, &v4mapped, &sz) ); … … 439 442 } 440 443 } else { 441 TRACE_DEBUG( SCTP_LEVEL, "Skipping SCTP_I_WANT_MAPPED_V4_ADDR, since IPv6 disabled.");444 TRACE_DEBUG(ANNOYING, "Skipping SCTP_I_WANT_MAPPED_V4_ADDR, since IPv6 disabled."); 442 445 } 443 446 #else /* SCTP_I_WANT_MAPPED_V4_ADDR */ 444 TRACE_DEBUG( SCTP_LEVEL, "Skipping SCTP_I_WANT_MAPPED_V4_ADDR");447 TRACE_DEBUG(ANNOYING, "Skipping SCTP_I_WANT_MAPPED_V4_ADDR"); 445 448 #endif /* SCTP_I_WANT_MAPPED_V4_ADDR */ 446 449 … … 458 461 int interleave; 459 462 460 if (TRACE_BOOL( SCTP_LEVEL)) {463 if (TRACE_BOOL(ANNOYING)) { 461 464 sz = sizeof(interleave); 462 465 /* Read socket defaults */ … … 479 482 CHECK_SYS( setsockopt(sk, IPPROTO_SCTP, SCTP_FRAGMENT_INTERLEAVE, &interleave, sizeof(interleave)) ); 480 483 481 if (TRACE_BOOL( SCTP_LEVEL)) {484 if (TRACE_BOOL(ANNOYING)) { 482 485 /* Check new values */ 483 486 CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_FRAGMENT_INTERLEAVE, &interleave, &sz) ); … … 486 489 } 487 490 #else /* SCTP_FRAGMENT_INTERLEAVE */ 488 TRACE_DEBUG( SCTP_LEVEL, "Skipping SCTP_FRAGMENT_INTERLEAVE");491 TRACE_DEBUG(ANNOYING, "Skipping SCTP_FRAGMENT_INTERLEAVE"); 489 492 #endif /* SCTP_FRAGMENT_INTERLEAVE */ 490 493 491 494 /* 492 495 SCTP_PARTIAL_DELIVERY_POINT control partial delivery size 493 SCTP_USE_EXT_RCVINFO use extended receive info structure (information about the next message if available)496 SCTP_USE_EXT_RCVINFO - DEPRECATED use extended receive info structure (information about the next message if available) 494 497 */ 495 498 /* SCTP_AUTO_ASCONF is set by the postbind function */ … … 504 507 int bool; 505 508 506 if (TRACE_BOOL( SCTP_LEVEL)) {509 if (TRACE_BOOL(ANNOYING)) { 507 510 sz = sizeof(bool); 508 511 /* Read socket defaults */ … … 521 524 CHECK_SYS( setsockopt(sk, IPPROTO_SCTP, SCTP_EXPLICIT_EOR, &bool, sizeof(bool)) ); 522 525 523 if (TRACE_BOOL( SCTP_LEVEL)) {526 if (TRACE_BOOL(ANNOYING)) { 524 527 /* Check new values */ 525 528 CHECK_SYS( getsockopt(sk, IPPROTO_SCTP, SCTP_EXPLICIT_EOR, &bool, &sz) ); … … 528 531 } 529 532 #else /* SCTP_EXPLICIT_EOR */ 530 TRACE_DEBUG( SCTP_LEVEL, "Skipping SCTP_EXPLICIT_EOR");533 TRACE_DEBUG(ANNOYING, "Skipping SCTP_EXPLICIT_EOR"); 531 534 #endif /* SCTP_EXPLICIT_EOR */ 532 535 533 536 /* 534 537 SCTP_REUSE_PORT share one listening port with several sockets 535 SCTP_EVENT same as EVENTS ?536 538 */ 537 539 540 #ifndef OLD_SCTP_SOCKET_API 541 #ifdef SCTP_EVENT 542 { 543 /* Subscribe to the following events */ 544 int events_I_want[] = { 545 #ifdef SCTP_ASSOC_CHANGE 546 /* SCTP_ASSOC_CHANGE, */ 547 #endif 548 #ifdef SCTP_PEER_ADDR_CHANGE 549 SCTP_PEER_ADDR_CHANGE, 550 #endif 551 #ifdef SCTP_REMOTE_ERROR 552 SCTP_REMOTE_ERROR, 553 #endif 554 #ifdef SCTP_SEND_FAILED_EVENT 555 SCTP_SEND_FAILED_EVENT, 556 #endif 557 #ifdef SCTP_SHUTDOWN_EVENT 558 SCTP_SHUTDOWN_EVENT, 559 #endif 560 #ifdef SCTP_ADAPTATION_INDICATION 561 /* SCTP_ADAPTATION_INDICATION, */ 562 #endif 563 #ifdef SCTP_PARTIAL_DELIVERY_EVENT 564 /* SCTP_PARTIAL_DELIVERY_EVENT, */ 565 #endif 566 #ifdef SCTP_AUTHENTICATION_EVENT 567 /* SCTP_AUTHENTICATION_EVENT, */ 568 #endif 569 #ifdef SCTP_SENDER_DRY_EVENT 570 /* SCTP_SENDER_DRY_EVENT, */ 571 #endif 572 0 573 }; 574 int i; 575 576 struct sctp_event event; 577 578 for (i = 0; i < (sizeof(events_I_want) / sizeof(events_I_want[0]) - 1; i++) { 579 memset(&event, 0, sizeof(event)); 580 event.se_type = events_I_want[i]; 581 event.se_on = 1; 582 583 /* Set the option to the socket */ 584 CHECK_SYS( setsockopt(sk, IPPROTO_SCTP, SCTP_EVENT, &event, sizeof(event)) ); 585 } 586 } 587 #else /* SCTP_EVENT */ 588 TRACE_DEBUG(ANNOYING, "Skipping SCTP_EVENT"); 589 #endif /* SCTP_EVENT */ 590 591 592 #ifdef SCTP_RECVRCVINFO /* Replaces SCTP_SNDRCV */ 593 { 594 int bool = 1; 595 596 /* Set the option to the socket */ 597 CHECK_SYS( setsockopt(sk, IPPROTO_SCTP, SCTP_RECVRCVINFO, &bool, sizeof(bool)) ); 598 599 } 600 #else /* SCTP_RECVRCVINFO */ 601 TRACE_DEBUG(ANNOYING, "Skipping SCTP_RECVRCVINFO"); 602 #endif /* SCTP_RECVRCVINFO */ 603 604 605 #endif /* OLD_SCTP_SOCKET_API */ 606 607 /* 608 SCTP_RECVNXTINFO 609 610 SCTP_DEFAULT_SNDINFO : send defaults 611 SCTP_DEFAULT_PRINFO : default PR-SCTP 612 */ 613 614 538 615 /* In case of no_ip4, force the v6only option */ 539 616 #ifdef IPV6_V6ONLY … … 560 637 int asconf; 561 638 562 if (TRACE_BOOL( SCTP_LEVEL)) {639 if (TRACE_BOOL(ANNOYING)) { 563 640 socklen_t sz; 564 641 … … 579 656 CHECK_SYS( setsockopt(sk, IPPROTO_SCTP, SCTP_AUTO_ASCONF, &asconf, sizeof(asconf)) ); 580 657 581 if (TRACE_BOOL( SCTP_LEVEL)) {658 if (TRACE_BOOL(ANNOYING)) { 582 659 socklen_t sz = sizeof(asconf); 583 660 /* Check new values */ … … 587 664 } 588 665 #else /* SCTP_AUTO_ASCONF */ 589 TRACE_DEBUG( SCTP_LEVEL, "Skipping SCTP_AUTO_ASCONF");666 TRACE_DEBUG(ANNOYING, "Skipping SCTP_AUTO_ASCONF"); 590 667 #endif /* SCTP_AUTO_ASCONF */ 591 668 … … 1005 1082 struct iovec iov; 1006 1083 struct cmsghdr *hdr; 1084 #ifdef OLD_SCTP_SOCKET_API 1007 1085 struct sctp_sndrcvinfo *sndrcv; 1008 1086 uint8_t anci[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))]; 1087 #else /* OLD_SCTP_SOCKET_API */ 1088 struct sctp_sndinfo *sndinf; 1089 uint8_t anci[CMSG_SPACE(sizeof(struct sctp_sndinfo))]; 1090 #endif /* OLD_SCTP_SOCKET_API */ 1009 1091 ssize_t ret; 1010 1092 int timedout = 0; … … 1023 1105 /* Anciliary data: specify SCTP stream */ 1024 1106 hdr = (struct cmsghdr *)anci; 1025 sndrcv = (struct sctp_sndrcvinfo *)CMSG_DATA(hdr);1026 1107 hdr->cmsg_len = sizeof(anci); 1027 1108 hdr->cmsg_level = IPPROTO_SCTP; 1109 #ifdef OLD_SCTP_SOCKET_API 1028 1110 hdr->cmsg_type = SCTP_SNDRCV; 1111 sndrcv = (struct sctp_sndrcvinfo *)CMSG_DATA(hdr); 1029 1112 sndrcv->sinfo_stream = strid; 1113 #else /* OLD_SCTP_SOCKET_API */ 1114 hdr->cmsg_type = SCTP_SNDINFO; 1115 sndinf = (struct sctp_sndinfo *)CMSG_DATA(hdr); 1116 sndinf->snd_sid = strid; 1117 #endif /* OLD_SCTP_SOCKET_API */ 1030 1118 /* note : we could store other data also, for example in .sinfo_ppid for remote peer or in .sinfo_context for errors. */ 1031 1119 … … 1085 1173 mhdr.msg_controllen = sizeof(ancidata); 1086 1174 1175 next_message: 1176 datasize = 0; 1177 1087 1178 /* We will loop while all data is not received. */ 1088 1179 incomplete: … … 1139 1230 switch (notif->sn_header.sn_type) { 1140 1231 1141 case SCTP_ASSOC_CHANGE: 1232 case SCTP_ASSOC_CHANGE: /* We should not receive these as we did not subscribe for it */ 1142 1233 TRACE_DEBUG(FULL, "Received SCTP_ASSOC_CHANGE notification"); 1143 TRACE_DEBUG( SCTP_LEVEL, " state : %hu", notif->sn_assoc_change.sac_state);1144 TRACE_DEBUG( SCTP_LEVEL, " error : %hu", notif->sn_assoc_change.sac_error);1145 TRACE_DEBUG( SCTP_LEVEL, " instr : %hu", notif->sn_assoc_change.sac_inbound_streams);1146 TRACE_DEBUG( SCTP_LEVEL, " outstr : %hu", notif->sn_assoc_change.sac_outbound_streams);1234 TRACE_DEBUG(ANNOYING, " state : %hu", notif->sn_assoc_change.sac_state); 1235 TRACE_DEBUG(ANNOYING, " error : %hu", notif->sn_assoc_change.sac_error); 1236 TRACE_DEBUG(ANNOYING, " instr : %hu", notif->sn_assoc_change.sac_inbound_streams); 1237 TRACE_DEBUG(ANNOYING, " outstr : %hu", notif->sn_assoc_change.sac_outbound_streams); 1147 1238 1148 1239 *event = FDEVP_CNX_EP_CHANGE; … … 1151 1242 case SCTP_PEER_ADDR_CHANGE: 1152 1243 TRACE_DEBUG(FULL, "Received SCTP_PEER_ADDR_CHANGE notification"); 1153 /* TRACE_sSA(FD_LOG_DEBUG, SCTP_LEVEL, " intf_change : ", &(notif->sn_paddr_change.spc_aaddr), NI_NUMERICHOST | NI_NUMERICSERV, "" ); */1154 TRACE_DEBUG( SCTP_LEVEL, " state : %d", notif->sn_paddr_change.spc_state);1155 TRACE_DEBUG( SCTP_LEVEL, " error : %d", notif->sn_paddr_change.spc_error);1244 /* TRACE_sSA(FD_LOG_DEBUG, ANNOYING, " intf_change : ", &(notif->sn_paddr_change.spc_aaddr), NI_NUMERICHOST | NI_NUMERICSERV, "" ); */ 1245 TRACE_DEBUG(ANNOYING, " state : %d", notif->sn_paddr_change.spc_state); 1246 TRACE_DEBUG(ANNOYING, " error : %d", notif->sn_paddr_change.spc_error); 1156 1247 1157 1248 *event = FDEVP_CNX_EP_CHANGE; 1158 1249 break; 1159 1250 1160 case SCTP_ SEND_FAILED:1161 TRACE_DEBUG(FULL, "Received SCTP_ SEND_FAILEDnotification");1162 TRACE_DEBUG( SCTP_LEVEL, " len : %hu", notif->sn_send_failed.ssf_length);1163 TRACE_DEBUG( SCTP_LEVEL, " err : %d", notif->sn_send_failed.ssf_error);1251 case SCTP_REMOTE_ERROR: 1252 TRACE_DEBUG(FULL, "Received SCTP_REMOTE_ERROR notification"); 1253 TRACE_DEBUG(ANNOYING, " err : %hu", ntohs(notif->sn_remote_error.sre_error)); 1254 TRACE_DEBUG(ANNOYING, " len : %hu", ntohs(notif->sn_remote_error.sre_length)); 1164 1255 1165 1256 *event = FDEVP_CNX_ERROR; 1166 1257 break; 1167 1168 case SCTP_REMOTE_ERROR: 1169 TRACE_DEBUG(FULL, "Received SCTP_REMOTE_ERROR notification"); 1170 TRACE_DEBUG(SCTP_LEVEL, " err : %hu", ntohs(notif->sn_remote_error.sre_error)); 1171 TRACE_DEBUG(SCTP_LEVEL, " len : %hu", ntohs(notif->sn_remote_error.sre_length)); 1258 1259 #ifdef OLD_SCTP_SOCKET_API 1260 case SCTP_SEND_FAILED: 1261 TRACE_DEBUG(FULL, "Received SCTP_SEND_FAILED notification"); 1262 TRACE_DEBUG(ANNOYING, " len : %hu", notif->sn_send_failed.ssf_length); 1263 TRACE_DEBUG(ANNOYING, " err : %d", notif->sn_send_failed.ssf_error); 1172 1264 1173 1265 *event = FDEVP_CNX_ERROR; 1174 1266 break; 1175 1267 #else /* OLD_SCTP_SOCKET_API */ 1268 case SCTP_SEND_FAILED_EVENT: 1269 TRACE_DEBUG(FULL, "Received SCTP_SEND_FAILED_EVENT notification"); 1270 *event = FDEVP_CNX_ERROR; 1271 break; 1272 #endif /* OLD_SCTP_SOCKET_API */ 1176 1273 case SCTP_SHUTDOWN_EVENT: 1177 1274 TRACE_DEBUG(FULL, "Received SCTP_SHUTDOWN_EVENT notification"); … … 1179 1276 *event = FDEVP_CNX_SHUTDOWN; 1180 1277 break; 1278 1279 #ifndef OLD_SCTP_SOCKET_API 1280 case SCTP_NOTIFICATIONS_STOPPED_EVENT: 1281 TRACE_DEBUG(INFO, "Received SCTP_NOTIFICATIONS_STOPPED_EVENT notification, marking the association in error state"); 1282 *event = FDEVP_CNX_ERROR; 1283 break; 1284 #endif /* OLD_SCTP_SOCKET_API */ 1181 1285 1182 1286 default: 1183 TRACE_DEBUG(FULL, "Received unknown notification %d, assume error", notif->sn_header.sn_type);1184 *event = FDEVP_CNX_ERROR;1287 TRACE_DEBUG(FULL, "Received unknown notification %d, ignored", notif->sn_header.sn_type); 1288 goto next_message; 1185 1289 } 1186 1290 … … 1196 1300 if (strid) { 1197 1301 struct cmsghdr *hdr; 1302 #ifdef OLD_SCTP_SOCKET_API 1198 1303 struct sctp_sndrcvinfo *sndrcv; 1304 #else /* OLD_SCTP_SOCKET_API */ 1305 struct sctp_rcvinfo *rcvinf; 1306 #endif /* OLD_SCTP_SOCKET_API */ 1199 1307 1200 1308 /* Handle the anciliary data */ … … 1207 1315 } 1208 1316 1317 #ifdef OLD_SCTP_SOCKET_API 1209 1318 /* Also only interested in SCTP_SNDRCV message for the moment */ 1210 1319 if (hdr->cmsg_type != SCTP_SNDRCV) { … … 1214 1323 1215 1324 sndrcv = (struct sctp_sndrcvinfo *) CMSG_DATA(hdr); 1216 if (TRACE_BOOL( SCTP_LEVEL)) {1325 if (TRACE_BOOL(ANNOYING)) { 1217 1326 fd_log_debug( "Anciliary block IPPROTO_SCTP / SCTP_SNDRCV"); 1218 1327 fd_log_debug( " sinfo_stream : %hu", sndrcv->sinfo_stream); … … 1228 1337 1229 1338 *strid = sndrcv->sinfo_stream; 1339 #else /* OLD_SCTP_SOCKET_API */ 1340 /* Also only interested in SCTP_RCVINFO message for the moment */ 1341 if (hdr->cmsg_type != SCTP_RCVINFO) { 1342 TRACE_DEBUG(FULL, "Anciliary block IPPROTO_SCTP / %d, skipped", hdr->cmsg_type); 1343 continue; 1344 } 1345 1346 rcvinf = (struct sctp_rcvinfo *) CMSG_DATA(hdr); 1347 1348 *strid = rcvinf->rcv_sid; 1349 #endif /* OLD_SCTP_SOCKET_API */ 1350 1351 1230 1352 } 1231 1353 TRACE_DEBUG(FULL, "Received %zdb data on socket %d, stream %hu", datasize, conn->cc_socket, *strid);
Note: See TracChangeset
for help on using the changeset viewer.