Linux设备驱动程序与分段数据包有关的问题

时间:2019-05-09 15:43:07

标签: c linux linux-kernel linux-device-driver

当我尝试发送大于〜1450字节的数据包时,我的Linux设备驱动程序存在问题。对于net_device_ops结构中的ndo_start_xmit函数,我输出传递给我的sk_buff数据。分片数据包的skb->数据始终被破坏。

例如,如果我发送以下数据包(RAW)

  

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26   27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49   50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72   73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95   96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111112113   114115116117118119120121122123124125126127128129130   131132133134135135136137138139140141142142143144145146147   148149150151152153154154155156157158159160161162163164   165166167168169170171171172173174175176176177178179180181   182183184185186186187188189190191191192193194194195196197198   199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215   216217218219220221222223224225226227228228229230231232   233 234 235 236 237 238 239 240 240 241 242 243 244 245 246 247 248 249   250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266   267 268 269 270 271 271 272 273 274 275 276 277 278 279 280 281 282 283   284285286287288288289290291292293294295295296297298299300   301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317   318319320321322323324325326327328329330331332333334   335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351   352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368   369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385   386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402   403 404 405 406 407 408 409 410 411 412 413 414 414 416 417 418 419   420421422423424425426427428429430430431432433434435436436   437 438 439 440 440 441 442 444 444 445 446 447 448 449 450 451 452 453   454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470   471 472 473 474 475 476 477 478 479 480 481 481 482 483 484 485 486 487   488489490491491492493494495496497498499

然后将传递给ndo_start_xmit的skb->数据输出,得到以下两个数据包

数据包1(HEX)-TCP段长度为1448,数字0-388和38,缺少9个

  

