mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	 b24413180f
			
		
	
	
		b24413180f
		
	
	
	
	
		
			
			Many source files in the tree are missing licensing information, which makes it harder for compliance tools to determine the correct license. By default all files without license information are under the default license of the kernel, which is GPL version 2. Update the files which contain no license information with the 'GPL-2.0' SPDX license identifier. The SPDX identifier is a legally binding shorthand, which can be used instead of the full boiler plate text. This patch is based on work done by Thomas Gleixner and Kate Stewart and Philippe Ombredanne. How this work was done: Patches were generated and checked against linux-4.14-rc6 for a subset of the use cases: - file had no licensing information it it. - file was a */uapi/* one with no licensing information in it, - file was a */uapi/* one with existing licensing information, Further patches will be generated in subsequent months to fix up cases where non-standard license headers were used, and references to license had to be inferred by heuristics based on keywords. The analysis to determine which SPDX License Identifier to be applied to a file was done in a spreadsheet of side by side results from of the output of two independent scanners (ScanCode & Windriver) producing SPDX tag:value files created by Philippe Ombredanne. Philippe prepared the base worksheet, and did an initial spot review of a few 1000 files. The 4.13 kernel was the starting point of the analysis with 60,537 files assessed. Kate Stewart did a file by file comparison of the scanner results in the spreadsheet to determine which SPDX license identifier(s) to be applied to the file. She confirmed any determination that was not immediately clear with lawyers working with the Linux Foundation. Criteria used to select files for SPDX license identifier tagging was: - Files considered eligible had to be source code files. - Make and config files were included as candidates if they contained >5 lines of source - File already had some variant of a license header in it (even if <5 lines). All documentation files were explicitly excluded. The following heuristics were used to determine which SPDX license identifiers to apply. - when both scanners couldn't find any license traces, file was considered to have no license information in it, and the top level COPYING file license applied. For non */uapi/* files that summary was: SPDX license identifier # files ---------------------------------------------------|------- GPL-2.0 11139 and resulted in the first patch in this series. If that file was a */uapi/* path one, it was "GPL-2.0 WITH Linux-syscall-note" otherwise it was "GPL-2.0". Results of that was: SPDX license identifier # files ---------------------------------------------------|------- GPL-2.0 WITH Linux-syscall-note 930 and resulted in the second patch in this series. - if a file had some form of licensing information in it, and was one of the */uapi/* ones, it was denoted with the Linux-syscall-note if any GPL family license was found in the file or had no licensing in it (per prior point). Results summary: SPDX license identifier # files ---------------------------------------------------|------ GPL-2.0 WITH Linux-syscall-note 270 GPL-2.0+ WITH Linux-syscall-note 169 ((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) 21 ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) 17 LGPL-2.1+ WITH Linux-syscall-note 15 GPL-1.0+ WITH Linux-syscall-note 14 ((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) 5 LGPL-2.0+ WITH Linux-syscall-note 4 LGPL-2.1 WITH Linux-syscall-note 3 ((GPL-2.0 WITH Linux-syscall-note) OR MIT) 3 ((GPL-2.0 WITH Linux-syscall-note) AND MIT) 1 and that resulted in the third patch in this series. - when the two scanners agreed on the detected license(s), that became the concluded license(s). - when there was disagreement between the two scanners (one detected a license but the other didn't, or they both detected different licenses) a manual inspection of the file occurred. - In most cases a manual inspection of the information in the file resulted in a clear resolution of the license that should apply (and which scanner probably needed to revisit its heuristics). - When it was not immediately clear, the license identifier was confirmed with lawyers working with the Linux Foundation. - If there was any question as to the appropriate license identifier, the file was flagged for further research and to be revisited later in time. In total, over 70 hours of logged manual review was done on the spreadsheet to determine the SPDX license identifiers to apply to the source files by Kate, Philippe, Thomas and, in some cases, confirmation by lawyers working with the Linux Foundation. Kate also obtained a third independent scan of the 4.13 code base from FOSSology, and compared selected files where the other two scanners disagreed against that SPDX file, to see if there was new insights. The Windriver scanner is based on an older version of FOSSology in part, so they are related. Thomas did random spot checks in about 500 files from the spreadsheets for the uapi headers and agreed with SPDX license identifier in the files he inspected. For the non-uapi files Thomas did random spot checks in about 15000 files. In initial set of patches against 4.14-rc6, 3 files were found to have copy/paste license identifier errors, and have been fixed to reflect the correct identifier. Additionally Philippe spent 10 hours this week doing a detailed manual inspection and review of the 12,461 patched files from the initial patch version early this week with: - a full scancode scan run, collecting the matched texts, detected license ids and scores - reviewing anything where there was a license detected (about 500+ files) to ensure that the applied SPDX license was correct - reviewing anything where there was no detection but the patch license was not GPL-2.0 WITH Linux-syscall-note to ensure that the applied SPDX license was correct This produced a worksheet with 20 files needing minor correction. This worksheet was then exported into 3 different .csv files for the different types of files to be modified. These .csv files were then reviewed by Greg. Thomas wrote a script to parse the csv files and add the proper SPDX tag to the file, in the format that the file expected. This script was further refined by Greg based on the output to detect more types of files automatically and to distinguish between header and source .c files (which need different comment types.) Finally Greg ran the script using the .csv files to generate the patches. Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org> Reviewed-by: Philippe Ombredanne <pombredanne@nexb.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
		
			
				
	
	
		
			161 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| #ifndef _LAPB_H
 | |
| #define _LAPB_H 
 | |
| #include <linux/lapb.h>
 | |
| #include <linux/refcount.h>
 | |
| 
 | |
| #define	LAPB_HEADER_LEN	20		/* LAPB over Ethernet + a bit more */
 | |
