Skip to contentSkip to conversation

Question regarding struct sctp_association

DISCUSSION Holger Hans Peter Freyther 2 participants 5 messages Jan 10, 2011 – Jan 12, 2011

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Hi,

I have a small consistency question. In sctp_packet_transmit of net/sctp/output.c some parts of the method check if the asoc is valid, other assume that there is one.

I have some questions regarding that.

The sctp_packet has a pointer to sctp_transport. Does every sctp_transport hold a valid pointer to sctp_association? Does it hold a valid pointer if authentication (sctp_auth) is used? Does it hold a valid pointer if chunks were seen?

regards
holger

#1 lore raw
Quoted 11 lines

Hi,

I have a small consistency question. In sctp_packet_transmit of net/sctp/output.c some parts of the method check if the asoc is valid, other assume that there is one.

I have some questions regarding that.

The sctp_packet has a pointer to sctp_transport. Does every sctp_transport hold a valid pointer to sctp_association? Does it hold a valid pointer if

assoc not always valid, when we response to an OOTB packet, the assoc will be NULL.

Quoted 10 lines

authentication (sctp_auth) is used? Does it hold a valid pointer if chunks were seen?

regards
holger
--
To unsubscribe from this list: send the line "unsubscribe linux-sctp" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#2 lore raw
In reply to Holger Hans Peter Freyther
Quoted 7 lines · Wei Yongjun
Quoted 4 lines

The sctp_packet has a pointer to sctp_transport. Does every sctp_transport hold a valid pointer to sctp_association? Does it hold a valid pointer if

assoc not always valid, when we response to an OOTB packet, the assoc will be NULL.

Thanks, I am sorry if the next question is totally obvious. I am obviously not too familiar with SCTP and the implementation here. For an OOTB packet we first check if we want to ignore it according to the RFC and then it will be placed in sctp_inq_push(&chunk->rcvr->inqueue, chunk) and here is where I am lost and the below is just guessing.

net/sctp/output.c +1 -1
@@ -490,7 +490,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)
         *    HMAC field set to zero (as shown in Figure 6) followed by all
         *    chunks that are placed after the AUTH chunk in the SCTP packet.
         */
-       if (auth)
+       if (auth && asoc)
                sctp_auth_calculate_hmac(asoc, nskb,
                                        (struct sctp_auth_chunk *)auth,
                                        GFP_ATOMIC);

Can an OOTB packet force us to calculate the hmac here?

@@ -563,7 +563,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)

                unsigned long timeout;

                /* Restart the AUTOCLOSE timer when sending data. */
-               if (sctp_state(asoc, ESTABLISHED) && asoc->autoclose) {
+               if (asoc && sctp_state(asoc, ESTABLISHED) && asoc->autoclose) {
                        timer = &asoc->timers[SCTP_EVENT_TIMEOUT_AUTOCLOSE];
                        timeout = asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE];

Can an OOTB packet contain data chunks that would make us go through this path?

#3 lore raw
In reply to Holger Hans Peter Freyther
Quoted 25 lines · Wei Yongjun
Quoted 4 lines
Quoted 2 lines

The sctp_packet has a pointer to sctp_transport. Does every sctp_transport hold a valid pointer to sctp_association? Does it hold a valid pointer if

assoc not always valid, when we response to an OOTB packet, the assoc will be NULL.

Thanks, I am sorry if the next question is totally obvious. I am obviously not too familiar with SCTP and the implementation here. For an OOTB packet we first check if we want to ignore it according to the RFC and then it will be placed in sctp_inq_push(&chunk->rcvr->inqueue, chunk) and here is where I am lost and the below is just guessing.

net/sctp/output.c +1 -1
@@ -490,7 +490,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)
         *    HMAC field set to zero (as shown in Figure 6) followed by all
         *    chunks that are placed after the AUTH chunk in the SCTP packet.
         */
-       if (auth)
+       if (auth && asoc)
                sctp_auth_calculate_hmac(asoc, nskb,
                                        (struct sctp_auth_chunk *)auth,
                                        GFP_ATOMIC);
Quoted 1 line

Can an OOTB packet force us to calculate the hmac here?

if we don't have an association, we can't do authentication, so if auth then asoc is not NULL.

Quoted 12 lines
net/sctp/output.c +1 -1
@@ -563,7 +563,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)
                unsigned long timeout;
 
                /* Restart the AUTOCLOSE timer when sending data. */
-               if (sctp_state(asoc, ESTABLISHED) && asoc->autoclose) {
+               if (asoc && sctp_state(asoc, ESTABLISHED) && asoc->autoclose) {
                        timer = &asoc->timers[SCTP_EVENT_TIMEOUT_AUTOCLOSE];
                        timeout = asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE];
 
Quoted 1 line

Can an OOTB packet contain data chunks that would make us go through this path?

AUTOCLOSE timer is only start when we have association, so this will not happen.

Quoted 7 lines

--
To unsubscribe from this list: send the line "unsubscribe linux-sctp" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#4 lore raw
In reply to Holger Hans Peter Freyther
Quoted 11 lines · Wei Yongjun
Quoted 8 lines
                /* Restart the AUTOCLOSE timer when sending data. */
(quoted diff) +1 -1
-               if (sctp_state(asoc, ESTABLISHED) && asoc->autoclose) {
+               if (asoc && sctp_state(asoc, ESTABLISHED) && asoc->autoclose) {
                        timer = &asoc->timers[SCTP_EVENT_TIMEOUT_AUTOCLOSE];
                        timeout = asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE];

Can an OOTB packet contain data chunks that would make us go through this path?

AUTOCLOSE timer is only start when we have association, so this will not happen.

I am not sure, that is why I am asking. It appears that if there is any DATA Chunk in the packet to send the code attempts to access 'asoc'. Can this code path be ever triggered with an OOTB packet?

sorry if that question is too stupid

z.