2c 33 11 a3 ee c7 00 50 1e 05 85 27 08 00 45 00 05 dc d8 e3 40 00 40   06 2e 0d 0a 0a 07 82 0a 0a 12 96 82 d5 1e 61 6e 49 b4 dc 02 1a 18 fc   80 10 00 03 73 9d 00 00 01 01 08 0a 00 00 6c a4 00 e5 df fd 30 20 31   20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20   31 32 20 31 33 20 31 34 20 31 35 20 31 36 20 31 37 20 31 38 20 31 39   20 32 30 20 32 31 20 32 32 20 32 33 20 32 34 20 32 35 20 32 36 20 32   37 20 32 38 20 32 39 20 33 30 20 33 31 20 33 32 20 33 33 20 33 34 20   33 35 20 33 36 20 33 37 20 33 38 20 33 39 20 34 30 20 34 31 20 34 32   20 34 33 20 34 34 20 34 35 20 34 36 20 34 37 20 34 38 20 34 39 20 35   30 20 35 31 20 35 32 20 35 33 20 35 34 20 35 35 20 35 36 20 35 37 20   35 38 20 35 39 20 36 30 20 36 31 20 36 32 20 36 33 20 36 34 20 36 35   20 36 36 20 36 37 20 36 38 20 36 39 20 37 30 20 37 31 20 37 32 20 37   33 20 37 34 20 37 35 20 37 36 20 37 37 20 37 38 20 37 39 20 38 30 20   38 31 20 38 32 20 38 33 20 38 34 20 38 35 20 38 36 20 38 37 20 38 38   20 38 39 20 39 30 20 39 31 20 39 32 20 39 33 20 39 34 20 39 35 20 39   36 20 39 37 20 39 38 20 39 39 20 31 30 30 20 31 30 31 20 31 30 32 20   31 30 33 20 31 30 34 20 31 30 35 20 31 30 36 20 31 30 37 20 31 30 38   20 31 30 39 20 31 31 30 20 31 31 31 20 31 31 32 20 31 31 33 20 31 31   34 20 31 31 35 20 31 31 36 20 31 31 37 20 31 31 38 20 31 31 39 20 31   32 30 20 31 32 31 20 31 32 32 20 31 32 33 20 31 32 34 20 31 32 35 20   31 32 36 20 31 32 37 20 31 32 38 20 31 32 39 20 31 33 30 20 31 33 31   20 31 33 32 20 31 33 33 20 31 33 34 20 31 33 35 20 31 33 36 20 31 33   37 20 31 33 38 20 31 33 39 20 31 34 30 20 31 34 31 20 31 34 32 20 31   34 33 20 31 34 34 20 31 34 35 20 31 34 36 20 31 34 37 20 31 34 38 20   31 34 39 20 31 35 30 20 31 35 31 20 31 35 32 20 31 35 33 20 31 35 34   20 31 35 35 20 31 35 36 20 31 35 37 20 31 35 38 20 31 35 39 20 31 36   30 20 31 36 31 20 31 36 32 20 31 36 33 20 31 36 34 20 31 36 35 20 31   36 36 20 31 36 37 20 31 36 38 20 31 36 39 20 31 37 30 20 31 37 31 20   31 37 32 20 31 37 33 20 31 37 34 20 31 37 35 20 31 37 36 20 31 37 37   20 31 37 38 20 31 37 39 20 31 38 30 20 31 38 31 20 31 38 32 20 31 38   33 20 31 38 34 20 31 38 35 20 31 38 36 20 31 38 37 20 31 38 38 20 31   38 39 20 31 39 30 20 31 39 31 20 31 39 32 20 31 39 33 20 31 39 34 20   31 39 35 20 31 39 36 20 31 39 37 20 31 39 38 20 31 39 39 20 32 30 30   20 32 30 31 20 32 30 32 20 32 30 33 20 32 30 34 20 32 30 35 20 32 30   36 20 32 30 37 20 32 30 38 20 32 30 39 20 32 31 30 20 32 31 31 20 32   31 32 20 32 31 33 20 32 31 34 20 32 31 35 20 32 31 36 20 32 31 37 20   32 31 38 20 32 31 39 20 32 32 30 20 32 32 31 20 32 32 32 20 32 32 33   20 32 32 34 20 32 32 35 20 32 32 36 20 32 32 37 20 32 32 38 20 32 32   39 20 32 33 30 20 32 33 31 20 32 33 32 20 32 33 33 20 32 33 34 20 32   33 35 20 32 33 36 20 32 33 37 20 32 33 38 20 32 33 39 20 32 34 30 20   32 34 31 20 32 34 32 20 32 34 33 20 32 34 34 20 32 34 35 20 32 34 36   20 32 34 37 20 32 34 38 20 32 34 39 20 32 35 30 20 32 35 31 20 32 35   32 20 32 35 33 20 32 35 34 20 32 35 35 20 32 35 36 20 32 35 37 20 32   35 38 20 32 35 39 20 32 36 30 20 32 36 31 20 32 36 32 20 32 36 33 20   32 36 34 20 32 36 35 20 32 36 36 20 32 36 37 20 32 36 38 20 32 36 39   20 32 37 30 20 32 37 31 20 32 37 32 20 32 37 33 20 32 37 34 20 32 37   35 20 32 37 36 20 32 37 37 20 32 37 38 20 32 37 39 20 32 38 30 20 32   38 31 20 32 38 32 20 32 38 33 20 32 38 34 20 32 38 35 20 32 38 36 20   32 38 37 20 32 38 38 20 32 38 39 20 32 39 30 20 32 39 31 20 32 39 32   20 32 39 33 20 32 39 34 20 32 39 35 20 32 39 36 20 32 39 37 20 32 39   38 20 32 39 39 20 33 30 30 20 33 30 31 20 33 30 32 20 33 30 33 20 33   30 34 20 33 30 35 20 33 30 36 20 33 30 37 20 33 30 38 20 33 30 39 20   33 31 30 20 33 31 31 20 33 31 32 20 33 31 33 20 33 31 34 20 33 31 35   20 33 31 36 20 33 31 37 20 33 31 38 20 33 31 39 20 33 32 30 20 33 32   31 20 33 32 32 20 33 32 33 20 33 32 34 20 33 32 35 20 33 32 36 20 33   32 37 20 33 32 38 20 33 32 39 20 33 33 30 20 33 33 31 20 33 33 32 20   33 33 33 20 33 33 34 20 33 33 35 20 33 33 36 20 33 33 37 20 33 33 38   20 33 33 39 20 33 34 30 20 33 34 31 20 33 34 32 20 33 34 33 20 33 34   34 20 33 34 35 20 33 34 36 20 33 34 37 20 33 34 38 20 33 34 39 20 33   35 30 20 33 35 31 20 33 35 32 20 33 35 33 20 33 35 34 20 33 35 35 20   33 35 36 20 33 35 37 20 33 35 38 20 33 35 39 20 33 36 30 20 33 36 31   20 33 36 32 20 33 36 33 20 33 36 34 20 33 36 35 20 33 36 36 20 33 36   37 20 33 36 38 20 33 36 39 20 33 37 30 20 33 37 31 20 33 37 32 20 33   37 33 20 33 37 34 20 33 37 35 20 33 37 36 20 33 37 37 20 33 37 38 20   33 37 39 20 33 38 30 20 33 38 31 20 33 38 32 20 33 38 33 20 33 38 34   20 33 38 35 20 33 38 36 20 33 38 37 20 33 38 38 20 33 38

