@@ -132,23 +132,23 @@ static int setup_http_buff(void)
132132
133133
134134static int send_ack (struct sockaddr_ll * sll , struct sockaddr * saddr ,
135- struct sockaddr * daddr , uint16_t sport_be ,
135+ struct sockaddr * daddr , uint8_t ttl , uint16_t sport_be ,
136136 uint16_t dport_be , uint32_t seq_be , uint32_t ackseq_be )
137137{
138138 int pkt_len ;
139139 ssize_t nbytes ;
140140 char pkt_buff [1024 ];
141141
142142 if (daddr -> sa_family == AF_INET ) {
143- pkt_len = fh_pkt4_make (pkt_buff , sizeof (pkt_buff ), saddr , daddr ,
143+ pkt_len = fh_pkt4_make (pkt_buff , sizeof (pkt_buff ), saddr , daddr , ttl ,
144144 sport_be , dport_be , seq_be , ackseq_be , 0 , NULL ,
145145 0 );
146146 if (pkt_len < 0 ) {
147147 E (T (fh_pkt4_make ));
148148 return -1 ;
149149 }
150150 } else if (daddr -> sa_family == AF_INET6 ) {
151- pkt_len = fh_pkt6_make (pkt_buff , sizeof (pkt_buff ), saddr , daddr ,
151+ pkt_len = fh_pkt6_make (pkt_buff , sizeof (pkt_buff ), saddr , daddr , ttl ,
152152 sport_be , dport_be , seq_be , ackseq_be , 0 , NULL ,
153153 0 );
154154 if (pkt_len < 0 ) {
@@ -172,23 +172,23 @@ static int send_ack(struct sockaddr_ll *sll, struct sockaddr *saddr,
172172
173173
174174static int send_http (struct sockaddr_ll * sll , struct sockaddr * saddr ,
175- struct sockaddr * daddr , uint16_t sport_be ,
175+ struct sockaddr * daddr , uint8_t ttl , uint16_t sport_be ,
176176 uint16_t dport_be , uint32_t seq_be , uint32_t ackseq_be )
177177{
178178 int pkt_len ;
179179 ssize_t nbytes ;
180180 char pkt_buff [1024 ];
181181
182182 if (daddr -> sa_family == AF_INET ) {
183- pkt_len = fh_pkt4_make (pkt_buff , sizeof (pkt_buff ), saddr , daddr ,
183+ pkt_len = fh_pkt4_make (pkt_buff , sizeof (pkt_buff ), saddr , daddr , ttl ,
184184 sport_be , dport_be , seq_be , ackseq_be , 1 ,
185185 http_buff , http_len );
186186 if (pkt_len < 0 ) {
187187 E (T (fh_pkt4_make ));
188188 return -1 ;
189189 }
190190 } else if (daddr -> sa_family == AF_INET6 ) {
191- pkt_len = fh_pkt6_make (pkt_buff , sizeof (pkt_buff ), saddr , daddr ,
191+ pkt_len = fh_pkt6_make (pkt_buff , sizeof (pkt_buff ), saddr , daddr , ttl ,
192192 sport_be , dport_be , seq_be , ackseq_be , 1 ,
193193 http_buff , http_len );
194194 if (pkt_len < 0 ) {
@@ -296,7 +296,7 @@ int fh_rawsend_handle(struct sockaddr_ll *sll, uint8_t *pkt_data, int pkt_len)
296296 uint32_t ack_new ;
297297 uint16_t ethertype ;
298298 int res , i , tcp_payload_len , hop ;
299- uint8_t src_ttl ;
299+ uint8_t src_ttl , snd_ttl ;
300300 struct tcphdr * tcph ;
301301 char src_ip [INET6_ADDRSTRLEN ], dst_ip [INET6_ADDRSTRLEN ];
302302 struct sockaddr_storage saddr_store , daddr_store ;
@@ -330,13 +330,22 @@ int fh_rawsend_handle(struct sockaddr_ll *sll, uint8_t *pkt_data, int pkt_len)
330330 ipaddr_to_str (daddr , dst_ip );
331331 }
332332
333+ snd_ttl = 0 ;
334+
333335 if (!g_ctx .nohopest ) {
334336 hop = hop_estimate (src_ttl );
335337 if (hop <= g_ctx .ttl ) {
336338 E_INFO ("%s:%u ===LOCAL(?)===> %s:%u" , src_ip , ntohs (tcph -> source ),
337339 dst_ip , ntohs (tcph -> dest ));
338340 return 0 ;
339341 }
342+ if (g_ctx .dynamic_pct ) {
343+ snd_ttl = hop * g_ctx .dynamic_pct / 100 ;
344+ }
345+ }
346+
347+ if (snd_ttl < g_ctx .ttl ) {
348+ snd_ttl = g_ctx .ttl ;
340349 }
341350
342351 if (tcp_payload_len > 0 ) {
@@ -358,8 +367,8 @@ int fh_rawsend_handle(struct sockaddr_ll *sll, uint8_t *pkt_data, int pkt_len)
358367 ack_new = htonl (ack_new );
359368
360369 for (i = 0 ; i < g_ctx .repeat ; i ++ ) {
361- res = send_ack (sll , daddr , saddr , tcph -> dest , tcph -> source ,
362- tcph -> ack_seq , ack_new );
370+ res = send_ack (sll , daddr , saddr , snd_ttl , tcph -> dest ,
371+ tcph -> source , tcph -> ack_seq , ack_new );
363372 if (res < 0 ) {
364373 E (T (send_ack ));
365374 return -1 ;
@@ -369,8 +378,8 @@ int fh_rawsend_handle(struct sockaddr_ll *sll, uint8_t *pkt_data, int pkt_len)
369378 dst_ip , ntohs (tcph -> dest ));
370379
371380 for (i = 0 ; i < g_ctx .repeat ; i ++ ) {
372- res = send_http (sll , daddr , saddr , tcph -> dest , tcph -> source ,
373- tcph -> ack_seq , ack_new );
381+ res = send_http (sll , daddr , saddr , snd_ttl , tcph -> dest ,
382+ tcph -> source , tcph -> ack_seq , ack_new );
374383 if (res < 0 ) {
375384 E (T (send_http ));
376385 return -1 ;
@@ -391,8 +400,8 @@ int fh_rawsend_handle(struct sockaddr_ll *sll, uint8_t *pkt_data, int pkt_len)
391400 ntohs (tcph -> dest ));
392401
393402 for (i = 0 ; i < g_ctx .repeat ; i ++ ) {
394- res = send_http (sll , daddr , saddr , tcph -> dest , tcph -> source ,
395- tcph -> ack_seq , tcph -> seq );
403+ res = send_http (sll , daddr , saddr , snd_ttl , tcph -> dest ,
404+ tcph -> source , tcph -> ack_seq , tcph -> seq );
396405 if (res < 0 ) {
397406 E (T (send_http ));
398407 return -1 ;
0 commit comments