| 
 | |
| #define	LAPB_ACK_PENDING_CONDITION	0x01
 | |
| #define	LAPB_REJECT_CONDITION		0x02
 | |
| #define	LAPB_PEER_RX_BUSY_CONDITION	0x04
 | |
| 
 | |
| /* Control field templates */
 | |
| #define	LAPB_I		0x00	/* Information frames */
 | |
| #define	LAPB_S		0x01	/* Supervisory frames */
 | |
| #define	LAPB_U		0x03	/* Unnumbered frames */
 | |
| 
 | |
| #define	LAPB_RR		0x01	/* Receiver ready */
 | |
| #define	LAPB_RNR	0x05	/* Receiver not ready */
 | |
| #define	LAPB_REJ	0x09	/* Reject */
 | |
| 
 | |
| #define	LAPB_SABM	0x2F	/* Set Asynchronous Balanced Mode */
 | |
| #define	LAPB_SABME	0x6F	/* Set Asynchronous Balanced Mode Extended */
 | |
| #define	LAPB_DISC	0x43	/* Disconnect */
 | |
| #define	LAPB_DM		0x0F	/* Disconnected mode */
 | |
| #define	LAPB_UA		0x63	/* Unnumbered acknowledge */
 | |
| #define	LAPB_FRMR	0x87	/* Frame reject */
 | |
| 
 | |
| #define LAPB_ILLEGAL	0x100	/* Impossible to be a real frame type */
 | |
| 
 | |
| #define	LAPB_SPF	0x10	/* Poll/final bit for standard LAPB */
 | |
| #define	LAPB_EPF	0x01	/* Poll/final bit for extended LAPB */
 | |
| 
 | |
| #define	LAPB_FRMR_W	0x01	/* Control field invalid	*/
 | |
| #define	LAPB_FRMR_X	0x02	/* I field invalid		*/
 | |
| #define	LAPB_FRMR_Y	0x04	/* I field too long		*/
 | |
| #define	LAPB_FRMR_Z	0x08	/* Invalid N(R)			*/
 | |
| 
 | |
| #define	LAPB_POLLOFF	0
 | |
| #define	LAPB_POLLON	1
 | |
| 
 | |
| /* LAPB C-bit */
 | |
| #define LAPB_COMMAND	1
 | |
| #define LAPB_RESPONSE	2
 | |
| 
 | |
| #define	LAPB_ADDR_A	0x03
 | |
| #define	LAPB_ADDR_B	0x01
 | |
| #define	LAPB_ADDR_C	0x0F
 | |
| #define	LAPB_ADDR_D	0x07
 | |
| 
 | |
| /* Define Link State constants. */
 | |
| enum {
 | |
| 	LAPB_STATE_0,	/* Disconnected State		*/
 | |
| 	LAPB_STATE_1,	/* Awaiting Connection State	*/
 | |
| 	LAPB_STATE_2,	/* Awaiting Disconnection State	*/
 | |
| 	LAPB_STATE_3,	/* Data Transfer State		*/
 | |
| 	LAPB_STATE_4	/* Frame Reject State		*/
 | |
| };
 | |
| 
 | |
| #define	LAPB_DEFAULT_MODE		(LAPB_STANDARD | LAPB_SLP | LAPB_DTE)
 | |
| #define	LAPB_DEFAULT_WINDOW		7		/* Window=7 */
 | |
| #define	LAPB_DEFAULT_T1			(5 * HZ)	/* T1=5s    */
 | |
| #define	LAPB_DEFAULT_T2			(1 * HZ)	/* T2=1s    */
 | |
| #define	LAPB_DEFAULT_N2			20		/* N2=20    */
 | |
| 
 | |
| #define	LAPB_SMODULUS	8
 | |
| #define	LAPB_EMODULUS	128
 | |
| 
 | |
| /*
 | |
|  *	Information about the current frame.
 | |
|  */
 | |