数据包2(HEX)-TCP段长度为442,数字(389中缺少9)-450,为451的45,而不是数字,而是一堆垃圾数据,在这种情况下全为0,但在运行。

  

2c 33 11 a3 ee c7 00 50 1e 05 85 27 08 00 45 00 01 ee d8 e4 40 00 40   06 31 fa 0a 0a 0a 07 82 0a 0a 12 96 82 d5 1e 61 6e 49 ba 84 02 1a 18 fc   80 18 00 03 d9 37 00 00 01 01 08 0a 00 00 6c ce 00 e5 df fd 39 20 33   39 30 20 33 39 31 20 33 39 32 20 33 39 33 20 33 39 34 20 33 39 35 20   33 39 36 20 33 39 37 20 33 39 38 20 33 39 39 20 34 30 30 20 34 30 31   20 34 30 32 20 34 30 33 20 34 30 34 20 34 30 35 20 34 30 36 20 34 30   37 20 34 30 38 20 34 30 39 20 34 31 30 20 34 31 31 20 34 31 32 20 34   31 33 20 34 31 34 20 34 31 35 20 34 31 36 20 34 31 37 20 34 31 38 20   34 31 39 20 34 32 30 20 34 32 31 20 34 32 32 20 34 32 33 20 34 32 34   20 34 32 35 20 34 32 36 20 34 32 37 20 34 32 38 20 34 32 39 20 34 33   30 20 34 33 31 20 34 33 32 20 34 33 33 20 34 33 34 20 34 33 35 20 34   33 36 20 34 33 37 20 34 33 38 20 34 33 39 20 34 34 30 20 34 34 31 20   34 34 32 20 34 34 33 20 34 34 34 20 34 34 35 20 34 34 36 20 34 34 37   20 34 34 38 20 34 34 39 20 34 35 30 20 34 35 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   00 00

服务器收到以下数据包(RAW)

  

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26   27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49   50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72   73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95   96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111112113   114115116117118119120121122123124125126127128129130   131132133134135135136137138139140141142142143144145146147   148149150151152153154154155156157158159160161162163164   165166167168169170171171172173174175176176177178179180181   182183184185186186187188189190191191192193194194195196197198   199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215   216217218219220221222223224225226227228228229230231232   233 234 235 236 237 238 239 240 240 241 242 243 244 245 246 247 248 249   250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266   267 268 269 270 271 271 272 273 274 275 276 277 278 279 280 281 282 283   284285286287288288289290291292293294295295296297298299300   301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317   318319320321322323324325326327328329330331332333334   335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351   352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368   369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385   386 387 388 38

  1. 原始消息的第一个分段数据包始终是正确的,并被服务器接收

  2. 仅当发生TCP分段时,才会发生skb->数据损坏

  3. 如果我发送的数据包小于约1450字节,则一切都会按预期运行

  4. 我已经为我的以太网驱动程序调整了MTU,但无论MTU的值如何,它仍然具有相同的准确行为

  5. 使用默认的Linux以太网设备驱动程序时,在同一台计算机上进行的相同测试可以正常工作

使用我的设备驱动程序时,发生ipv4分段时,skb->数据损坏的可能原因是什么?

我需要在设备驱动程序中为ipv4分段设置某种设置吗?

我在这个问题上停留的时间比我想承认的要长,任何帮助将不胜感激。

Linux内核-3.10.39

0 个答案:

没有答案