Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next

Alexei Starovoitov says:

====================
pull-request: bpf-next 2017-12-07

The following pull-request contains BPF updates for your net-next tree.

The main changes are:

1) Detailed documentation of BPF development process from Daniel.

2) Addition of is_fullsock, snd_cwnd and srtt_us fields to bpf_sock_ops
from Lawrence.

3) Minor follow up for bpf_skb_set_tunnel_key() from William.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+573 -6
+519
Documentation/bpf/bpf_devel_QA.txt
··· 1 + This document provides information for the BPF subsystem about various 2 + workflows related to reporting bugs, submitting patches, and queueing 3 + patches for stable kernels. 4 + 5 + For general information about submitting patches, please refer to 6 + Documentation/process/. This document only describes additional specifics 7 + related to BPF. 8 + 9 + Reporting bugs: 10 + --------------- 11 + 12 + Q: How do I report bugs for BPF kernel code? 13 + 14 + A: Since all BPF kernel development as well as bpftool and iproute2 BPF 15 + loader development happens through the netdev kernel mailing list, 16 + please report any found issues around BPF to the following mailing 17 + list: 18 + 19 + netdev@vger.kernel.org 20 + 21 + This may also include issues related to XDP, BPF tracing, etc. 22 + 23 + Given netdev has a high volume of traffic, please also add the BPF 24 + maintainers to Cc (from kernel MAINTAINERS file): 25 + 26 + Alexei Starovoitov <ast@kernel.org> 27 + Daniel Borkmann <daniel@iogearbox.net> 28 + 29 + In case a buggy commit has already been identified, make sure to keep 30 + the actual commit authors in Cc as well for the report. They can 31 + typically be identified through the kernel's git tree. 32 + 33 + Please do *not* report BPF issues to bugzilla.kernel.org since it 34 + is a guarantee that the reported issue will be overlooked. 35 + 36 + Submitting patches: 37 + ------------------- 38 + 39 + Q: To which mailing list do I need to submit my BPF patches? 40 + 41 + A: Please submit your BPF patches to the netdev kernel mailing list: 42 + 43 + netdev@vger.kernel.org 44 + 45 + Historically, BPF came out of networking and has always been maintained 46 + by the kernel networking community. Although these days BPF touches 47 + many other subsystems as well, the patches are still routed mainly 48 + through the networking community. 49 + 50 + In case your patch has changes in various different subsystems (e.g. 51 + tracing, security, etc), make sure to Cc the related kernel mailing 52 + lists and maintainers from there as well, so they are able to review 53 + the changes and provide their Acked-by's to the patches. 54 + 55 + Q: Where can I find patches currently under discussion for BPF subsystem? 56 + 57 + A: All patches that are Cc'ed to netdev are queued for review under netdev 58 + patchwork project: 59 + 60 + http://patchwork.ozlabs.org/project/netdev/list/ 61 + 62 + Those patches which target BPF, are assigned to a 'bpf' delegate for 63 + further processing from BPF maintainers. The current queue with 64 + patches under review can be found at: 65 + 66 + https://patchwork.ozlabs.org/project/netdev/list/?delegate=77147 67 + 68 + Once the patches have been reviewed by the BPF community as a whole 69 + and approved by the BPF maintainers, their status in patchwork will be 70 + changed to 'Accepted' and the submitter will be notified by mail. This 71 + means that the patches look good from a BPF perspective and have been 72 + applied to one of the two BPF kernel trees. 73 + 74 + In case feedback from the community requires a respin of the patches, 75 + their status in patchwork will be set to 'Changes Requested', and purged 76 + from the current review queue. Likewise for cases where patches would 77 + get rejected or are not applicable to the BPF trees (but assigned to 78 + the 'bpf' delegate). 79 + 80 + Q: How do the changes make their way into Linux? 81 + 82 + A: There are two BPF kernel trees (git repositories). Once patches have 83 + been accepted by the BPF maintainers, they will be applied to one 84 + of the two BPF trees: 85 + 86 + https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git/ 87 + https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/ 88 + 89 + The bpf tree itself is for fixes only, whereas bpf-next for features, 90 + cleanups or other kind of improvements ("next-like" content). This is 91 + analogous to net and net-next trees for networking. Both bpf and 92 + bpf-next will only have a master branch in order to simplify against 93 + which branch patches should get rebased to. 94 + 95 + Accumulated BPF patches in the bpf tree will regularly get pulled 96 + into the net kernel tree. Likewise, accumulated BPF patches accepted 97 + into the bpf-next tree will make their way into net-next tree. net and 98 + net-next are both run by David S. Miller. From there, they will go 99 + into the kernel mainline tree run by Linus Torvalds. To read up on the 100 + process of net and net-next being merged into the mainline tree, see 101 + the netdev FAQ under: 102 + 103 + Documentation/networking/netdev-FAQ.txt 104 + 105 + Occasionally, to prevent merge conflicts, we might send pull requests 106 + to other trees (e.g. tracing) with a small subset of the patches, but 107 + net and net-next are always the main trees targeted for integration. 108 + 109 + The pull requests will contain a high-level summary of the accumulated 110 + patches and can be searched on netdev kernel mailing list through the 111 + following subject lines (yyyy-mm-dd is the date of the pull request): 112 + 113 + pull-request: bpf yyyy-mm-dd 114 + pull-request: bpf-next yyyy-mm-dd 115 + 116 + Q: How do I indicate which tree (bpf vs. bpf-next) my patch should be 117 + applied to? 118 + 119 + A: The process is the very same as described in the netdev FAQ, so 120 + please read up on it. The subject line must indicate whether the 121 + patch is a fix or rather "next-like" content in order to let the 122 + maintainers know whether it is targeted at bpf or bpf-next. 123 + 124 + For fixes eventually landing in bpf -> net tree, the subject must 125 + look like: 126 + 127 + git format-patch --subject-prefix='PATCH bpf' start..finish 128 + 129 + For features/improvements/etc that should eventually land in 130 + bpf-next -> net-next, the subject must look like: 131 + 132 + git format-patch --subject-prefix='PATCH bpf-next' start..finish 133 + 134 + If unsure whether the patch or patch series should go into bpf 135 + or net directly, or bpf-next or net-next directly, it is not a 136 + problem either if the subject line says net or net-next as target. 137 + It is eventually up to the maintainers to do the delegation of 138 + the patches. 139 + 140 + If it is clear that patches should go into bpf or bpf-next tree, 141 + please make sure to rebase the patches against those trees in 142 + order to reduce potential conflicts. 143 + 144 + In case the patch or patch series has to be reworked and sent out 145 + again in a second or later revision, it is also required to add a 146 + version number (v2, v3, ...) into the subject prefix: 147 + 148 + git format-patch --subject-prefix='PATCH net-next v2' start..finish 149 + 150 + When changes have been requested to the patch series, always send the 151 + whole patch series again with the feedback incorporated (never send 152 + individual diffs on top of the old series). 153 + 154 + Q: What does it mean when a patch gets applied to bpf or bpf-next tree? 155 + 156 + A: It means that the patch looks good for mainline inclusion from 157 + a BPF point of view. 158 + 159 + Be aware that this is not a final verdict that the patch will 160 + automatically get accepted into net or net-next trees eventually: 161 + 162 + On the netdev kernel mailing list reviews can come in at any point 163 + in time. If discussions around a patch conclude that they cannot 164 + get included as-is, we will either apply a follow-up fix or drop 165 + them from the trees entirely. Therefore, we also reserve to rebase 166 + the trees when deemed necessary. After all, the purpose of the tree 167 + is to i) accumulate and stage BPF patches for integration into trees 168 + like net and net-next, and ii) run extensive BPF test suite and 169 + workloads on the patches before they make their way any further. 170 + 171 + Once the BPF pull request was accepted by David S. Miller, then 172 + the patches end up in net or net-next tree, respectively, and 173 + make their way from there further into mainline. Again, see the 174 + netdev FAQ for additional information e.g. on how often they are 175 + merged to mainline. 176 + 177 + Q: How long do I need to wait for feedback on my BPF patches? 178 + 179 + A: We try to keep the latency low. The usual time to feedback will 180 + be around 2 or 3 business days. It may vary depending on the 181 + complexity of changes and current patch load. 182 + 183 + Q: How often do you send pull requests to major kernel trees like 184 + net or net-next? 185 + 186 + A: Pull requests will be sent out rather often in order to not 187 + accumulate too many patches in bpf or bpf-next. 188 + 189 + As a rule of thumb, expect pull requests for each tree regularly 190 + at the end of the week. In some cases pull requests could additionally 191 + come also in the middle of the week depending on the current patch 192 + load or urgency. 193 + 194 + Q: Are patches applied to bpf-next when the merge window is open? 195 + 196 + A: For the time when the merge window is open, bpf-next will not be 197 + processed. This is roughly analogous to net-next patch processing, 198 + so feel free to read up on the netdev FAQ about further details. 199 + 200 + During those two weeks of merge window, we might ask you to resend 201 + your patch series once bpf-next is open again. Once Linus released 202 + a v*-rc1 after the merge window, we continue processing of bpf-next. 203 + 204 + For non-subscribers to kernel mailing lists, there is also a status 205 + page run by David S. Miller on net-next that provides guidance: 206 + 207 + http://vger.kernel.org/~davem/net-next.html 208 + 209 + Q: I made a BPF verifier change, do I need to add test cases for 210 + BPF kernel selftests? 211 + 212 + A: If the patch has changes to the behavior of the verifier, then yes, 213 + it is absolutely necessary to add test cases to the BPF kernel 214 + selftests suite. If they are not present and we think they are 215 + needed, then we might ask for them before accepting any changes. 216 + 217 + In particular, test_verifier.c is tracking a high number of BPF test 218 + cases, including a lot of corner cases that LLVM BPF back end may 219 + generate out of the restricted C code. Thus, adding test cases is 220 + absolutely crucial to make sure future changes do not accidentally 221 + affect prior use-cases. Thus, treat those test cases as: verifier 222 + behavior that is not tracked in test_verifier.c could potentially 223 + be subject to change. 224 + 225 + Q: When should I add code to samples/bpf/ and when to BPF kernel 226 + selftests? 227 + 228 + A: In general, we prefer additions to BPF kernel selftests rather than 229 + samples/bpf/. The rationale is very simple: kernel selftests are 230 + regularly run by various bots to test for kernel regressions. 231 + 232 + The more test cases we add to BPF selftests, the better the coverage 233 + and the less likely it is that those could accidentally break. It is 234 + not that BPF kernel selftests cannot demo how a specific feature can 235 + be used. 236 + 237 + That said, samples/bpf/ may be a good place for people to get started, 238 + so it might be advisable that simple demos of features could go into 239 + samples/bpf/, but advanced functional and corner-case testing rather 240 + into kernel selftests. 241 + 242 + If your sample looks like a test case, then go for BPF kernel selftests 243 + instead! 244 + 245 + Q: When should I add code to the bpftool? 246 + 247 + A: The main purpose of bpftool (under tools/bpf/bpftool/) is to provide 248 + a central user space tool for debugging and introspection of BPF programs 249 + and maps that are active in the kernel. If UAPI changes related to BPF 250 + enable for dumping additional information of programs or maps, then 251 + bpftool should be extended as well to support dumping them. 252 + 253 + Q: When should I add code to iproute2's BPF loader? 254 + 255 + A: For UAPI changes related to the XDP or tc layer (e.g. cls_bpf), the 256 + convention is that those control-path related changes are added to 257 + iproute2's BPF loader as well from user space side. This is not only 258 + useful to have UAPI changes properly designed to be usable, but also 259 + to make those changes available to a wider user base of major 260 + downstream distributions. 261 + 262 + Q: Do you accept patches as well for iproute2's BPF loader? 263 + 264 + A: Patches for the iproute2's BPF loader have to be sent to: 265 + 266 + netdev@vger.kernel.org 267 + 268 + While those patches are not processed by the BPF kernel maintainers, 269 + please keep them in Cc as well, so they can be reviewed. 270 + 271 + The official git repository for iproute2 is run by Stephen Hemminger 272 + and can be found at: 273 + 274 + https://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git/ 275 + 276 + The patches need to have a subject prefix of '[PATCH iproute2 master]' 277 + or '[PATCH iproute2 net-next]'. 'master' or 'net-next' describes the 278 + target branch where the patch should be applied to. Meaning, if kernel 279 + changes went into the net-next kernel tree, then the related iproute2 280 + changes need to go into the iproute2 net-next branch, otherwise they 281 + can be targeted at master branch. The iproute2 net-next branch will get 282 + merged into the master branch after the current iproute2 version from 283 + master has been released. 284 + 285 + Like BPF, the patches end up in patchwork under the netdev project and 286 + are delegated to 'shemminger' for further processing: 287 + 288 + http://patchwork.ozlabs.org/project/netdev/list/?delegate=389 289 + 290 + Q: What is the minimum requirement before I submit my BPF patches? 291 + 292 + A: When submitting patches, always take the time and properly test your 293 + patches *prior* to submission. Never rush them! If maintainers find 294 + that your patches have not been properly tested, it is a good way to 295 + get them grumpy. Testing patch submissions is a hard requirement! 296 + 297 + Note, fixes that go to bpf tree *must* have a Fixes: tag included. The 298 + same applies to fixes that target bpf-next, where the affected commit 299 + is in net-next (or in some cases bpf-next). The Fixes: tag is crucial 300 + in order to identify follow-up commits and tremendously helps for people 301 + having to do backporting, so it is a must have! 302 + 303 + We also don't accept patches with an empty commit message. Take your 304 + time and properly write up a high quality commit message, it is 305 + essential! 306 + 307 + Think about it this way: other developers looking at your code a month 308 + from now need to understand *why* a certain change has been done that 309 + way, and whether there have been flaws in the analysis or assumptions 310 + that the original author did. Thus providing a proper rationale and 311 + describing the use-case for the changes is a must. 312 + 313 + Patch submissions with >1 patch must have a cover letter which includes 314 + a high level description of the series. This high level summary will 315 + then be placed into the merge commit by the BPF maintainers such that 316 + it is also accessible from the git log for future reference. 317 + 318 + Q: What do I need to consider when adding a new instruction or feature 319 + that would require BPF JIT and/or LLVM integration as well? 320 + 321 + A: We try hard to keep all BPF JITs up to date such that the same user 322 + experience can be guaranteed when running BPF programs on different 323 + architectures without having the program punt to the less efficient 324 + interpreter in case the in-kernel BPF JIT is enabled. 325 + 326 + If you are unable to implement or test the required JIT changes for 327 + certain architectures, please work together with the related BPF JIT 328 + developers in order to get the feature implemented in a timely manner. 329 + Please refer to the git log (arch/*/net/) to locate the necessary 330 + people for helping out. 331 + 332 + Also always make sure to add BPF test cases (e.g. test_bpf.c and 333 + test_verifier.c) for new instructions, so that they can receive 334 + broad test coverage and help run-time testing the various BPF JITs. 335 + 336 + In case of new BPF instructions, once the changes have been accepted 337 + into the Linux kernel, please implement support into LLVM's BPF back 338 + end. See LLVM section below for further information. 339 + 340 + Stable submission: 341 + ------------------ 342 + 343 + Q: I need a specific BPF commit in stable kernels. What should I do? 344 + 345 + A: In case you need a specific fix in stable kernels, first check whether 346 + the commit has already been applied in the related linux-*.y branches: 347 + 348 + https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/ 349 + 350 + If not the case, then drop an email to the BPF maintainers with the 351 + netdev kernel mailing list in Cc and ask for the fix to be queued up: 352 + 353 + netdev@vger.kernel.org 354 + 355 + The process in general is the same as on netdev itself, see also the 356 + netdev FAQ document. 357 + 358 + Q: Do you also backport to kernels not currently maintained as stable? 359 + 360 + A: No. If you need a specific BPF commit in kernels that are currently not 361 + maintained by the stable maintainers, then you are on your own. 362 + 363 + The current stable and longterm stable kernels are all listed here: 364 + 365 + https://www.kernel.org/ 366 + 367 + Q: The BPF patch I am about to submit needs to go to stable as well. What 368 + should I do? 369 + 370 + A: The same rules apply as with netdev patch submissions in general, see 371 + netdev FAQ under: 372 + 373 + Documentation/networking/netdev-FAQ.txt 374 + 375 + Never add "Cc: stable@vger.kernel.org" to the patch description, but 376 + ask the BPF maintainers to queue the patches instead. This can be done 377 + with a note, for example, under the "---" part of the patch which does 378 + not go into the git log. Alternatively, this can be done as a simple 379 + request by mail instead. 380 + 381 + Q: Where do I find currently queued BPF patches that will be submitted 382 + to stable? 383 + 384 + A: Once patches that fix critical bugs got applied into the bpf tree, they 385 + are queued up for stable submission under: 386 + 387 + http://patchwork.ozlabs.org/bundle/bpf/stable/?state=* 388 + 389 + They will be on hold there at minimum until the related commit made its 390 + way into the mainline kernel tree. 391 + 392 + After having been under broader exposure, the queued patches will be 393 + submitted by the BPF maintainers to the stable maintainers. 394 + 395 + Testing patches: 396 + ---------------- 397 + 398 + Q: Which BPF kernel selftests version should I run my kernel against? 399 + 400 + A: If you run a kernel xyz, then always run the BPF kernel selftests from 401 + that kernel xyz as well. Do not expect that the BPF selftest from the 402 + latest mainline tree will pass all the time. 403 + 404 + In particular, test_bpf.c and test_verifier.c have a large number of 405 + test cases and are constantly updated with new BPF test sequences, or 406 + existing ones are adapted to verifier changes e.g. due to verifier 407 + becoming smarter and being able to better track certain things. 408 + 409 + LLVM: 410 + ----- 411 + 412 + Q: Where do I find LLVM with BPF support? 413 + 414 + A: The BPF back end for LLVM is upstream in LLVM since version 3.7.1. 415 + 416 + All major distributions these days ship LLVM with BPF back end enabled, 417 + so for the majority of use-cases it is not required to compile LLVM by 418 + hand anymore, just install the distribution provided package. 419 + 420 + LLVM's static compiler lists the supported targets through 'llc --version', 421 + make sure BPF targets are listed. Example: 422 + 423 + $ llc --version 424 + LLVM (http://llvm.org/): 425 + LLVM version 6.0.0svn 426 + Optimized build. 427 + Default target: x86_64-unknown-linux-gnu 428 + Host CPU: skylake 429 + 430 + Registered Targets: 431 + bpf - BPF (host endian) 432 + bpfeb - BPF (big endian) 433 + bpfel - BPF (little endian) 434 + x86 - 32-bit X86: Pentium-Pro and above 435 + x86-64 - 64-bit X86: EM64T and AMD64 436 + 437 + For developers in order to utilize the latest features added to LLVM's 438 + BPF back end, it is advisable to run the latest LLVM releases. Support 439 + for new BPF kernel features such as additions to the BPF instruction 440 + set are often developed together. 441 + 442 + All LLVM releases can be found at: http://releases.llvm.org/ 443 + 444 + Q: Got it, so how do I build LLVM manually anyway? 445 + 446 + A: You need cmake and gcc-c++ as build requisites for LLVM. Once you have 447 + that set up, proceed with building the latest LLVM and clang version 448 + from the git repositories: 449 + 450 + $ git clone http://llvm.org/git/llvm.git 451 + $ cd llvm/tools 452 + $ git clone --depth 1 http://llvm.org/git/clang.git 453 + $ cd ..; mkdir build; cd build 454 + $ cmake .. -DLLVM_TARGETS_TO_BUILD="BPF;X86" \ 455 + -DBUILD_SHARED_LIBS=OFF \ 456 + -DCMAKE_BUILD_TYPE=Release \ 457 + -DLLVM_BUILD_RUNTIME=OFF 458 + $ make -j $(getconf _NPROCESSORS_ONLN) 459 + 460 + The built binaries can then be found in the build/bin/ directory, where 461 + you can point the PATH variable to. 462 + 463 + Q: Should I notify BPF kernel maintainers about issues in LLVM's BPF code 464 + generation back end or about LLVM generated code that the verifier 465 + refuses to accept? 466 + 467 + A: Yes, please do! LLVM's BPF back end is a key piece of the whole BPF 468 + infrastructure and it ties deeply into verification of programs from the 469 + kernel side. Therefore, any issues on either side need to be investigated 470 + and fixed whenever necessary. 471 + 472 + Therefore, please make sure to bring them up at netdev kernel mailing 473 + list and Cc BPF maintainers for LLVM and kernel bits: 474 + 475 + Yonghong Song <yhs@fb.com> 476 + Alexei Starovoitov <ast@kernel.org> 477 + Daniel Borkmann <daniel@iogearbox.net> 478 + 479 + LLVM also has an issue tracker where BPF related bugs can be found: 480 + 481 + https://bugs.llvm.org/buglist.cgi?quicksearch=bpf 482 + 483 + However, it is better to reach out through mailing lists with having 484 + maintainers in Cc. 485 + 486 + Q: I have added a new BPF instruction to the kernel, how can I integrate 487 + it into LLVM? 488 + 489 + A: LLVM has a -mcpu selector for the BPF back end in order to allow the 490 + selection of BPF instruction set extensions. By default the 'generic' 491 + processor target is used, which is the base instruction set (v1) of BPF. 492 + 493 + LLVM has an option to select -mcpu=probe where it will probe the host 494 + kernel for supported BPF instruction set extensions and selects the 495 + optimal set automatically. 496 + 497 + For cross-compilation, a specific version can be select manually as well. 498 + 499 + $ llc -march bpf -mcpu=help 500 + Available CPUs for this target: 501 + 502 + generic - Select the generic processor. 503 + probe - Select the probe processor. 504 + v1 - Select the v1 processor. 505 + v2 - Select the v2 processor. 506 + [...] 507 + 508 + Newly added BPF instructions to the Linux kernel need to follow the same 509 + scheme, bump the instruction set version and implement probing for the 510 + extensions such that -mcpu=probe users can benefit from the optimization 511 + transparently when upgrading their kernels. 512 + 513 + If you are unable to implement support for the newly added BPF instruction 514 + please reach out to BPF developers for help. 515 + 516 + By the way, the BPF kernel selftests run with -mcpu=probe for better 517 + test coverage. 518 + 519 + Happy BPF hacking!
+4
MAINTAINERS
··· 2724 2724 M: Daniel Borkmann <daniel@iogearbox.net> 2725 2725 L: netdev@vger.kernel.org 2726 2726 L: linux-kernel@vger.kernel.org 2727 + T: git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git 2728 + T: git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git 2727 2729 S: Supported 2728 2730 F: arch/x86/net/bpf_jit* 2729 2731 F: Documentation/networking/filter.txt 2730 2732 F: Documentation/bpf/ 2731 2733 F: include/linux/bpf* 2732 2734 F: include/linux/filter.h 2735 + F: include/trace/events/bpf.h 2736 + F: include/trace/events/xdp.h 2733 2737 F: include/uapi/linux/bpf* 2734 2738 F: include/uapi/linux/filter.h 2735 2739 F: kernel/bpf/
+1
include/linux/filter.h
··· 985 985 u32 reply; 986 986 u32 replylong[4]; 987 987 }; 988 + u32 is_fullsock; 988 989 }; 989 990 990 991 #endif /* __LINUX_FILTER_H__ */
+5 -3
include/net/tcp.h
··· 2011 2011 struct bpf_sock_ops_kern sock_ops; 2012 2012 int ret; 2013 2013 2014 - if (sk_fullsock(sk)) 2015 - sock_owned_by_me(sk); 2016 - 2017 2014 memset(&sock_ops, 0, sizeof(sock_ops)); 2015 + if (sk_fullsock(sk)) { 2016 + sock_ops.is_fullsock = 1; 2017 + sock_owned_by_me(sk); 2018 + } 2019 + 2018 2020 sock_ops.sk = sk; 2019 2021 sock_ops.op = op; 2020 2022
+6
include/uapi/linux/bpf.h
··· 941 941 __u32 local_ip6[4]; /* Stored in network byte order */ 942 942 __u32 remote_port; /* Stored in network byte order */ 943 943 __u32 local_port; /* stored in host byte order */ 944 + __u32 is_fullsock; /* Some TCP fields are only valid if 945 + * there is a full socket. If not, the 946 + * fields read as zero. 947 + */ 948 + __u32 snd_cwnd; 949 + __u32 srtt_us; /* Averaged RTT << 3 in usecs */ 944 950 }; 945 951 946 952 /* List of known BPF sock_ops operators.
+38 -3
net/core/filter.c
··· 3013 3013 info->key.tun_flags = TUNNEL_KEY | TUNNEL_CSUM | TUNNEL_NOCACHE; 3014 3014 if (flags & BPF_F_DONT_FRAGMENT) 3015 3015 info->key.tun_flags |= TUNNEL_DONT_FRAGMENT; 3016 + if (flags & BPF_F_ZERO_CSUM_TX) 3017 + info->key.tun_flags &= ~TUNNEL_CSUM; 3016 3018 3017 3019 info->key.tun_id = cpu_to_be64(from->tunnel_id); 3018 3020 info->key.tos = from->tunnel_tos; ··· 3029 3027 } else { 3030 3028 info->key.u.ipv4.dst = cpu_to_be32(from->remote_ipv4); 3031 3029 } 3032 - 3033 - if (flags & BPF_F_ZERO_CSUM_TX) 3034 - info->key.tun_flags &= ~TUNNEL_CSUM; 3035 3030 3036 3031 return 0; 3037 3032 } ··· 4436 4437 offsetof(struct bpf_sock_ops_kern, sk)); 4437 4438 *insn++ = BPF_LDX_MEM(BPF_H, si->dst_reg, si->dst_reg, 4438 4439 offsetof(struct sock_common, skc_num)); 4440 + break; 4441 + 4442 + case offsetof(struct bpf_sock_ops, is_fullsock): 4443 + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( 4444 + struct bpf_sock_ops_kern, 4445 + is_fullsock), 4446 + si->dst_reg, si->src_reg, 4447 + offsetof(struct bpf_sock_ops_kern, 4448 + is_fullsock)); 4449 + break; 4450 + 4451 + /* Helper macro for adding read access to tcp_sock fields. */ 4452 + #define SOCK_OPS_GET_TCP32(FIELD_NAME) \ 4453 + do { \ 4454 + BUILD_BUG_ON(FIELD_SIZEOF(struct tcp_sock, FIELD_NAME) != 4); \ 4455 + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( \ 4456 + struct bpf_sock_ops_kern, \ 4457 + is_fullsock), \ 4458 + si->dst_reg, si->src_reg, \ 4459 + offsetof(struct bpf_sock_ops_kern, \ 4460 + is_fullsock)); \ 4461 + *insn++ = BPF_JMP_IMM(BPF_JEQ, si->dst_reg, 0, 2); \ 4462 + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( \ 4463 + struct bpf_sock_ops_kern, sk),\ 4464 + si->dst_reg, si->src_reg, \ 4465 + offsetof(struct bpf_sock_ops_kern, sk));\ 4466 + *insn++ = BPF_LDX_MEM(BPF_W, si->dst_reg, si->dst_reg, \ 4467 + offsetof(struct tcp_sock, FIELD_NAME)); \ 4468 + } while (0) 4469 + 4470 + case offsetof(struct bpf_sock_ops, snd_cwnd): 4471 + SOCK_OPS_GET_TCP32(snd_cwnd); 4472 + break; 4473 + 4474 + case offsetof(struct bpf_sock_ops, srtt_us): 4475 + SOCK_OPS_GET_TCP32(srtt_us); 4439 4476 break; 4440 4477 } 4441 4478 return insn - insn_buf;