| struct lapb_frame {
 | |
| 	unsigned short		type;		/* Parsed type		*/
 | |
| 	unsigned short		nr, ns;		/* N(R), N(S)		*/
 | |
| 	unsigned char		cr;		/* Command/Response	*/
 | |
| 	unsigned char		pf;		/* Poll/Final		*/
 | |
| 	unsigned char		control[2];	/* Original control data*/
 | |
| };
 | |
| 
 | |
| /*
 | |
|  *	The per LAPB connection control structure.
 | |
|  */
 | |
| struct lapb_cb {
 | |
| 	struct list_head	node;
 | |
| 	struct net_device	*dev;
 | |
| 
 | |
| 	/* Link status fields */
 | |
| 	unsigned int		mode;
 | |
| 	unsigned char		state;
 | |
| 	unsigned short		vs, vr, va;
 | |
| 	unsigned char		condition;
 | |
| 	unsigned short		n2, n2count;
 | |
| 	unsigned short		t1, t2;
 | |
| 	struct timer_list	t1timer, t2timer;
 | |
| 
 | |
| 	/* Internal control information */
 | |
| 	struct sk_buff_head	write_queue;
 | |
| 	struct sk_buff_head	ack_queue;
 | |
| 	unsigned char		window;
 | |
| 	const struct lapb_register_struct *callbacks;
 | |
| 
 | |
| 	/* FRMR control information */
 | |
| 	struct lapb_frame	frmr_data;
 | |
| 	unsigned char		frmr_type;
 | |
| 
 | |
| 	refcount_t		refcnt;
 | |
| };
 | |
| 
 | |
| /* lapb_iface.c */
 | |
| void lapb_connect_confirmation(struct lapb_cb *lapb, int);
 | |
| void lapb_connect_indication(struct lapb_cb *lapb, int);
 | |
| void lapb_disconnect_confirmation(struct lapb_cb *lapb, int);
 | |
| void lapb_disconnect_indication(struct lapb_cb *lapb, int);
 | |
| int lapb_data_indication(struct lapb_cb *lapb, struct sk_buff *);
 | |
| int lapb_data_transmit(struct lapb_cb *lapb, struct sk_buff *);
 | |
| 
 | |
| /* lapb_in.c */
 | |
| void lapb_data_input(struct lapb_cb *lapb, struct sk_buff *);
 | |
| 
 | |
| /* lapb_out.c */
 | |
| void lapb_kick(struct lapb_cb *lapb);
 | |
| void lapb_transmit_buffer(struct lapb_cb *lapb, struct sk_buff *, int);
 | |
| void lapb_establish_data_link(struct lapb_cb *lapb);
 | |
| void lapb_enquiry_response(struct lapb_cb *lapb);
 | |
| void lapb_timeout_response(struct lapb_cb *lapb);
 | |
| void lapb_check_iframes_acked(struct lapb_cb *lapb, unsigned short);
 | |
| void lapb_check_need_response(struct lapb_cb *lapb, int, int);
 | |
| 
 | |
| /* lapb_subr.c */
 | |
| void lapb_clear_queues(struct lapb_cb *lapb);
 | |
| void lapb_frames_acked(struct lapb_cb *lapb, unsigned short);
 | |
| void lapb_requeue_frames(struct lapb_cb *lapb);
 | |
| int lapb_validate_nr(struct lapb_cb *lapb, unsigned short);
 | |
| int lapb_decode(struct lapb_cb *lapb, struct sk_buff *, struct lapb_frame *);
 | |
| void lapb_send_control(struct lapb_cb *lapb, int, int, int);
 | |
| void lapb_transmit_frmr(struct lapb_cb *lapb);
 | |
| 
 | |
| /* lapb_timer.c */
 | |
| void lapb_start_t1timer(struct lapb_cb *lapb);
 | |
| void lapb_start_t2timer(struct lapb_cb *lapb);
 | |
| void lapb_stop_t1timer(struct lapb_cb *lapb);
 | |
| void lapb_stop_t2timer(struct lapb_cb *lapb);
 | |
| int lapb_t1timer_running(struct lapb_cb *lapb);
 | |
| 
 | |
| /*
 | |
|  * Debug levels.
 | |
|  *	0 = Off
 | |
|  *	1 = State Changes
 | |
|  *	2 = Packets I/O and State Changes
 | |
|  *	3 = Hex dumps, Packets I/O and State Changes.
 | |
|  */
 | |
| #define	LAPB_DEBUG	0
 | |
| 
 | |
| #define lapb_dbg(level, fmt, ...)			\
 | |
| do {							\
 | |
| 	if (level < LAPB_DEBUG)				\
 | |
| 		pr_debug(fmt, ##__VA_ARGS__);		\
 | |
| } while (0)
 | |
| 
 | |
| #endif
 |