summaryrefslogtreecommitdiffstats
path: root/sys/net/if_vlan.c
Commit message (Collapse)AuthorAgeFilesLines
...
* Let vlan_ioctl() pass some work on to ether_ioctl()yar2007-03-141-25/+1
| | | | and so reduce code duplication a bit.
* Emit load and unload messages under bootverbose.yar2007-03-121-0/+11
| | | | | | | This can help to spot bugs (which it did for me,) and let people know which mode the vlan module is actually using if they suspect it isn't picking its options from the main kernel config file.
* Fix some minor issues in the internal vlan lists:yar2007-03-121-20/+6
| | | | | | | | | | | | | | | | - ifv_list member of struct ifvlan is unneeded in array mode, it's used only in hash mode to resolve hash collisions. - We don't need the list of trunks at all. (The initial reason for having it was to be able to destroy all trunks in the MOD_UNLOAD handler, but a trunk is not to be destroyed forcibly -- it will go away when all vlan interfaces on it have been deleted. Note that if_clone_detach() called first of all under MOD_UNLOAD will delete all vlan interfaces and thus make all trunks go away quietly.) - It's enough to use a single [S]LIST_FIRST() in a typical list destruction loop.
* - Don't defer the removal of an 802.1q header for no real reason.yar2006-12-301-25/+16
| | | | | | - Micro-optimize the addition of an 802.1q header to match the removal code. - Consistently check for interfaces being up and running. - Consistently use NULL instead of 0 with pointers.
* - Update the baudrate every time the parent changes its link state.glebius2006-10-111-3/+4
| | | | | - Rearrange the curly braces so that this piece of code is more readable.
* Move ethernet VLAN tags from mtags to its own mbuf packet header fieldandre2006-09-171-17/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | m_pkthdr.ether_vlan. The presence of the M_VLANTAG flag on the mbuf signifies the presence and validity of its content. Drivers that support hardware VLAN tag stripping fill in the received VLAN tag (containing both vlan and priority information) into the ether_vtag mbuf packet header field: m->m_pkthdr.ether_vtag = vlan_id; /* ntohs()? */ m->m_flags |= M_VLANTAG; to mark the packet m with the specified VLAN tag. On output the driver should check the mbuf for the M_VLANTAG flag to see if a VLAN tag is present and valid: if (m->m_flags & M_VLANTAG) { ... = m->m_pkthdr.ether_vtag; /* htons()? */ ... pass tag to hardware ... } VLAN tags are stored in host byte order. Byte swapping may be necessary. (Note: This driver conversion was mechanic and did not add or remove any byte swapping in the drivers.) Remove zone_mtag_vlan UMA zone and MTAG_VLAN definition. No more tag memory allocation have to be done. Reviewed by: thompsa, yar Sponsored by: TCP/IP Optimization Fundraise 2005
* Fix spelling.thompsa2006-08-251-1/+1
|
* This XXX remark was rendered false by rev. 103, which made theyar2006-08-151-1/+0
| | | | VLAN_ARRAY case subject to rw locking, too.
* Make it a tad easier to base other encapsulation schemes on this driveryar2006-08-151-5/+4
| | | | | | by restoring the ifv_proto field in the vlan softc and putting it to use this time. It's a good companion for ifv_encaplen, which has already been used throughout this driver.
* Set IFF_DRV_RUNNING on vlan(4) once in vlan_config(),yar2006-08-151-2/+3
| | | | | | not at many places after each call to vlan_config(). This is consistent with IFF_DRV_RUNNING being unset in vlan_unconfig().
* Optionally pad outgoing frames to the minimum of 60 bytes (excl. FCS)yar2006-08-111-0/+33
| | | | | | | | | | before tagging them. This can help to work around brain-damage in some switches that fail to pad a frame after untagging it if its length drops below the minimum. This option is blessed by IEEE Std 802.1Q (2003 Ed.), paragraph C.4.4.3.b. It's controlled by sysctl net.link.vlan.soft_pad. Idea by: az MFC after: 1 week
* Should vlan_input() ever be called with ifp pointing to a non-Ethernetyar2006-08-031-4/+5
| | | | | | | | | | | | | interface, do not just assign -1 to tag because it breaks the logic of the code to follow. The better way is to handle this case as an unsupported protocol and return unless INVARIANTS is in effect and we can panic. Panic is good there because the scenario can happen only because of a coding error elsewhere. We also should show the interface name in the panic message for easier debugging of the problem, should it ever emerge. Submitted by: qingli (initially)
* Back out rev. 1.107 because it introduced as many problemsyar2006-08-031-9/+15
| | | | | | | | | | | | | | as it tried to solve: - it smuggled hidden 802.1q details into otherwise protocol-neutral code; - it put an important code consistency check under DEBUG, which was never defined by anyone but a developer hacking this file for the moment; - lastly, the former bcopy() call had been correct as long as the "dead" code was there. (A new version of the fix for tag of -1 to come in the next commit.) Agreed by: qingli
* In vlan_input(), if the network interface does not perform h/w basedqingli2006-08-011-15/+9
| | | | | | | | | | | | | vlan tag processing, the code will use bcopy() to remove the vlan tag field but the code copies 2 bytes too many, which essentially overwrites the protocol type field. Also, a tag value of -1 is generated for unrecognized interface type, which would cause an invalid memory access in the vlans[] array. In addition, removed a line of dead code and its associated comments. Reviewed by: sam
* Revise network interface cloning to take an optional opaquesam2006-07-091-3/+33
| | | | | | | | | parameter that can specify configuration parameters: o rev cloner api's to add optional parameter block o add SIOCCREATE2 that accepts parameter data o rev vlan support to use new api (maintain old code) Reviewed by: arch@
* Detach the interface first, do vlan_unconfig() then.yar2006-06-291-9/+3
| | | | | | | | | | | | | | | Previously, another thread could get a pointer to the interface by scanning the system-wide list and sleep on the global vlan mutex held by vlan_unconfig(). The interface was gone by the time the other thread woke up. In order to be able to call vlan_unconfig() on a detached interface, remove the purely cosmetic bzero'ing of IF_LLADDR from the function because a detached interface has no addresses. Noticed by: a stress-testing script by maxim Reviewed by: glebius
* Remove a few unused things.yar2006-06-291-12/+8
| | | | Fix some style and consistency points.
* Fix the VLAN_ARRAY case, mostly regarding improper use of atomic(9)yar2006-06-211-30/+16
| | | | | in place of conventional rw locking. Alas, atomic(9) can't buy us lockless operation so easily.
* Track interface department events and detach vlans fromyar2006-06-211-8/+76
| | | | | | | | | departing trunk so that we don't get into trouble later by dereferencing a stale pointer to dead trunk's things. Prodded by: oleg Sponsored by: RiNet (Cronyx Plus LLC) MFC after: 1 week
* Don't acquire a lock before calling vlan_unconfig().ru2006-03-091-2/+0
| | | | | | This fixes a panic when doing "ifconfig ... -vlandev". OK'ed by: glebius
* Don't to forget to unlock the rwlock on trunk before destroying it.yar2006-02-241-2/+3
| | | | | | This should fix panic on "kldunload if_vlan" while vlanX are still there. Reviewed by: glebius
* Bump the MODULE_VERSION for HEAD, as the vlan(4) API is different inemaste2006-02-101-1/+1
| | | | | | | RELENG_6, and would require a lower version number. Requested by: glebius Approved by: rwatson (mentor)
* Avoid frobbing IFF_UP at any cost (which is close toyar2006-02-101-2/+0
| | | | | | | | zero in this case.) A kernel driver has IFF_DRV_RUNNING at its full disposal while IFF_UP may be toggled only by humans or their daemonic deputies from the userland. MFC after: 3 days
* Add a MODULE_VERSION so that other modules (perhaps third-party) canemaste2006-02-091-0/+1
| | | | | | depend on this one. Approved by: rwatson (mentor)
* In vlan_config() first call vlan_inithash(), then lock mutex, becauseglebius2006-02-021-4/+6
| | | | vlan_inithash() calls malloc(M_WAITOK).
* Set IFF_BROADCAST and IFF_MULTICAST on vlan interfaces from theyar2006-01-311-2/+5
| | | | | | | | | | | | | | | | | | beginning and simply refuse to attach to a parent without either flag. Our network stack cannot handle well IFF_BROADCAST or IFF_MULTICAST on an interface changing on the fly. E.g., IP will or won't assign a broadcast address to an interface and join the all-hosts multicast group on it depending on its IFF_BROADCAST and IFF_MULTICAST settings. Should the flags alter later, IP will miss the change and keep using bogus settings. This can lead to evil things like supplying an invalid broadcast address or trying to leave a multicast group that hasn't been joined. So just avoid touching the flags since an interface was created. This has no practical purpose. Discussed with: -net, glebius, oleg MFC after: 1 week
* Merge the //depot/user/yar/vlan branch into CVS. It contains some collectiveglebius2006-01-301-120/+463
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | work by yar, thompsa and myself. The checksum offloading part also involves work done by Mihail Balikov. The most important changes: o Instead of global linked list of all vlan softc use a per-trunk hash. The size of hash is dynamically adjusted, depending on number of entries. This changes struct ifnet, replacing counter of vlans with a pointer to trunk structure. This change is an improvement for setups with big number of VLANs, several interfaces and several CPUs. It is a small regression for a setup with a single VLAN interface. An alternative to dynamic hash is a per-trunk static array with 4096 entries, which is a compile time option - VLAN_ARRAY. In my experiments the array is not an improvement, probably because such a big trunk structure doesn't fit into CPU cache. o Introduce an UMA zone for VLAN tags. Since drivers depend on it, the zone is declared in kern_mbuf.c, not in optional vlan(4) driver. This change is a big improvement for any setup utilizing vlan(4). o Use rwlock(9) instead of mutex(9) for locking. We are the first ones to do this! :) o Some drivers can do hardware VLAN tagging + hardware checksum offloading. Add an infrastructure for this. Whenever vlan(4) is attached to a parent or parent configuration is changed, the flags on vlan(4) interface are updated. In collaboration with: yar, thompsa In collaboration with: Mihail Balikov <mihail.balikov interbgc.com>
* Take if_baudrate from the parent. This fixes problem with SNMPglebius2005-11-281-0/+1
| | | | daemons reporting zero speed for vlan(4) interfaces.
* - Store pointer to the link-level address right in "struct ifnet"ru2005-11-111-1/+1
| | | | | | | | | | rather than in ifindex_table[]; all (except one) accesses are through ifp anyway. IF_LLADDR() works faster, and all (except one) ifaddr_byindex() users were converted to use ifp->if_addr. - Stop storing a (pointer to) Ethernet address in "struct arpcom", and drop the IFP2ENADDR() macro; all users have been converted to use IF_LLADDR() instead.
* - Make IFP2ENADDR() a pointer to IF_LLADDR() rather than anotherru2005-11-111-18/+2
| | | | | | | | copy of Ethernet address. - Change iso88025_ifattach() and fddi_ifattach() to accept MAC address as an argument, similar to ether_ifattach(), to make this work.
* Move the cloned interface list management in to if_clone. For some drivers thethompsa2005-11-081-3/+0
| | | | | | | | | | softc lists and associated mutex are now unused so these have been removed. Calling if_clone_detach() will now destroy all the cloned interfaces for the driver and in most cases is all thats needed to unload. Idea by: brooks Reviewed by: brooks
* - Do not raise IFF_DRV_OACTIVE flag in vlan_start, because thisglebius2005-11-061-2/+8
| | | | | | | can lead to stalled interface - Explain this fact in a comment. Reviewed by: rwatson, thompsa, yar
* Improve handling flags that must be propagatedyar2005-10-031-37/+84
| | | | | | | | | | to the parent interface, such as IFF_PROMISC and IFF_ALLMULTI. In addition, vlan(4) gains ability to migrate from one parent to another w/o losing its own flags. PR: kern/81978 MFC after: 2 weeks
* The arguments to printf() were swapped.ru2005-09-161-2/+2
|
* Do assorted nitpicking in diagnostics while I'm here:yar2005-09-161-9/+9
| | | | | | - Use __func__ consistently instead of copying function name to message strings. Code tends to migrate around source files. - DIAGNOSTIC is for information, INVARIANTS is for panics.
* It's nice to have relevant comments both in if {} and else {},yar2005-09-161-1/+4
| | | | not in just one of them.
* Test the new M_VLANTAG packet flag before callingyar2005-09-161-2/+5
| | | | | | | | | | m_tag_locate(). This adds little overhead of a simple bitwise operation in case hardware VLAN acceleration is on, yet saves the more expensive function call if the acceleration is off. Reviewed by: ru, glebius X-MFC-after: 6.0
* Use VLAN_TAG_VALUE() not only to read a dot1q tagyar2005-08-311-1/+1
| | | | | | | | | | | | | value from an m_tag, but also to set it. This reduces complex code duplication and improves its readability. Alas, we shouldn't rename the macro to VLAN_TAG_LVALUE() globally because that would cause pain for kernel module port maintainers and vendors using FreeBSD as their codebase. Added a clarifying comment instead. Discussed with: ru, glebius X-MFC-After: 6.0-RELEASE (MFC is good just to reduce the diff)
* Fix fallout from revision 1.77, mark outgoing packets with M_VLANTAG flag.glebius2005-08-301-0/+1
| | | | | | PR: kern/80646 Reviewed by: yar MFC after: 3 days
* Vlan interfaces change their type after ether_ifattach() so we needs tobrooks2005-08-151-1/+1
| | | | | | | | use if_free_type(ifp, IFT_ETHER) to delete them and stop leaking struct arpcoms. Reported by: thompsa MFC After: 3 days
* Propagate rename of IFF_OACTIVE and IFF_RUNNING to IFF_DRV_OACTIVE andrwatson2005-08-091-7/+7
| | | | | | | | | | | | | | IFF_DRV_RUNNING, as well as the move from ifnet.if_flags to ifnet.if_drv_flags. Device drivers are now responsible for synchronizing access to these flags, as they are in if_drv_flags. This helps prevent races between the network stack and device driver in maintaining the interface flags field. Many __FreeBSD__ and __FreeBSD_version checks maintained and continued; some less so. Reviewed by: pjd, bz MFC after: 7 days
* Stop embedding struct ifnet at the top of driver softcs. Instead thebrooks2005-06-101-23/+30
| | | | | | | | | | | | | | | | | | | | struct ifnet or the layer 2 common structure it was embedded in have been replaced with a struct ifnet pointer to be filled by a call to the new function, if_alloc(). The layer 2 common structure is also allocated via if_alloc() based on the interface type. It is hung off the new struct ifnet member, if_l2com. This change removes the size of these structures from the kernel ABI and will allow us to better manage them as interfaces come and go. Other changes of note: - Struct arpcom is no longer referenced in normal interface code. Instead the Ethernet address is accessed via the IFP2ENADDR() macro. To enforce this ac_enaddr has been renamed to _ac_enaddr. - The second argument to ether_ifattach is now always the mac address from driver private storage rather than sometimes being ac_enaddr. Reviewed by: sobomax, sam
* - Call if_link_state_change() for each vlan, when link changesglebius2005-04-201-7/+4
| | | | | | | | | on parent. - Remove route.h include. - Fix comment about MII. Sponsored by: Rambler Reviewed by: yar
* Allocate the M_VLANTAG m_pkthdr flag, and use it to indicate thatru2005-02-181-0/+1
| | | | | | | | | | | | | | | | a packet has VLAN mbuf tag attached. This is faster to check than m_tag_locate(), and allows us to use the tags in non-vlan(4) VLAN producers. The first argument to VLAN_OUTPUT_TAG() is now unused but retained for backward compatibility. While here, embellish a fix in rev. 1.174 of if_ethersubr.c -- it now checks for packets with VLAN (mbuf) tags, and it should now be possible to bridge(4) on vlan(4)'s whose parent interfaces support VLAN decapsulation in hardware. Reviewed by: sam
* Fix spelling in a comment.yar2005-01-241-1/+1
|
* Reduce the global name space pollution.yar2005-01-231-2/+2
| | | | The cloner structure isn't referenced by name outside this file.
* /* -> /*- for license, minor formatting changesimp2005-01-071-1/+1
|
* Add locking to the kqueue subsystem. This also makes the kqueue subsystemjmg2004-08-151-1/+1
| | | | | | | | | | | | | a more complete subsystem, and removes the knowlege of how things are implemented from the drivers. Include locking around filter ops, so a module like aio will know when not to be unloaded if there are outstanding knotes using it's filter ops. Currently, it uses the MTX_DUPOK even though it is not always safe to aquire duplicate locks. Witness currently doesn't support the ability to discover if a dup lock is ok (in some cases). Reviewed by: green, rwatson (both earlier versions)
* Stop tinkering with the parent's VLAN_MTU capability.yar2004-07-261-27/+7
| | | | | | | | | | | | | | | | | | Now it is user-controlled through ifconfig(8). The former ``automagic'' way of operation created more trouble than good. First, VLAN_MTU consumers other than vlan(4) had appeared, e.g., ng_vlan(4). Second, there was no way to disable VLAN_MTU manually if it were causing trouble, e.g., data corruption. Dropping the ``automagic'' should be completely invisible to the user since a) all the drivers supporting VLAN_MTU have it enabled by default, and in the first place b) there is only one driver that can really toggle VLAN_MTU in the hardware under its control (it's fxp(4), to which I added VLAN_MTU controls to illustrate the principle.)
* Actually free the unit when destroying the interface.brooks2004-07-221-0/+5
| | | | | | Reported by: la at delfi.lt Tested by: la at delfi.lt PR: 68618
OpenPOWER on IntegriCloud